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)
我之前在这里发布的答案是基于原始问题的,没有提到avr-gcc的重新排序问题。显然,我使用 AVR 已经是很久以前的事情了,但是有一个关于禁用中断的铃声响起
\n\n修改后的问题答案
\n\n保护中断不被打断
\n\nAtmel 在数据手册中介绍了中断处理:
\n\n\n\n\n当中断发生时,全局中断允许 I 位被清除,并且所有中断被禁止。\n 用户软件可以向 I 位写入逻辑 1 以允许嵌套中断。所有已启用的中断都可以中断当前的中断例程。当执行从中断返回指令 \xe2\x80\x93 RETI \xe2\x80\x93 时,自动设置 I 位。
\n
因此,您所要求的行为已经在硬件中实现了。
\n\n重新排序问题
\n\n我还对这个重新排序问题做了一些调查。显然,这是否是编译器的错误存在巨大分歧。重新排序的主要风险似乎是中断被禁用的时间比预期的时间更长。在我的研究过程中,我没有找到解决方案,除了导致更多加载/存储活动的解决方案之外,我认为这并不是一个真正的选择。
\n