打印

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

[复制链接]
6803|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eworker|  楼主 | 2008-8-22 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序中,用了大量的指针的指针作为函数的参数,很多处理都涉及到指针的移动和比较,很多代码可以编译通过,但是,实际运行结果却一沓糊涂。例如:
uint8 *cp1;
uint8 *cp2;
uint8 buffo[100];

cp1 = buffo;
cp2 = buffo + 0x21u;

if (cp1 < cp2){...}

以上代码在51、x86、arm7都用过,没有任何问题,但在pic中,编译可以通过,但if逻辑根本不成立,根本运行不到if里面的语句。仿真时将鼠标移到cp1、cp2、buffo上面,显示cp1为0x9f,cp2为0xbc0。

后来反复想,可能是pic的内存分页机制导致的。惨痛的是,我的程序又要重新写了。 
沙发
lanyong| | 2008-8-22 09:48 | 只看该作者

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

使用特权

评论回复
板凳
李冬发| | 2008-8-22 10:20 | 只看该作者

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

使用特权

评论回复
地板
yewuyi| | 2008-8-22 10:25 | 只看该作者

对你的问题的回答:

主要是三个原因:
1、你应该是在函数内部定义的局部变量,在PICC16中,所有的局部变量都被自动分配在BANK0,所以此时你即使使用BANK0、BANK1这样的定义也没用,会报错提示你:Warning[000] E:program finishingAutoCuntainkey.c 15 : auto variable ddd should not be qualified

2、在PICC中的指针除了与标准C相同的地方外,还有几个需要特别注意的地方:
PIC的FSR能寻址的空间是256,一般可以两个BANK(假设1个BANK为128字节),PICC把寻址的范围指定交给了程序员自己,缺省就被定义到BANK0
uint8  *cp;
bank2  uint buff[10]={0};
cp=buff;
这样的程序肯定会报错,基本上见到fixup overflow in extression...则基本上就是两个不匹配造成的。
3、cp2 = buffo + 0x21u;
0x21u是什么东西?呵呵,俺没见过,不是笔误把?

有关PICC的使用,可参考张明峰先生当年出的那本PIC的入门书,其实那本书写的比较全面了,注意点就那么几个,写代码的时候规避一下就OK。。。

听说马上要出来的PIC16F1XXX系列基本上把这些问题都解决了,但还看到DATASHEET。。。

对RAM消耗量的产品不适合使用PIC16,建议直接上PIC24

使用特权

评论回复
5
eworker|  楼主 | 2008-8-22 10:25 | 只看该作者

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

uint8 *cp1;
uint8 *cp2;
uint8 buffo[100];

cp1 = buffo;
cp2 = buffo + 0x21u;

if (cp1 < cp2){...}

使用特权

评论回复
6
yewuyi| | 2008-8-22 10:27 | 只看该作者

if (cp1 < cp2){...}

这个肯定没问题的,呵呵,估计都是基本方面惹的祸

使用特权

评论回复
7
yewuyi| | 2008-8-22 10:28 | 只看该作者

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


//-----------------------------------------------------------------------------
#include             "key.h"
//-----------------------------------------------------------------------------
extern               BYTEBIT              flag0;
uchar  buffo[10]={0x00};
//-----------------------------------------------------------------------------
void                 keydecode(void)
{
uchar *cp1;
uchar *cp2;
cp1 = buffo;
cp2 = buffo + 0x21;

if (cp1 < cp2){}

}
//-----------------------------------------------------------------------------

使用特权

评论回复
8
eworker|  楼主 | 2008-8-22 10:32 | 只看该作者

to yewuyi

cp2 = buffo + 0x21u

很常用的移动指针的方法,0x21u就是指针移动33个sizeof(uint8)而已。

使用特权

评论回复
9
eworker|  楼主 | 2008-8-22 10:37 | 只看该作者

to yewuyi

buffo我也是定义为全局变量的,编译也可以通过,但运行结果顶楼已经说了,一塌糊涂。

使用特权

评论回复
10
yewuyi| | 2008-8-22 11:17 | 只看该作者

cp1 < cp2

这可比较的是地址哦,比较这个干什么?

使用特权

评论回复
11
yewuyi| | 2008-8-22 11:24 | 只看该作者

~~

没发现有什么错误 


//-----------------------------------------------------------------------------
#include             "key.h"
//-----------------------------------------------------------------------------
extern               BYTEBIT              flag0;
uchar  buffo[10]={0x00,0x01,0x02};
//-----------------------------------------------------------------------------
void                 keydecode(void)
{
uchar *cp1;
uchar *cp2;
cp1 = buffo;
cp2 = buffo + 0x1;

if (cp1 < cp2){
              *cp1=1;
              *cp2=0;
              }

}
//-----------------------------------------------------------------------------

以上代码执行完毕后,buffo[0]=1,buffo[1]=0,结果正确,有什么错误?

 
 

使用特权

评论回复
12
eworker|  楼主 | 2008-8-22 11:30 | 只看该作者

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

仿真时将鼠标移到cp1、cp2、buffo上面,显示cp1为0x9f,cp2为0xbc0。

使用特权

评论回复
13
yewuyi| | 2008-8-22 11:43 | 只看该作者

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

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

使用特权

评论回复
14
eworker|  楼主 | 2008-8-22 12:05 | 只看该作者

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

不但只是指针比较的问题,一旦调用函数指针,马上跑飞,跟踪都没法跟踪。

使用特权

评论回复
15
兰天白云| | 2008-8-22 13:18 | 只看该作者

eworker对PIC还不了解

基本型的PIC16FXXX不适合搞多数据等的处理
如:uint8 buffo[100];
其RAM较小

程序用你的这种写法,编译后空间上没任何优势

使用特权

评论回复
16
eworker|  楼主 | 2008-8-22 13:20 | 只看该作者

用的是pic18f97j60

使用特权

评论回复
17
yewuyi| | 2008-8-22 13:29 | 只看该作者

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

在16、18上使用函数指针根本就是很痛苦的事情,呵呵,不适合使用

使用特权

评论回复
18
yewuyi| | 2008-8-22 13:31 | 只看该作者

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

好象取消了BANK。。。

使用特权

评论回复
19
eworker|  楼主 | 2008-8-22 13:32 | 只看该作者

问题关键

pic的ram分页,程序分段对使用指针、指针的指针、函数指针有没有影响或限制?我上面碰到的两个问题都是可以测试到的,有没有解决的办法?

51、x86、arm7中可以平移的程序,到了pic这里要重新写,岂不悲哉。

使用特权

评论回复
20
yewuyi| | 2008-8-22 14:02 | 只看该作者

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

《PIC单片机入门与实战》中第11章,里面有比较详细的讲解。


函数指针不是绝对不能用,但效率非常低,有一些限制。

至于数据指针的定义问题,直接在书中都能找到答案。

至于‘51、x86、arm7中可以平移的程序,到了pic这里要重新写,岂不悲哉’

这三个都属于冯.诺依曼结构,相对来说,代码移植要容易很多,呵呵,PIC和这三家在CHIP结构上有相当大的不同,所以代码移植的工作量肯定要大很多。。。

建议你直接使用PIC24

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

176

帖子

0

粉丝