我用atmega168a-pu和中断开发了一个C应用程序。我使用以下中断:
ISR(TIMER0_COMPA_vect);
ISR(TIMER0_COMPB_vect);
ISR (TIMER2_COMPA_vect);
ISR(SPI_STC_vect);
ISR(TIMER1_COMPA_vect);
ISR (PCINT1_vect);我的代码看起来像这样
int main(void){
///initialization etc.
sei();
while(1){
///do some stuff and wait the interrupts
}
return 0;
}我想在中断发生时阻止所有其他中断,并在即将退出中断功能之前启用中断。
你能在代码片段上解释一下我是怎么做的吗?
EDIT:http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorder声明这样的使用会导致重新排序问题。
function(){
cli();
..
sei();
}发布于 2013-07-17 00:36:40
我之前在这里发布的答案是基于最初的问题,没有提到avr的重新排序问题--gcc。显然,这是太久以前,我与AVR工作,但有一个关于禁用中断的钟声响起
对问题的修订答案
保护中断不被中断
Atmel在databook中记录了中断处理:
当中断发生时,全局中断使能I位被清除,所有中断都被禁用。用户软件可以将逻辑1写入I位,以使能嵌套中断。然后,所有使能中断均可中断当前中断例程。执行从中断指令RETI返回时,会自动设置I位。
因此,您所要求的行为已经在硬件中实现了。
重新排序问题
我也对这个重新排序的问题做了一些调查。显然,无论这是不是编译器的错误,都存在巨大的分歧。似乎重新排序的主要风险是中断被禁用的时间比预期的要长。在我的研究中,除了导致更多加载/存储活动的解决方案之外,我没有找到解决方案,我认为这不是一个真正的选择。
发布于 2014-11-24 05:39:32
这里的问题有点奇怪,因为中断的默认行为是在服务中断时禁用新的中断(如while‘t fire)。
对于编写不能被打断的代码,我通常认为只要使用中的原子功能就足够了。如果这还不够,你真的必须确保没有重新排序,也许你可以用汇编编写临界区。
您可以使用内存屏障,同时使代码段中的所有内容变得不稳定,但在许多情况下,这将是一个相当大的悲观主义。由此生成的程序集可能会提示您,如果要手动编写程序集,您将编写什么内容。
https://stackoverflow.com/questions/17680879
复制相似问题