首页 文章

如何从ARM Cortex-M3上的中断处理程序中重新启用中断?

提问于
浏览
1

Background:
我使用的是没有操作系统的cortex-M3 ARM内核 .

我的主循环等待来自中断处理程序的标志,然后执行函数 doBigTask() .

在一个单独的中断处理程序中,我想执行另一个函数 doSmallTask() ,但由于此函数也非常重要,我仍然希望处理其他与I / O相关的中断 .

My Question:
doSmallTask() 中简单地启用中断是否有任何问题?例如,在中断已经被禁用后退出中断处理程序是否有任何复杂性?

注意:我不希望发生重入中断,因为 doSmallTask() 会在下一个中断触发之前完成 .

int flag = 0;

void doSmallTask()
{
   asm volatile ("cpsie i");  // Enable interrupts
   // do rest of function
   // ...
}

void irqHandler1()
{
   flag = 1;
}

void irqHandler2()
{
  doSmallTask();
}

void irqHandler3()
{
  // service I/O
}

int main()
{
  while(1)
    if (flag)
    {
      doBigTask();
      flag = 0;
    }
}

2 回答

  • 5

    首先,你的“flag”变量应该是volatile,因为它在前景和后台代码之间共享 .

    但是要回答你的问题,在Cortex-M上,ISR中已经启用了中断 . 这是为了支持中断嵌套 . 在ISR内部,只有更高优先级的中断才会中断/抢占当前的ISR . 因此,正确配置中断优先级非常重要 .

    阅读Cortex-M系列的NVIC以获取更多信息 . 请注意,中断源和支持的中断优先级数取决于芯片供应商 . 理论上,支持多达240个外部中断,实际上它通常要少得多 .

    有一个recent blog post about ARM Cortex M interrupt priorities更详细地解释了这一点 .

  • 1

    您可以更改中断优先级 . 将 irqHandler2 的优先级设置为小于其他优先级 .

相关问题