记一次FreeRTOS的开发bug 问题描述系统上电启动后OLED 屏幕无法点亮保持全黑或者程序在启动阶段直接进入 HardFault 硬错误中断无法正常跳转到任务调度程序。在调试过程中发现原有的OLED_Init() 驱动中为了保证上电复位时序内部调用了 HAL_Delay() 或 vTaskDelay()。原因分析我在初始化的时候oled屏幕时候调用了vTaskDelay() 这个函数是 FreeRTOS 的 API其底层依赖于系统节拍SysTick和任务调度器。在执行 vTaskStartScheduler() 之前RTOS 内核尚未初始化任务列表为空调度器并未接管系统。此时调用任何 RTOS API 均属于非法操作。同时这个HAL_Delay()也不行HAL_Delay()通常在 SysTick 中断中调用。如果在内核启动前系统中断优先级配置未就绪或者 SysTick 还没被正确分配给 HAL 库HAL_Delay() 可能会导致死循环或直接跳过。解决方案在内核启动之前即 main 函数中 vTaskStartScheduler 之前的任何初始化代码我取消了调用任何系统 API调用vTaskDelay等。