将中断优先级设置#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
·
在FreeRTOSConfig.h中,
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
这个参数是内核管控的中断优先级参数,如果中断的优先级比这个高,则不受中断的管控。临界区保护。
OSIF_UNIFIED_ENTER_CRITICAL
OSIF_UNIFIED_EXIT_CRITICAL
在进入中断的时候,他会屏蔽掉当前cpsr寄存器中的
"ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */
退出的时候,它会恢复
"BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */
如果中断的优先级比这个低,那么该中断就变得不可控,就不能调用系统级别的一些接口,容易造成系统崩溃。
调用 FromISR API | configASSERT 死循环卡死 | 立即在 API 入口处 |
调用非 FromISR API | 篡改调度器 TCB,PendSV 跳转非法地址 | 中断退出后,进入 HardFault |
| 忽略断言强行调用 | 内核链表指针损坏,产生野指针 | 随机,在下次遍历链表时触发 HardFault |
进入临界区保护 会忽略优先级比较低的中断 但是在实际的代码执行的过程中 没有发现丢过中断呢
1. 核心原因:NVIC 的“挂起(Pending)”机制(硬件锁存)
2. 临界区的“极短时间窗口”(概率原因)
3.你真的“没有丢”吗?—— 聊聊“合并丢失”的盲区
4. 电平触发的中断绝对“不会丢”
5.5. 针对“优先级0中断”的特殊情况
更多推荐
所有评论(0)