首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVR编程、中断处理

AVR编程、中断处理
EN

Stack Overflow用户
提问于 2013-07-16 23:33:40
回答 2查看 3K关注 0票数 5

我用atmega168a-pu和中断开发了一个C应用程序。我使用以下中断:

代码语言:javascript
复制
ISR(TIMER0_COMPA_vect);
ISR(TIMER0_COMPB_vect);
ISR (TIMER2_COMPA_vect);
ISR(SPI_STC_vect);
ISR(TIMER1_COMPA_vect);
ISR (PCINT1_vect);

我的代码看起来像这样

代码语言:javascript
复制
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声明这样的使用会导致重新排序问题。

代码语言:javascript
复制
function(){
  cli();
  ..
  sei();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-17 00:36:40

我之前在这里发布的答案是基于最初的问题,没有提到avr的重新排序问题--gcc。显然,这是太久以前,我与AVR工作,但有一个关于禁用中断的钟声响起

对问题的修订答案

保护中断不被中断

Atmel在databook中记录了中断处理:

当中断发生时,全局中断使能I位被清除,所有中断都被禁用。用户软件可以将逻辑1写入I位,以使能嵌套中断。然后,所有使能中断均可中断当前中断例程。执行从中断指令RETI返回时,会自动设置I位。

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

重新排序问题

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

票数 2
EN

Stack Overflow用户

发布于 2014-11-24 05:39:32

这里的问题有点奇怪,因为中断的默认行为是在服务中断时禁用新的中断(如while‘t fire)。

对于编写不能被打断的代码,我通常认为只要使用中的原子功能就足够了。如果这还不够,你真的必须确保没有重新排序,也许你可以用汇编编写临界区。

您可以使用内存屏障,同时使代码段中的所有内容变得不稳定,但在许多情况下,这将是一个相当大的悲观主义。由此生成的程序集可能会提示您,如果要手动编写程序集,您将编写什么内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17680879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档