谢谢yewuyi,终于在PICC18中调通了。(yewuyi:调通了至少也要讲讲

[复制链接]
7990|36
 楼主| eworker 发表于 2008-8-22 08:54 | 显示全部楼层 |阅读模式
我的程序中,用了大量的指针的指针作为函数的参数,很多处理都涉及到指针的移动和比较,很多代码可以编译通过,但是,实际运行结果却一沓糊涂。例如:<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的内存分页机制导致的。惨痛的是,我的程序又要重新写了。&nbsp;
lanyong 发表于 2008-8-22 09:48 | 显示全部楼层

晕,先找到原因,再下结论吧,兄弟.

  
李冬发 发表于 2008-8-22 10:20 | 显示全部楼层

picc只能使用最基础的功能,太烂的东西

  
yewuyi 发表于 2008-8-22 10:25 | 显示全部楼层

对你的问题的回答:

主要是三个原因:<br />1、你应该是在函数内部定义的局部变量,在PICC16中,所有的局部变量都被自动分配在BANK0,所以此时你即使使用BANK0、BANK1这样的定义也没用,会报错提示你:Warning[000]&nbsp;E:program&nbsp;finishingAutoCuntainkey.c&nbsp;15&nbsp;:&nbsp;auto&nbsp;variable&nbsp;ddd&nbsp;should&nbsp;not&nbsp;be&nbsp;qualified<br /><br />2、在PICC中的指针除了与标准C相同的地方外,还有几个需要特别注意的地方:<br />PIC的FSR能寻址的空间是256,一般可以两个BANK(假设1个BANK为128字节),PICC把寻址的范围指定交给了程序员自己,缺省就被定义到BANK0<br />uint8&nbsp;&nbsp;*cp;<br />bank2&nbsp;&nbsp;uint&nbsp;buff[10]={0};<br />cp=buff;<br />这样的程序肯定会报错,基本上见到fixup&nbsp;overflow&nbsp;in&nbsp;extression...则基本上就是两个不匹配造成的。<br />3、cp2&nbsp;=&nbsp;buffo&nbsp;+&nbsp;0x21u;<br />0x21u是什么东西?呵呵,俺没见过,不是笔误把?<br /><br />有关PICC的使用,可参考张明峰先生当年出的那本PIC的入门书,其实那本书写的比较全面了,注意点就那么几个,写代码的时候规避一下就OK。。。<br /><br />听说马上要出来的PIC16F1XXX系列基本上把这些问题都解决了,但还看到DATASHEET。。。<br /><br />对RAM消耗量的产品不适合使用PIC16,建议直接上PIC24
 楼主| eworker 发表于 2008-8-22 10:25 | 显示全部楼层

LS兄弟,测一下就知道了,并不是随便下的结论,都折腾我几

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 />
yewuyi 发表于 2008-8-22 10:27 | 显示全部楼层

if (cp1 < cp2){...}

这个肯定没问题的,呵呵,估计都是基本方面惹的祸
yewuyi 发表于 2008-8-22 10:28 | 显示全部楼层

我改动了一下,放到我的PIC16F913中编译通过

<br />//-----------------------------------------------------------------------------<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;key.h&quot;<br />//-----------------------------------------------------------------------------<br />extern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTEBIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag0;<br />uchar&nbsp;&nbsp;buffo[10]={0x00};<br />//-----------------------------------------------------------------------------<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keydecode(void)<br />{<br />uchar&nbsp;*cp1;<br />uchar&nbsp;*cp2;<br />cp1&nbsp;=&nbsp;buffo;<br />cp2&nbsp;=&nbsp;buffo&nbsp;+&nbsp;0x21;<br /><br />if&nbsp;(cp1&nbsp;&lt&nbsp;cp2){}<br /><br />}<br />//-----------------------------------------------------------------------------
 楼主| eworker 发表于 2008-8-22 10:32 | 显示全部楼层

to yewuyi

cp2&nbsp;=&nbsp;buffo&nbsp;+&nbsp;0x21u<br /><br />很常用的移动指针的方法,0x21u就是指针移动33个sizeof(uint8)而已。
 楼主| eworker 发表于 2008-8-22 10:37 | 显示全部楼层

to yewuyi

buffo我也是定义为全局变量的,编译也可以通过,但运行结果顶楼已经说了,一塌糊涂。
yewuyi 发表于 2008-8-22 11:17 | 显示全部楼层

cp1 < cp2

这可比较的是地址哦,比较这个干什么?
yewuyi 发表于 2008-8-22 11:24 | 显示全部楼层

~~

没发现有什么错误&nbsp;<br /><br /><br />//-----------------------------------------------------------------------------<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;key.h&quot;<br />//-----------------------------------------------------------------------------<br />extern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTEBIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag0;<br />uchar&nbsp;&nbsp;buffo[10]={0x00,0x01,0x02};<br />//-----------------------------------------------------------------------------<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keydecode(void)<br />{<br />uchar&nbsp;*cp1;<br />uchar&nbsp;*cp2;<br />cp1&nbsp;=&nbsp;buffo;<br />cp2&nbsp;=&nbsp;buffo&nbsp;+&nbsp;0x1;<br /><br />if&nbsp;(cp1&nbsp;&lt&nbsp;cp2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*cp1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*cp2=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br />//-----------------------------------------------------------------------------<br /><br />以上代码执行完毕后,buffo[0]=1,buffo[1]=0,结果正确,有什么错误?<br /><br />&nbsp;<br />&nbsp;<br />
 楼主| eworker 发表于 2008-8-22 11:30 | 显示全部楼层

我在程序中设了断点,跟踪过的

仿真时将鼠标移到cp1、cp2、buffo上面,显示cp1为0x9f,cp2为0xbc0。
yewuyi 发表于 2008-8-22 11:43 | 显示全部楼层

使用WATCH窗口设计看看变量值有没有按照你的设想变化

10楼的程序在软件仿真的时候,指针的长度被强制搞成16BIT显示,按道理实际只有8BIT才对,呵呵,这个我也不知道怎么回事情,可能是MPLAB的软件问题,但执行的结果是对的。。。
 楼主| eworker 发表于 2008-8-22 12:05 | 显示全部楼层

但现在问题的关键是执行的结果不对。

不但只是指针比较的问题,一旦调用函数指针,马上跑飞,跟踪都没法跟踪。
兰天白云 发表于 2008-8-22 13:18 | 显示全部楼层

eworker对PIC还不了解

基本型的PIC16FXXX不适合搞多数据等的处理<br />如:uint8&nbsp;buffo[100];<br />其RAM较小<br /><br />程序用你的这种写法,编译后空间上没任何优势
 楼主| eworker 发表于 2008-8-22 13:20 | 显示全部楼层

用的是pic18f97j60

  
yewuyi 发表于 2008-8-22 13:29 | 显示全部楼层

个人建议在PIC24及以上使用函数指针

在16、18上使用函数指针根本就是很痛苦的事情,呵呵,不适合使用
yewuyi 发表于 2008-8-22 13:31 | 显示全部楼层

可能马上要出的PIC16F1XXX能对函数指针支持的好些

好象取消了BANK。。。
 楼主| eworker 发表于 2008-8-22 13:32 | 显示全部楼层

问题关键

pic的ram分页,程序分段对使用指针、指针的指针、函数指针有没有影响或限制?我上面碰到的两个问题都是可以测试到的,有没有解决的办法?<br /><br />51、x86、arm7中可以平移的程序,到了pic这里要重新写,岂不悲哉。
yewuyi 发表于 2008-8-22 14:02 | 显示全部楼层

具体相关的细节可参考张明峰先生的那本书

《PIC单片机入门与实战》中第11章,里面有比较详细的讲解。<br /><br /><br />函数指针不是绝对不能用,但效率非常低,有一些限制。<br /><br />至于数据指针的定义问题,直接在书中都能找到答案。<br /><br />至于‘51、x86、arm7中可以平移的程序,到了pic这里要重新写,岂不悲哉’<br /><br />这三个都属于冯.诺依曼结构,相对来说,代码移植要容易很多,呵呵,PIC和这三家在CHIP结构上有相当大的不同,所以代码移植的工作量肯定要大很多。。。<br /><br />建议你直接使用PIC24<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

176

帖子

0

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