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

keil这个报错说什么意思????

[复制链接]
楼主: zzkk1988
手机看帖
扫描二维码
随时随地手机跟帖
21
yuyetufu| | 2010-7-7 21:27 | 只看该作者 回帖奖励 |倒序浏览
进入中断时,除了PSW,A,dptr等压栈,用到的R0~7寄存器也是自动压栈的,不存在10楼说的问题。

使用特权

评论回复
22
zq1987731| | 2010-7-8 00:20 | 只看该作者
只要用了using关键字,R0~R7就不存在自动压栈功能,自己看反汇编就明白了

使用特权

评论回复
23
sheriff| | 2010-7-8 08:32 | 只看该作者
受到21楼启发,的确,如果不用其它寄存器组,用到R0-R7是自动保存的。也就是说如果中断只使用了R0-R7用于局部变量,不用其它寄存器组也不会破坏中断前的状态,如果中断使用了RAM(非模拟栈)用于局部变量,那么用其它寄存器组也没法避免破坏中断前的状态。

使用特权

评论回复
24
yuyetufu| | 2010-7-8 15:30 | 只看该作者
只要用了using关键字,R0~R7就不存在自动压栈功能,自己看反汇编就明白了
zq1987731 发表于 2010-7-8 00:20

没错,只要用了using就不保存寄存器组参数。哪怕用using 0 和主程序一样的寄存器组,同样不保存。所以这里为避免错误,在默认为0组寄存器的情况下,中断就不要使用using 0了
不过一般来说,中断所用到的寄存器组和主程序的寄存器组设置成不一样的,免得中断需要压栈太多参数。由于主程序中不用到第1组寄存器,所以不保存也无妨。
还有一点要特别提醒,如果中断使用的寄存器组和被调用的函数的寄存器组不一样的话,是不可以的,会发生不可预料的错误(keil使用手册上说的)。
你这里的function函数是用第0组,但是中断用using x(X如果不是0),那本身就是不对的。

使用特权

评论回复
25
meng730507| | 2010-7-8 16:10 | 只看该作者
本来就不应该把浮点程序放进中断。

使用特权

评论回复
26
zq1987731| | 2010-7-8 17:58 | 只看该作者
你这里的function函数是用第0组,但是中断用using x(X如果不是0),那本身就是不对的。

这里就是歧义较多的地方了,如果主程序正在调用function时,中断事件发生,中断ISR中同样也调用了function,那么该中断ISR如果和主程序使用同一寄存器组,等中断ISR执行完毕回到主程序后,程序立刻乱掉...
这也就是我采用不同组寄存器,以“手动保护现场”的做法含义所在了,这时之所以要关闭寄存器绝对寻址...主要因为keil有优化机制,一旦使用“寄存器绝对寻址方式”,寄存器组切换便毫无意义,比如当前using 1时,还在对RAM中的02H单元进行操作,那便会破坏第0组寄存器的内容,在参考完整的反汇编内容后,至少我是没发现什么“不可预料的错误”,当然也可能是个人程序风格的缘故,我追求的一向都是“中断ISR只做最简单的事情”

使用特权

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

本版积分规则