关于中断的判断 TMR1IE&&TMR1IF 的疑问

2020-02-08 09:13发布

void interrupt ISR(void)
{
        if(TMR1IE&&TMR1IF)
        {

        }
}

datasheet 上说,溢出后  TIR1IF会置1,要软件清零,为什么不直接判断  TIM1IF  而是把TMR1IE和TMR1IF两个一起判断,这样做有什么好处?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
surf_131
1楼-- · 2020-02-08 09:16
这是一个不好的编程习惯。能够进入中断响应程序,就表明“IE”已经开启了,不必再关注之。万一程序在"IF"已经树立时关闭"IE",就可能形成中断响应的“孤儿”,中断标志导致不断响应,但是响应后无处理动作,整个程序就挂起了。
sn516952
2楼-- · 2020-02-08 14:36
 精彩回答 2  元偷偷看……
usk5yenj4id04dm
3楼-- · 2020-02-08 16:16
PIC是在公用的ISR里面查询第一个中断源的,所以TMR1IE&&TMR1IF必不可少,以防某些中断根本就没有开启.
surf_131
4楼-- · 2020-02-08 16:55
usk5yenj4id04dm 发表于 2012-5-9 14:18
PIC是在公用的ISR里面查询第一个中断源的,所以TMR1IE&&TMR1IF必不可少,以防某些中断根本就没有开启. ...

正好讲反了。正因为只有一个中断源,万一哪个标志错误标示,你不消除中断标志就会造成反复进入中断的问题。
我昨天还碰到过这样的问题(是pic18,不是只有一个中断源的pic12/16),本来没有USART2接收的任务,只要TX即可,但是开了U2模块,偶然就有类似干扰让U2_RX蹦出个待取数标记。程序不断进入中断响应,却没有任务能处理。于是给个空读RCREG的响应操作,就解决了。
eduhf_123
5楼-- · 2020-02-08 17:50
surf_131 发表于 2012-5-11 01:36
正好讲反了。正因为只有一个中断源,万一哪个标志错误标示,你不消除中断标志就会造成反复进入中断的问题 ...

你似乎没有搞清楚“中断源”和“中断服务程序入口”这两个概念的区别。

PIC12/16系列有不止一个的中断源、但却只有一个中断服务程序入口,所以必须在中断服务程序中使用LZ位的方法来判断该执行哪个中断源对应的服务程序。

而在判断的时候,不能只判断中断请求标志,还要判断对应的中断使能位——因为你可以禁止一个中断被使能但却不能禁止外设产生中断请求。
如果只判断中断请求标志却不判断对应的使能位,可能会导致已经关闭了的中断被服务——这正是我们所不希望发生的。
surf_131
6楼-- · 2020-02-08 20:42
eduhf_123 发表于 2012-5-27 18:05
你似乎没有搞清楚“中断源”和“中断服务程序入口”这两个概念的区别。

PIC12/16系列有不止一个的中断源 ...

作为一个实际运行系统,越是能克服各种意外的设计越好。一个中断响应动作,即便不是需要的,万一发生,你多响应一次不会有严重后果;而一个意外的中断响应动作,被那种“不是我该管的事情,我不理睬”的程序员处理,就一定会造成系统不断反复进入中断而挂起。
所以,越是在这种事情上夸夸其谈,就越干不好程序员这个职业。

pic16,甚至pic18这个等级的芯片,PEIE开放之后,一旦出现不被处理的中断标志,就必然造成系统的挂起。

一周热门 更多>