关于ISR中清除中断源的问题

60 篇文章 0 订阅

http://www.amobbs.com/thread-4565349-1-1.html

一直对中断服务程序中是不是要清除中断源标记疑惑。照理看见书上写的是要清的。但是自己看过的一些代码里确实是没清的。自己也曾经在 三星的一些mcu上试验过不清除的话,明明只有一次中断,却会反复的来。在马潮老师http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=847087&bbs_id=9999 这个帖子中提到了 有的是硬件清了中断源,有的需要软件清,有的读了中断寄存器就表示清了。还看到过一种说法是 和中断的触发方式有关,到底如何呢?还有是不是和硬件架构有关,avr,arm,51 都不一样呢?

 

上网查了一下,几个构架的cpu清中断的方式确实不一样。下面总结一下,因为很多东西自己没有实践过,所以不敢保证正确与否。

(1)avr,就像http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=847087&bbs_id=9999 里说道的,
this interrupt flag bit usually gets cleared automatically in the course of processing the interrupt, sometimes by just calling the handler at all, sometimes (e. g. for the U[S]ART) by reading a particular hardware register that will normally happen anyway when processing the interrupt.

(2)8051,
对于定时中断,硬件自动清0的;
对于串行中断,需要软件清0;
对于外部中断,其中IE0(或IE1)清“0”是在中断响应后由硬件电路自动完成的。但还有外中断引脚请求信号清除问题。对于脉冲方式,是自动清的,对于电平方式,还是要手工.
具体可以参http://www.51hei.com/mcu/1168.html这篇文章

(3)pic系列,一般是用软件手动清除的

(4)msp430,
对于单源中断,只要响应中断,系统硬件自动清中断标志位;
对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断必须先清标志现打开中断开关

(5)arm 以44b0来讲, 是要软件清除中断标志的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值