ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

将中断优先级设置#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2

将中断优先级设置#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2 在FreeRTOSConfig.h中#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2这个参数是内核管控的中断优先级参数如果中断的优先级比这个高则不受中断的管控。临界区保护。OSIF_UNIFIED_ENTER_CRITICALOSIF_UNIFIED_EXIT_CRITICAL在进入中断的时候他会屏蔽掉当前cpsr寄存器中的ORR R0, R0, #0xC0 \n\t /* Disable IRQ, FIQ. */退出的时候它会恢复BIC R0, R0, #0xC0 \n\t /* Enable IRQ, FIQ. */如果中断的优先级比这个低那么该中断就变得不可控就不能调用系统级别的一些接口容易造成系统崩溃。调用FromISRAPIconfigASSERT死循环卡死立即在 API 入口处调用非FromISRAPI篡改调度器 TCBPendSV 跳转非法地址中断退出后进入HardFault忽略断言强行调用内核链表指针损坏产生野指针随机在下次遍历链表时触发 HardFault进入临界区保护 会忽略优先级比较低的中断 但是在实际的代码执行的过程中 没有发现丢过中断呢1. 核心原因NVIC 的“挂起Pending”机制硬件锁存2. 临界区的“极短时间窗口”概率原因3.你真的“没有丢”吗—— 聊聊“合并丢失”的盲区4. 电平触发的中断绝对“不会丢”5.5. 针对“优先级0中断”的特殊情况1. 正常执行期间text中断到达 ↓ NVIC 置 pending ↓ 处理器尝试进入异常 ↓ 检查 BASEPRI / 优先级 ↓ 优先级数值 2 ? → 被 BASEPRI 屏蔽 ↓ 不进入 ISR保持 pending ↓ 继续执行当前代码 ↓ 直到退出临界区BASEPRI 恢复 ↓ pending 的中断才进入 ISR这个理解是对的不会丢也不是完全不可见而是 pending 延迟执行。2. WFI 期间关键区别在这里text中断到达 ↓ NVIC 置 pending ↓ 唤醒 WFI ← 注意这里不看 BASEPRI ↓ CPU 退出睡眠继续执行 WFI 后面的指令 ↓ 处理器尝试进入异常 ↓ 检查 BASEPRI / 优先级 ↓ 优先级数值 2 ? → 被 BASEPRI 屏蔽 ↓ 不进入 ISR保持 pending ↓ 继续执行 WFI 后面的代码 ↓ 直到退出临界区BASEPRI 恢复 ↓ pending 的中断才进入 ISR所以WFI 会被这个被屏蔽的中断唤醒但唤醒后不会立刻执行 ISR中断仍然是 pending 状态等 BASEPRI 放开后才真正进入 ISR3. 对比总结场景中断到达后是否唤醒 WFI是否进入 ISR最终结果正常执行BASEPRI 屏蔽pending不涉及否延迟到 BASEPRI 放开WFI 睡眠BASEPRI 屏蔽pending是否先唤醒再延迟到 BASEPRI 放开正常执行优先级数值 2pending不涉及是立即抢占立即执行WFI 睡眠优先级数值 2pending是是立即进入 ISR立即执行4. 你图里“WFI 等待条件”应该怎么理解不是WFI 等待 BASEPRI 检查通过而是WFI 等待“有中断 pending”这个事件。至于这个中断能不能进 ISR是唤醒之后才由 BASEPRI / 优先级决定的。所以更准确的说法是WFI 的唤醒条件中断使能 变成 pendingISR 的进入条件中断使能 pending 优先级高于当前 不被 PRIMASK/BASEPRI 屏蔽
返回列表