打印
[51单片机]

返璞归真,突然有个基础问题想不通

[复制链接]
2789|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
叮叮当|  楼主 | 2014-2-16 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 叮叮当 于 2014-2-17 13:03 编辑

单片机中断程序都有一个interrupt n 来告诉编译器,中断入口地址, 根据要求,每次中断的时候都要保存现场,但是keil中好像没有保存现场的代码,最后编译的代码里面到底有没有现场保护呢,如果没有,中断太多了,程序不会跑飞吗?

另外想起一个问题,中断代码能放置的代码量到底是怎么规定的呢,如果是RAM的最大值,那么对于large xdata的memory 模式,而刚好xdata 空间的memory又非常大,
那是不是意味着,中断代码中可以放任意多的的执行代码,函数调用等。。

相关帖子

沙发
lnulibin| | 2014-2-16 12:46 | 只看该作者
编译器生成的代码里边对中断代码中用到的寄存器是有保护的。
不然,程序会出问题的。这一点,是肯定的。
KEIL的设计人员不会这么蠢的。呵呵。

使用特权

评论回复
板凳
嵌入式云终端| | 2014-2-16 14:11 | 只看该作者
这个是自动处理得,你的中断当然不能太多,太多了,肯定死掉。

使用特权

评论回复
地板
香水橙| | 2014-2-16 15:00 | 只看该作者
何必担心这么多,既然程序没有跑飞,那肯定是有保护代码,不然怎么可能还有这么多人用呢?

如果想一探究竟,可以自己把汇编代码打开看看。

使用特权

评论回复
5
ningling_21| | 2014-2-16 15:19 | 只看该作者
保护现场的代码在汇编语言窗口中可以看到,不是没有...
即使中断太多,保护现场只要不超过RAM允许空间范围就不会有问题...

使用特权

评论回复
6
airwill| | 2014-2-16 15:22 | 只看该作者
是的, Keil C编译器会自动生成现场保护的指令. 并且智能地只生成中断里使用到的寄存器.
可以打开编译生成的 LST 文件看看.(如果编译设置里设置了生成汇编代码的话)

使用特权

评论回复
7
ayb_ice| | 2014-2-16 15:24 | 只看该作者
需要保护时才保护的,
有些中断代码很简单,根本没有影响任何寄存器,当然不需要了

使用特权

评论回复
8
laoding123| | 2014-2-16 15:48 | 只看该作者
路过,学习了!

使用特权

评论回复
9
zhuczloveai910| | 2014-2-16 16:18 | 只看该作者
学习了

使用特权

评论回复
10
叮叮当|  楼主 | 2014-2-17 12:56 | 只看该作者
airwill 发表于 2014-2-16 15:22
是的, Keil C编译器会自动生成现场保护的指令. 并且智能地只生成中断里使用到的寄存器.
可以打开编译生成的 ...

今天按照你的引导看了一下,在中断函数里面多了压栈和出栈的动作,谢谢。

如下面为rtc的中断响应
             ; FUNCTION rtc_interrupt (BEGIN)
0000 C0E0              PUSH    ACC
0002 C0F0              PUSH    B
0004 C083              PUSH    DPH
0006 C082              PUSH    DPL
0008 C085              PUSH    DPH1
000A C084              PUSH    DPL1
000C C092              PUSH    DPSEL
000E 5392FE            ANL     DPSEL,#0FEH
0011 C0D0              PUSH    PSW
0013 75D000            MOV     PSW,#00H
0016 C000              PUSH    AR0
0018 C001              PUSH    AR1
001A C002              PUSH    AR2
001C C003              PUSH    AR3
001E C004              PUSH    AR4
0020 C005              PUSH    AR5
0022 C006              PUSH    AR6
0024 C007              PUSH    AR7

---------------上面是入栈,下面是出栈,略去代码部分,----------------------------
002F D007              POP     AR7
0031 D006              POP     AR6
0033 D005              POP     AR5
0035 D004              POP     AR4
0037 D003              POP     AR3
0039 D002              POP     AR2
003B D001              POP     AR1
003D D000              POP     AR0
003F D0D0              POP     PSW
0041 D092              POP     DPSEL
0043 D084              POP     DPL1
0045 D085              POP     DPH1
0047 D082              POP     DPL
0049 D083              POP     DPH
004B D0F0              POP     B
004D D0E0              POP     ACC

使用特权

评论回复
11
liudanwei| | 2014-2-17 16:59 | 只看该作者
路过,学习了、

使用特权

评论回复
12
江枫渔火| | 2014-2-17 17:26 | 只看该作者
一般想这些问题的人,好像好傻,但其实真的很多人不知道,比如我。

楼主是说没有现场保护代码是C还是汇编?汇编里应该会有的吧?

楼主说,中断是不是可以无限长大?我觉得应该可以吧。好比你在看书,这时候电话响了,你中断过去接电话,这电话可以打好久好久,甚至不挂回来,从此以后就打电话中。也行的啊。

期待大侠科普ing。。。

使用特权

评论回复
13
天命风流| | 2014-2-17 17:49 | 只看该作者
原来如此!!!

使用特权

评论回复
14
雪澜| | 2014-2-17 20:35 | 只看该作者
学习

使用特权

评论回复
15
lzp3520265| | 2014-2-17 21:07 | 只看该作者
首先,现场保护是肯定有的,至于是保存所有寄存器还是只保存改变过的寄存器,就看keil的编译器如何了。
然后,中断代码是可以无限长的,只要ROM放的下。对于CPU来说,取指令、执行,却不会理会当前是中断还是非中断。
至于无限函数调用,就看是如何调用了。如果是类似于递归调用,那么每次调用都要保护现场,执行压栈操作,而51的堆栈最多是256B,所以理论上递归函数调用最多是128次(真的这样会覆盖掉R0-R7)。

使用特权

评论回复
16
y957104| | 2014-2-17 21:42 | 只看该作者
也学习了

使用特权

评论回复
17
luofeng2g| | 2014-2-17 22:36 | 只看该作者
不断积累,学习了

使用特权

评论回复
18
叮叮当|  楼主 | 2014-2-18 10:28 | 只看该作者
经过大家提醒,每搞通一个问题总有一种成就感,又进步了。 谢谢。

可是分配分的时候老提示不对,错误...

使用特权

评论回复
19
qazokmty| | 2014-2-18 11:27 | 只看该作者
学习了~~

使用特权

评论回复
20
断水流93| | 2014-2-18 16:58 | 只看该作者
mark

使用特权

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

本版积分规则

8

主题

41

帖子

0

粉丝