发新帖我要提问
12
返回列表
打印

KEIL C 编译器的问题

[复制链接]
楼主: niuniu1983
手机看帖
扫描二维码
随时随地手机跟帖
21
hkap| | 2008-5-4 14:15 | 只看该作者 回帖奖励 |倒序浏览

典型问题

中断中指定寄存器组时,其中被调用的函数要禁止绝对寄存器寻址优化,函数前面加 #pragma NOAREGS

使用特权

评论回复
22
hkap| | 2008-5-4 14:32 | 只看该作者

所长培训教材中的"关于函数重入的说明"


关于函数重入的说明

因为使用了中断等级划分,中断中调用函数必定使用using x,保证主循环、低等级中断、高等级中断对同一函数的调用,不使用相同的寄存器区,而同等级中不管优先级如何都不会发生中断嵌套,所以首先避免了使用寄存器做函数参数调用引起的重入问题。

对只要可能在中断中调用的任何函数,必须使用#pragma NOAREGS开关,避免编译器产生优化的地址直接寻址指令,而使用正确的寄存器寻址指令。

对可能中断中调用的指针,一定明确说明类型,不能使用通用指针。

对可能被嵌套的函数,在进行char以上(int、long、xdata指针等)超过两字节的变量操作时,必须进行中断保护:保存中断状态->关中断->操作->恢复中断状态,保证不会在两字节之间的操作中产生中断。

这样reentrant可以不被使用,它的代价太大了。如果还有重入问题,就将函数复制一遍并改名,让中断中调用不同名字的函数吧。 

使用特权

评论回复
23
brmcu| | 2008-5-4 15:57 | 只看该作者

自己仔细找找原因

自己仔细找找原因

使用特权

评论回复
24
wxj1952| | 2008-5-6 11:30 | 只看该作者

非常感谢所长提醒。我视其为第二道风景。

解决方法1、消除编译器对函数局部变量i的优化(禁止用寄存器变量R7替代)。

C51的第二道风景——volatile
如果在对一个常用变量的说明中加了volatile限定符,则通知编译器不对该变量进行寄存器变量优化。
在LZ void  led_dly_one_byte(uchar number, bit dp)  函数定义中,将 uchar i ;改为 

            volatile uchar i ; 

则:即使不修改默认优化级别,void  led_dly_one_byte( )函数也能得到与using 3 无关的正确编译代码。

使用特权

评论回复
25
lhj200304| | 2008-5-6 11:44 | 只看该作者

所长能不能把教材重发一下

很久以前就仰慕所长,也知道所长的教材,可是那个帖子已经被删除了,看所长能不能把教材重发一下,让我等小辈也提高一下水平

使用特权

评论回复
26
lhj200304| | 2008-6-13 14:29 | 只看该作者

还有个办法

还有个办法不是太好,就是其中被调用的函数要指定和中断相同的寄存器组。这样也可以解决

使用特权

评论回复
27
zyx520| | 2008-6-13 14:53 | 只看该作者

中断函数最好不要用using

容易发生重入问题

使用特权

评论回复
28
栏杆| | 2008-6-13 23:28 | 只看该作者

KAO 厉害啊,真是钻研得细致!

使用特权

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

本版积分规则