中断嵌套
D13x / D12x 支持中断嵌套功能,高优先的中断可以打断低优先中断的执行。可配置的中断优先级为 0-7
,所有中断默认优先级为 0
。
可以通过以下 API 设置/查询某个中断的优先级:
aicos_irq_set_prio(UART0_IRQn, 2); // 设置 UART0 的中断优先级为 2
aicos_irq_get_prio(UART0_IRQn); // 获取 UART0 的中断优先级
1
2
2
INFO
例外的是软件中断 PendSV_Handler
是不支持中断嵌套的,该中断是用来处理进程切换的。
超级中断
配置说明
D13x / D12x 进一步支持超级中断功能,高优先级的中断不仅能实现中断嵌套,还能突破 Kernel 全局中断开关的限制。
可以通过 scons --menuconfig
命令进入 menuconfig 配置界面,配置超级中断的相关参数:
Chip options --->
[*] Use threshold as global interrupt switch // 启用超级中断
(6) Threshold value (0-7) (NEW) // 设置中断优先级门限,大于该门限的中断为超级中断
1
2
3
2
3
实现原理
RT-Thread 下全局中断的开关函数为 rt_hw_interrupt_enable() / rt_hw_interrupt_disable()
,通常情况下它是通过操控 mstatus
寄存器中的 MIE
bit 来实现中断的全局开关的,原理如下图所示:
把 mstatus
寄存器中的 MIE
bit 保持常开,通过设置中断门限来实现中断的全局开关,这样就能保证一部分超级中断能突破 rt_hw_interrupt_disable()
的限制,原理如下图所示:
INFO
超级中断中不能访问使用 rt_hw_interrupt_disable()
保护的竞态资源,因为这时候的访问时不安全的。这意味着很多 Kernel 提供的 API 是不能使用的,需要特别注意!