MCC18和PICC使用中发现的问题

[复制链接]
 楼主| eworker 发表于 2008-8-21 16:41 | 显示全部楼层 |阅读模式
pic, TI, TE, IO, App
MCC18中使用函数指针,即报错如下:<br /><br />This&nbsp;application&nbsp;has&nbsp;requested&nbsp;the&nbsp;Runtime&nbsp;to&nbsp;terminate&nbsp;it&nbsp;in&nbsp;an&nbsp;unusual&nbsp;way.<br />Please&nbsp;contact&nbsp;the&nbsp;application's&nbsp;support&nbsp;team&nbsp;for&nbsp;more&nbsp;information.<br /><br />例如:mibp-&gtget(mvp&nbsp;-&nbsp;mibp-&gtmvp,&nbsp;tabix,&nbsp;&vptr);<br /><br />PICC18中指针的地址,报错如下:expression&nbsp;syntax。例如:<br />uint8&nbsp;*cp;<br />uint&nbsp;buffo[100];<br /><br />cp&nbsp;=&nbsp;&buffo;<br /><br />哪位大侠能指点一下?
 楼主| eworker 发表于 2008-8-21 16:48 | 显示全部楼层

选用PIC,感觉就像上了贼船。

问题多多,项目完成时间一拖再拖。
yewuyi 发表于 2008-8-21 17:40 | 显示全部楼层

~~

PICC18中指针的地址,报错如下:expression&nbsp;syntax。例如:<br />uint8&nbsp;*cp;<br />uint&nbsp;buffo[100];<br />cp&nbsp;=&nbsp;&buffo;<br /><br /><br /><br />貌似没什么问题,但buffo[100]可是一个100字节的RAM开销,对于PIC来说,这个RAM开销太大了,特别是你没指定RAM的BANK,那么一般就会被自动定位到BANK0,显然在BANK0是装不下这么大的数组的,因为肯定还有别的RAM消耗,一个BANK为128字节。<br /><br />建议,留出BANK1专门给这个数组用,这样写看看能不能通过,例如:<br />bank1&nbsp;uint&nbsp;buffo[100]={0x00};<br /><br />以上全靠使用PIC16的经验,我没有实际使用过PIC18,所以只能根据直觉给你一点建议,希望能解决问题。<br /><br />呵呵,至于使用PIC是否是上了贼船,俺就不好评价了,PIC的东西与别的家是有一些不一样,特别是与过去的51等,用熟悉了也就无所谓了。。。
su_mj000 发表于 2008-8-21 23:47 | 显示全部楼层

语句有问题

cp&nbsp;=&nbsp;&buffo;<br /><br />这句语句有问题。改成<br /><br />cp&nbsp;=&nbsp;(uint8*)buffo;&nbsp;<br /><br />&nbsp;或<br /><br />char&nbsp;**cp;<br />...<br />cp&nbsp;=&nbsp;(uint8&nbsp;**)&buffo;<br /><br /><br />另:<br />100字节的RAM数组非常合理、自然。每个BANK有256字节(而非128字节),为何无法定位其中呢?我没正式地用过PICC18编译,但从各方面的意见和评论来看,它是个非常不错的工具,应该成为首选。<br /><br /><br />
 楼主| eworker 发表于 2008-8-22 08:35 | 显示全部楼层

经过修改可以编译通过了,但是...

我的程序中,用了大量的指针的指针作为函数的参数,很多处理都涉及到指针的移动和比较,上面提到的两个问题,经过修改,编译都过了,但是,实际运行结果却一沓糊涂。例如:<br />uint8&nbsp;*cp1;<br />uint8&nbsp;*cp2;<br />uint8&nbsp;buffo[100];<br /><br />cp1&nbsp;=&nbsp;buffo;<br />cp2&nbsp;=&nbsp;buffo&nbsp;+&nbsp;0x21u;<br /><br />if&nbsp;(cp1&nbsp;&lt&nbsp;cp2){...}<br /><br />以上代码在51、x86、arm7都用过,没有任何问题,但在pic中,编译可以通过,但if逻辑根本不成立,根本运行不到if里面的语句。仿真时将鼠标移到cp1、cp2、buffo上面,显示cp1为0x9f,cp2为0xbc0。<br /><br />后来反复想,可能是pic的内存分页机制导致的。惨痛的是,我的程序又要重新写了。<br /><br />后悔使用pic!!!
yewuyi 发表于 2008-8-22 08:47 | 显示全部楼层

晕,uint buffo[100]应该是200个字节

PIC上一个BANK不一定是256个字节,在PIC16上很多都是一个BANK有128个字节,我没真正用过PIC18,呵呵,我所以只能根据直觉给你一点建议。<br /><br /><br />LZ弄的uint8、uint很容易让人看晕,最好写成uchar、uint或者uint8、uint16这样便于区分,否则一走神就容易把两个看混。。。<br /><br /><br />我不知道你是怎么在51、x86、arm7编译通过的,从原则上讲,你原来即使编译通过也是有隐患的,呵呵,类型不匹配,应该强制转换一下再使用,另外这个数组大小不知道能不能在你的哪个型号上得到支持,建议你在把数组该小点看看编译结果。
machunshui 发表于 2008-8-25 16:21 | 显示全部楼层

楼主说话最好给出证据

楼主说话最好给出证据.<br /><br />即使是pic的内存分页机制导致,<br /><br />也是应该能够通过汇编以及map文件找到证据的,<br /><br />没有证据,<br /><br />可以视为瞎说.
machunshui 发表于 2008-8-25 16:48 | 显示全部楼层

实际上楼主在5楼给出的代码,我验证没有问题

实际上楼主在5楼给出的代码,我验证没有问题<br /><br />是可以进入if&nbsp;(cp1&nbsp;&lt&nbsp;cp2){...}执行体里面的.<br /><br />楼主自己不搞清楚自己的问题,就瞎指责!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

176

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部