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

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

[复制链接]
楼主: jack821119
手机看帖
扫描二维码
随时随地手机跟帖
21
eyuge2| | 2010-10-16 22:42 | 只看该作者 回帖奖励 |倒序浏览
有些人提到现场保护的时候需要关闭中断。不知道是基于什么理由,是怕高级中断破坏了现场?
如果高级中断会破坏现场,低级中断即使在保护现场的时候关闭了中断也是无用的,因为高级中断可能在关中断指令之前发生,如在中断跳转指令的时候发生,这时候现场还是被破坏。
只要更高级的中断也有保护现场的行为,就低级中断就无需在保护相处的过程中关闭中断。

个人看法

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
原野之狼 + 2 我很赞同
22
原野之狼| | 2010-10-16 23:48 | 只看该作者
纠正一下我10L说的 我同意eyuge2的意见
另外 LZ对待问题的态度不错 赞一个

使用特权

评论回复
23
yewuyi| | 2010-10-17 10:18 | 只看该作者
可以关也可以不关,看你的应用需要,当需要中断嵌套的时候,就不能关,一般情况下,多数都选择一关了事。

使用特权

评论回复
24
tyj_3| | 2010-10-17 10:35 | 只看该作者
可以不用关,高级中断会保护现场,前提是嵌套深度一定要保证堆栈不会溢出。

使用特权

评论回复
25
kolo| | 2010-10-17 12:16 | 只看该作者
单片机51的有四个寄存器组,所以可以不要关中断。
当然这和KEIL C51的为中断程序自动分配寄存器组有关系。

使用特权

评论回复
26
jack821119|  楼主 | 2010-10-18 08:59 | 只看该作者
回复20楼,个人觉得单片机的指令都是原子操作的,那就不存在没保护完成的说法了

使用特权

评论回复
27
ayb_ice| | 2010-10-18 09:12 | 只看该作者
是否需要关中断和MCU内核有关
也和要保护的资源有关

使用特权

评论回复
28
yuyetufu| | 2010-10-18 09:25 | 只看该作者
不关不会有事的。用汇编的话,自己对需要保护的寄存器,RAM压栈保护。用C的话,会对部分寄存器自动压栈,自己注意一点就可以了,不会破坏栈区的。高级中断嵌套也是一样的道理。(在堆栈不溢出的情况下)

使用特权

评论回复
29
jack821119|  楼主 | 2010-10-18 10:05 | 只看该作者
回复20楼,“如果是汇编程序,高级用到了R0,而本身没有对R0进行保护,很显然会出错。”
这句话很显然是汇编程序的编写者自己的问题。那象你这样说的话,在高级程序对R0进行保护的话,那就不需要关中断了。是这样意思吗?

我个人不太明白书上:
在保护现场和恢复现场时,为了不使现场受到破坏或者造成混乱,一般不响应新的中断请求.这就要求在编写中断服务程序时,注意在规定此时CPU 不响应新的中断.
这句话的一般不响应新的中断请求,那一般究竟是什么情况了。如果不可以响应新的中断请求,那高级中断就无从说起了,实时性也大打折扣。
望赐教下。

使用特权

评论回复
30
jack821119|  楼主 | 2010-10-18 10:10 | 只看该作者
谢谢大家的宝贵意见,大家都说的很有深度,谢谢了。看来教科书以后应该改版,很多问题都是说的有点模糊。

使用特权

评论回复
31
刘前辈| | 2010-10-18 13:24 | 只看该作者
本帖最后由 刘前辈 于 2010-10-18 13:35 编辑
在保护现场和恢复现场时,为了不使现场受到破坏或者造成混乱,一般不响应新的中断请求.这就要求在编写中断服务程序时,注意在规定此时CPU 不响应新的中断.
这句话的一般不响应新的中断请求,那一般究竟是什么情况了。如果不可以响应新的中断请求,那高级中断就无从说起了,实时性也大打折扣。


LZ说的上面教科书内容是在讲嵌入式RTOS规则吧。那可真没讲错,(既然LZ说的是保护现场,那就不是在讲普通前后台裸奔系统)看UC/OS书上就是这么讲的,它利用这种技巧可以实现256级中断嵌套。
1、一级中断(假设是最低级中断)保护的是被中断的当前任务现场;
2、二级中断(打断了一级中断ISR的更高级中断)保护的是一级中断ISR程序现场;
3、三级中断,……以此类推,

以单片机51中断结构来说,只有2级中断,如何实现多级中断?原理一样,保护现场是一个极短暂的原子操作(十几条指令而已),在这个几十us的原子操作中关闭EA中断不会影响系统的实时性(如此快的实时性要求是没有的,即使单MCU单任务也不可能实现。)保护现场操作完成后,中断利用某种软件技术把自己的ISR处理程序转换为(后台)普通任务,结果又可以再次响应(第二级)中断。
    总结说来,就是在任何级别的中断ISR中,关闭EA十几us,执行完保护现场原子操作之后,系统又进入原来的普通任务环境,因此就又可以再次开放响应(前台)任何级别的中断。

       教科书上讲的没错。关键是什么级别的教科书。

使用特权

评论回复
32
ShakaLeo| | 2010-10-18 13:36 | 只看该作者
不用关中断,如果是编写C程序,ISR中保护现场的部分是编译器的工作,编译器会把每个ISR用到的寄存器在刚进入中断的时候入栈,在中断返回之前出栈,不会有高级中断破坏低级中断的现场的情况

使用特权

评论回复
33
jack821119|  楼主 | 2010-10-18 14:31 | 只看该作者
回复31楼,在保护现场和恢复现场时,为了不使现场受到破坏或者造成混乱,一般不响应新的中断请求.这就要求在编写中断服务程序时,注意在规定此时CPU 不响应新的中断.
这句话就是单片机原理与应用书上面的,很多书上都是这样写,你可以在google或者百度上搜索一下。
保护现场也可以在前后台裸奔系统出现。
51中断系统是只有2级中断,但是通过软件的扩展可以多于2级的优先级出现。

使用特权

评论回复
34
刘前辈| | 2010-10-18 19:39 | 只看该作者

书上讲的内容是针对汇编语言编写中断ISR指导

本帖最后由 刘前辈 于 2010-10-18 20:07 编辑
不用关中断,如果是编写C程序,ISR中保护现场的部分是编译器的工作,编译器会把每个ISR用到的寄存器在刚进入中断的时候入栈,在中断返回之前出栈,不会有高级中断破坏低级中断的现场的情况


我看书上都是按32楼内容写的:如果中断ISR是用C语言写的,那么编译程序会自动保护ISR需要用到的寄存器,这不需要用户关心。那么既然中断完全由C编译器管理了,那么低级中断在自动保护ISR用到的寄存器入栈未完成时发生高级中断是否会造成现场数据丢失?这不是很明显的答案吗?那是管家的责任;C编译器是一个聪明的管家,它不需要用户管理中断;我们用户既然请了管家,就不需要事必躬亲了吧。

除非LZ讲清楚你是用汇编语言编写中断ISR。——书上讲的内容是针对用汇编语言如何编写中断ISR的指导;那应该怎么写才好就是自己的问题了。——关中断 / 不关中断都是可以的,写法不同而已。

       既然C可以做到不关中断实现管理,那汇编当然也可以。愿意研究到底的话,看看C语言 Interrupt  编译结果就行了。

/


使用特权

评论回复
35
c+++| | 2010-10-18 21:29 | 只看该作者
21楼 eyuge2 说的很清楚, 没必要再争论了。

使用特权

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

本版积分规则