主要问题是在于FreeRTOS的堆栈使用问题,在从app跳转到Boot的时候,堆栈没有复位的问题
stm32有两个堆栈,一个是主堆栈MSP,另一个是进程堆栈PSP
在FreeRTOS中,主堆栈MSP是用于系统栈空间,进程堆栈PSP是给任务栈使用的,在从app跳转回Boot的时候,只是重置了MSP
没有对PSP进行重置,使用了FreeRTOS的app跳转到boot,很大的可能原因就是堆栈问题,在跳转回boot的时候重新设置堆栈指针
__set__PSP(*(volatile unsigned int *)bootloader_address); // bootloader_address: 堆栈的起始地址
__set__CONTROL(0); //选择堆栈指针为主堆栈,1是PSP
__set__MSP(*(volatile unsigned int *)bootloader_address);
就没问题了
#好好学习!