AVR编程,中断处理

Joh*_*der 5 c avr atmega interrupt

我开发了一个带有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);
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像

int main(void){
///initialization etc.
   sei();
   while(1){
    ///do some stuff and wait the interrupts
   }
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想在发生中断时阻止所有其他中断,并在退出中断功能之前启用中断.

您能否在代码片段中解释一下我是如何做到的?

编辑:http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorder声明此类使用会导致重新排序问题.

function(){
  cli();
  ..
  sei();
}
Run Code Online (Sandbox Code Playgroud)

jun*_*nix 2

我之前在这里发布的答案是基于原始问题的,没有提到avr-gcc的重新排序问题。显然,我使用 AVR 已经是很久以前的事情了,但是有一个关于禁用中断的铃声响起

\n\n

修改后的问题答案

\n\n

保护中断不被打断

\n\n

Atmel 在数据手册中介绍了中断处理:

\n\n
\n

当中断发生时,全局中断允许 I 位被清除,并且所有中断被禁止。\n 用户软件可以向 I 位写入逻辑 1 以允许嵌套中断。所有已启用的中断都可以中断当前的中断例程。当执行从中断返回指令 \xe2\x80\x93 RETI \xe2\x80\x93 时,自动设置 I 位。

\n
\n\n

因此,您所要求的行为已经在硬件中实现了。

\n\n

重新排序问题

\n\n

我还对这个重新排序问题做了一些调查。显然,这是否是编译器的错误存在巨大分歧。重新排序的主要风险似乎是中断被禁用的时间比预期的时间更长。在我的研究过程中,我没有找到解决方案,除了导致更多加载/存储活动的解决方案之外,我认为这并不是一个真正的选择。

\n