FReeRtos中断管理优先级中断优先级数值越小越优先所有优先级配置为抢占优先级选4组SysTick 滴答定时器中断作用系统时钟节拍统计任务延时、阻塞时间每隔1ms常用进一次中断给系统计时2PendSV 可挂起系统调用中断作用专门用来做任务上下文切换所有任务切换全都在 PendSV 里完成FreeRTOS 要求PendSV 优先级 最低SysTick 优先级 PendSV所有业务中断优先级 SysTick原因PendSV 优先级最低保证只有所有高优先级中断全部执行完、没事干了才进来切换任务 避免中断跑一半被任务切换打断数据错乱、时序炸掉SysTick 比 PendSV 高一点滴答计时能正常跑不会被任务切换耽误系统节拍你的外部中断 / 定时器中断 优先级 SysTick紧急硬件事件优先响应不会被系统调度卡住开中断关中断portDISABLE_INTERRUPTS()只能关闭优先级 5 ~ 15逻辑优先级关不掉优先级 0 ~ 4逻辑优先级出现问题1.调用 portDISABLE_INTERRUPTS ()所有定时器中断全都关不掉直接填写逻辑值 5没有做硬件优先级移位FreeRTOS 判断阈值错误无法匹配真实中断优先级。定时器中断优先级设置错误设置为0~4 高优先级区间本身就不在屏蔽范围内。解决办法恢复 FreeRTOS 官方标准宏定义必须移位#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY (8 - configPRIO_BITS) )区分设置中断优先级需要被关闭的中断设置逻辑优先级≥5永久不被关闭的中断设置逻辑优先级≤4问题 2关闭中断后延时完成无法执行 portENABLE_INTERRUPTS ()无开中断打印故障原因portDISABLE_INTERRUPTS()关闭系统可管理中断后SysTick 系统节拍中断被屏蔽vTaskDelay()、HAL_Delay()均依赖 SysTick 中断计时关中断区间内使用系统延时 / 硬件延时函数会直接死锁代码卡死永远执行不到开中断代码解决办法关中断临界区内禁止使用任何系统延时、HAL 延时仅使用裸机空循环延时做短暂延时问题 3误以为填写优先级 4 就能被关闭实际无效故障原因混淆逻辑优先级和硬件真实优先级FreeRTOS 屏蔽规则只屏蔽逻辑优先级 5~150~4 属于硬件高优先级设计上禁止被任务关闭解决办法牢记区间划分屏蔽区间逻辑优先级5 ~ 15→ 可被portDISABLE_INTERRUPTS()关闭保护区间逻辑优先级0 ~ 4→ 任何任务关中断都无法关闭实验严格分区测试高优先级放 0-4普通中断放 5 及以上FreeRtos临界段保护本质为进去临界区关中断退出临界区开中断和临界区保护有本质区别临界区保护需要关中断进行挂起任务调度器只是关闭任务的切换不需要关闭中断