在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 APIconfigASSERT 死循环卡死立即在 API 入口处
调用非 FromISR API篡改调度器 TCB,PendSV 跳转非法地址中断退出后,进入 HardFault
忽略断言强行调用内核链表指针损坏,产生野指针随机,在下次遍历链表时触发 HardFault

进入临界区保护 会忽略优先级比较低的中断 但是在实际的代码执行的过程中 没有发现丢过中断呢

1. 核心原因:NVIC 的“挂起(Pending)”机制(硬件锁存)

2. 临界区的“极短时间窗口”(概率原因)

3.你真的“没有丢”吗?—— 聊聊“合并丢失”的盲区

4. 电平触发的中断绝对“不会丢”

5.5. 针对“优先级0中断”的特殊情况

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐