问题描述
系统上电启动后,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等)。