打印

单片机在中断和调用时要保存哪些寄存器?

[复制链接]
6819|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
areshan|  楼主 | 2010-9-6 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机在中断和调用程序时是不是只把PC入栈???这样中断程序或被调用的程序会不会破坏掉通用寄存器(R0,R1......)里原来的数值。我平时用C也不知道通用寄存器是怎么分配变量给C使用,用大侠能给点这方面的指导吗?要是那几个通用寄存器的数值被破坏掉了,那程序再回去,计算肯定要出错的!!!单片机内部是怎样处理防止程序回去后,通用寄存器的值被破坏的呢???困惑!!!

相关帖子

沙发
天雨粟| | 2010-9-6 20:44 | 只看该作者
如果你的中断程序改变了工作寄存器组(using X),则编译器不会将默认的工作寄存器组保存入栈
否则,要将工作寄存器组入栈保存
但这只是一个基本原则
Keil很聪明,如果你的中断程序中没有使用局部变量(即没有用工作寄存器),则Keil也不做冤枉工,看反汇编,很清楚。

可以在Keil下编个程序,对比下试试!

另外,中断程序不能调用,否则会出现致使性的编译错误!

使用特权

评论回复
板凳
areshan|  楼主 | 2010-9-6 21:48 | 只看该作者
这样的话为了防止通用寄存器被调用的函数,或是中断函数破坏掉,那么被调用的函数和中断函数就不能有局部变量了,这个怎么能不用局部变量呢???? 2# 天雨粟

使用特权

评论回复
地板
ayb_ice| | 2010-9-7 08:27 | 只看该作者
这和MCU的架构有关
有些MCU会在中断时自动把有关寄存器入栈,而51是不会的

使用特权

评论回复
5
airwill| | 2010-9-7 11:29 | 只看该作者
Keil 分配局部变量会自动选择未使用的寄存器的. 你大可放心地在任何地方定义局部变量.
在没有使用 USING x 的时候, 中断服务函数会自动入栈中断函数使用的所有寄存器.所以你也不用担心.
但是, 使用了 USING x 这样强制的寄存器组设定, 则 KEIL 默认本寄存器组只给这个中断服务使用. 所以没有了寄存器入栈操作, 所以在分配寄存器组时请注意, 一个组只能分配给一个中断使用.
另外, 在程序中随意改变寄存器组是不允许的, 因为编译器不会复制寄存器组的内容, 除非你自己来做这个事情.
还有, Keil 分配局部变量到寄存器的算法很笨的, 要想尽可能地使用寄存器, 请在函数开头定义所有用到的变量,而不要在下面的子块中定义(虽然变量的作用域仅在子块里).

使用特权

评论回复
6
zjswuyunbo| | 2010-9-7 11:30 | 只看该作者
貌似和是否用using有关系,用了后就切换寄存器组,然后就不保护了。子函数好像还要禁止绝对定位。

使用特权

评论回复
7
天雨粟| | 2010-9-7 19:51 | 只看该作者
楼主在3楼的意思我看不很明白,似乎是这样:
中断服务函数要用局部变量,
中断服务函数还要调用函数,被调函数中也有局部变量
这样就会出现数据破坏,系统崩溃
Keil怎么处理这个事?

1,启动文件中,须得令模拟栈有效
2,被调函数须得申明为重入函数
3,主调与被调函数须得使用同一个工作寄存器组
我在实际操作中经常查看反汇编,确认就是如此。


5楼认为Keil对工作寄存器使用很笨,这个我是不同意的。为了与汇编程序接口,Keil对工作寄存器的安排不免会作些硬性规定,为了更大的收益,作了些局部的牺牲,我不认为这是Keil的算法笨!

使用特权

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

本版积分规则

127

主题

728

帖子

0

粉丝