mks*_*uth 1 embedded arm interrupt cortex-m3
背景:
我使用的是没有操作系统的cortex-M3 ARM内核.
我的主循环等待来自中断处理程序的标志然后执行一个函数doBigTask().
在一个单独的中断处理程序中,我想执行另一个函数doSmallTask(),但由于这个函数也非常重要,我仍然希望处理其他与I/O相关的中断.
我的问题:
从内部简单地启用中断是否存在任何问题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;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,你的"flag"变量应该是volatile,因为它在前景和后台代码之间共享.
但是要回答你的问题,在Cortex-M上,ISR中已经启用了中断.这是为了支持中断嵌套.在ISR内部,只有更高优先级的中断才会中断/抢占当前的ISR.因此,正确配置中断优先级非常重要.
阅读Cortex-M系列的NVIC以获取更多信息.请注意,中断源和支持的中断优先级数取决于芯片供应商.理论上,支持多达240个外部中断,实际上它通常要少得多.
有一个大约的ARM Cortex中号中断优先级最近的一篇博客,在更详细地说明这一点.
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |