前提:其中有一个跳转函数一般都叫do_boot();
在项目中我发现不跑RTOS时,使用do_boot();可以正确跳转到正确位置,但是在freertos中调用do_boot();不会正确跳转,反而bootloader会不断的reset;
为什么会这样呢?
原因:
1. 中断未禁用
FreeRTOS 运行时,通常有多个中断在执行任务调度和系统管理。如果你在调用 do_boot
时没有禁用中断,FreeRTOS 的调度器可能会继续运行,导致系统状态混乱,进而引发重置。
解决方法: 在调用 do_boot
之前,禁用中断。
2. 任务和中断资源释放
FreeRTOS 中的任务可能会占用硬件资源(如定时器、外设),如果在这些资源仍然被任务占用的情况下执行引导程序,可能会引发不期望的行为,导致重置。
解决方法: 在执行 do_boot
之前,确保停止所有任务和中断,释放所有硬件资源。可以通过以下方式暂停所有任务。
综上所述:
vTaskSuspendAll();
taskDISABLE_INTERRUPTS();
do_boot();
在使用do_boot();前挂起所有任务以及禁止中断;
如有不对的地方请在评论区指出,谢谢。