打印

单片机 中断保护现场的时候是否需要关中断?

[复制链接]
11459|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jack821119|  楼主 | 2010-10-16 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
linbei1988| | 2010-10-16 12:00 | 只看该作者
关闭中断,防止在中断中又进入中断,一般单片机会自动关闭总中断;
不关闭中断的计数器工作

使用特权

评论回复
板凳
jack821119|  楼主 | 2010-10-16 12:02 | 只看该作者
2楼说的这种现象不会存在,同级中断不存在嵌套之说,不同级的中断也会自动保护数据

使用特权

评论回复
地板
jack821119|  楼主 | 2010-10-16 12:04 | 只看该作者
我的意思是说在保护现场数据的时候,高级中断发生,会不会把刚才刚才中断的数据冲掉?

使用特权

评论回复
5
老鱼探戈| | 2010-10-16 12:12 | 只看该作者
不用关,一般的IC要么会自动关,要么会等数据入出栈后才会响应其他更高级的中断.

软件上不用另外处理

使用特权

评论回复
6
linbei1988| | 2010-10-16 13:17 | 只看该作者
所以我说的是关闭总中断,高级中断就只能在你现在的中断完成后再进入.
如果一定要在终端中嵌套高级中断的话,当然要做现场保护;就像你从程序进入这个中断也要做现场保护一样

使用特权

评论回复
7
原野之狼| | 2010-10-16 13:44 | 只看该作者
中断响应后中断使能位是关闭的 然后进行现场保护工作 这个工作做完之后可以再次允许中断使能

使用特权

评论回复
8
jack821119|  楼主 | 2010-10-16 14:05 | 只看该作者
51单片机在中断响应后,总中断不会自动关闭的。
大家可能都没看明白我的意思,我是说在中断响应后,进行现场保护,在现场保护的过程中,高级中断响应了,这时候会不会把刚才的现场数据冲掉?

使用特权

评论回复
9
jack821119|  楼主 | 2010-10-16 14:07 | 只看该作者
回复7楼,在现场保护的过程中还是可以再次中断的

使用特权

评论回复
10
原野之狼| | 2010-10-16 14:28 | 只看该作者
如果现场还没有保护完 就又被中断了 那必然会带来程序的紊乱 试想MCU怎么会有这么糟糕的设计呢

使用特权

评论回复
11
jack821119|  楼主 | 2010-10-16 14:38 | 只看该作者
事实上cpu是没有问题的,我在keil c里面仿真过了,在现场保护的情况下高级中断响应后,程序还是可以正常运行。

使用特权

评论回复
12
linbei1988| | 2010-10-16 15:34 | 只看该作者
51单片机中断现场保护应该是要PUSH  POP的吧,如果在执行现场保护时又响应了高级中断肯定会导致一些寄存器数据错误.
可能只是没有那么巧正好在现场保护时又响应了高级中断,但是这样始终存在风险

使用特权

评论回复
13
jack821119|  楼主 | 2010-10-16 15:40 | 只看该作者
兄弟你说的有点含糊,究竟是什么寄存器数据错误了。
我在keil c仿真的时候就是在压栈的时候触发高级中断的,但事实上高级中断完成后自动返回低级的中断,低级中断完成后返回到原来的断点,都很正常的。
但是书上也是说现场保护的时候是需要关闭中断,但是我有点怀疑。

使用特权

评论回复
14
linbei1988| | 2010-10-16 15:46 | 只看该作者
这个还用说么?当然是累加器,状态寄存器,指针寄存器这些了.....
我不知道你是怎么确定是在堆栈的过程中触发高级中断的,如果真的是堆栈还没过程就进入了高级中断,那么堆栈的寄存器必然出错.

使用特权

评论回复
15
jack821119|  楼主 | 2010-10-16 16:28 | 只看该作者
keil c 软件仿真就可以做到,我查看过了累加器,状态寄存器,指针寄存器都是正常的,而且程序还可以返回原来的断点

使用特权

评论回复
16
jack821119|  楼主 | 2010-10-16 16:29 | 只看该作者
sp的值跟没进入中断前的值都是一样的,我建议你可以试下keil  c的软件仿真你就清楚了

使用特权

评论回复
17
jack821119|  楼主 | 2010-10-16 16:49 | 只看该作者
而且书上也说是一般情况下需要关中断,没说完全需要关中断。

在保护现场和恢复现场时,为了不使现场受到破坏或者造成混乱,一般不响应新的中断请求.这就要求在编写中断服务程序时,注意在规定此时CPU 不响应新的中断.
这段是书上注明的。

11、当正在执行某一个中断源的中断服务程序时,如果有新的中断请求出现,试问在什么情况下可响应新的中断请求?在什么情况下不能响应新的中断请求?

答:(1)符合以下6个条件可响应新的中断请求:

a)        有中断源发出中断请求

b)        中断允许位EA=1,即CPU开中断

c)        申请中断的中断源的中断允许位为1,即中断没有被屏蔽

d)        无同级或更高级中断正在被服务

e)        当前的指令周期已结束

f)         若现行指令为RETI或访问IE或IP指令时,该指令以及紧接着的另一条指令已被执行完


符合这6种情况都可以进行新的中断。那在现场保护不符合这6种情况。
麻烦大家再给点意见。

使用特权

评论回复
18
zhangshaoyan| | 2010-10-16 20:09 | 只看该作者
中断是可以嵌套的,只要能保护好现场。栈空间不溢出,应该是可以的。

使用特权

评论回复
19
流行音乐| | 2010-10-16 20:49 | 只看该作者
建议关闭中断,否则有可能会出问题。

使用特权

评论回复
20
eyuge2| | 2010-10-16 22:26 | 只看该作者
51单片机不是很熟悉,知道它在发生中断的时候,是不会关闭中断使能的。更高级的中断是可以在低级中断处理过程中发生的。
pc的保护是硬件动作,这个是断点保护。你谈到了现场保护,这个应该是一些cpu寄存器的保护,比如R0,R1等,这些寄存器的保护肯定是需要程序员来完成的。(使用汇编语言,c语言不再此列)。

如果你写了一个函数,在其中用到了R0寄存器。来了一个低级中断,这个中断处理程序用到了R0,R0就应该在你的中断处理程序的开始部分加以保护。如果保护还没有完成,又来了一个跟高级的中断,这时候就要看这个高级的中断是如何进行现场保护的,如果是汇编程序,高级用到了R0,而本身没有对R0进行保护,很显然会出错。

使用c语言的时候,中断发生的时候,那些寄存器需要进行保护是由编译器完成的,保护很完善,是不需要关中断的。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
原野之狼 + 2 我很赞同
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

205

帖子

3

粉丝