STM32L431启用CRC后FreeRTOS的osDelay失效,任务调度异常
检查中断优先级冲突
FreeRTOS要求系统核心中断(如SysTick)的优先级高于用户中断(包括定时器中断),否则调度器无法正常切换任务。启用CRC后,排查MX_CRC_Init()是否无意中修改了NVIC的中断优先级配置,特别是定时器中断的抢占优先级是否超过configMAX_SYSCALL_INTERRUPT_PRIORITY的设置。如果定时器中断优先级过高,在回调中调用FreeRTOS API会触发未定义行为,导致调度器挂起、osDelay失效。排查定时器回调与CRC的交互
若LifetimerHandle对应的定时器回调函数中涉及CRC计算操作,检查是否存在访问冲突、异常触发(如硬Fault)。可通过调试器查看回调执行时的调用栈,确认是否在CRC操作阶段出现异常,导致任务调度被阻塞。验证MX_CRC_Init()的副作用
查看MX_CRC_Init()的具体代码,确认它仅配置CRC单元,未修改SysTick、定时器或NVIC的其他寄存器。部分HAL库版本存在初始化外设时误操作其他资源的bug,比如错误开启/关闭定时器时钟、修改中断分组等。检查FreeRTOS调度器状态
出现问题时,通过调试器读取FreeRTOS的uxSchedulerSuspended变量,确认调度器是否被意外挂起。若该变量非0,说明调度器未正常运行,osDelay自然无法触发任务切换。切换为软件定时器测试
如果当前使用的是硬件定时器,尝试改为FreeRTOS软件定时器(通过osTimerNew创建时指定osTimerPeriodic或osTimerOnce,依赖调度器管理)。软件定时器不涉及硬件中断优先级问题,可快速排查是否为硬件定时器与CRC的资源冲突。重新检查定时器配置
确认LifetimerHandle的创建参数(如优先级、栈大小)是否合理。启用CRC后,系统资源占用变化可能导致定时器任务栈溢出,可适当增大定时器任务的栈空间(通过configTIMER_TASK_STACK_DEPTH调整)。
内容的提问来源于stack exchange,提问作者wiwaneored

