stm32+ucos2的bootloader 在application 代码跑 ucos2 死机,是msp psp 的...
在bootloader使用ucos2+串口和电脑的超级终端 传输文件 iap,结果文件传输成功 但是 app 端进入的main函数能输出东西,进入app的ucos 就死翘翘了,这个是 bootloader 的跳转程序
__asm void __set_MSP(INT32U mainStackPointer)
{
msr msp, r0
bx lr
}
void BootLoader_Jump(void){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SRcpu_sr = 0;
#endif
INT32U msp,reset;
OS_ENTER_CRITICAL();
msp=*(INT32U*)APP_ADDR;
reset=*(INT32U*)(APP_ADDR+4);
//printf("msp:%08X reset:%08X\r\n",msp,reset);
NVIC_SETPRIMASK();
NVIC_SetVectorTable(NVIC_VectTab_FLASH, APP_ADDR-NVIC_VectTab_FLASH);
__set_MSP(msp);
((void(*)())reset)();
}
这个是 app 的程序,printf("addr:%08X\r\n",__RED_PC()); 这段代码能运行到,进入ucos2跑不到任务里面
int main(void)
{
INT8U err;
//重新设定中断指向
NVIC_Configuration();
RCC_Configuration();
//各个优先级一样,不支持中断嵌套,免得出现堆栈溢出的问题,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
OSInit();
RemapUSART1AtPB6PB7();
UartInit(USART1,115200,0,0); //打开串口接收中断
printf("addr:%08X\r\n",__RED_PC());
SetSysTick();
CREATE_TASK(DemoTask,200,c_prio_demo);
OSStart(); /* Start multitasking */
return 0;
}
后面想是不是 因为我的 bootloader 启动了 ucos2 的任务 切换到 PSP 堆栈,在PSP 堆栈跳转出问题了
我将 bootloader 里面的代码 的msp 改为 psp,因为 应用app 端的 main 实际也是运行在 psp堆栈里面,
结果 还是 没有能启动任务程序
__asm void __set_MSP(INT32U mainStackPointer)
{
msr psp, r0
bx lr
}
自己给自己解答:
ucos start 时候 会使用 psp
ucos默认main 是 msp 的,所以 它将 psp 设置为0然后启动 pensv 中断,
因为我的main 是 psp 的 所以出错了
解决方法 就是在 将 跳转代码切换为 msp 代码如下:
void BootLoader_Jump(void){
INT32U msp,reset;
__SETPRIMASK(); //关中断
__MSR_CONTROL(0); //切换为 msp
msp=*(INT32U*)APP_ADDR; //读取 app 的msp 数值
reset=*(INT32U*)(APP_ADDR+4); //读取 app 的reset 向量
NVIC_SetVectorTable(NVIC_VectTab_FLASH, APP_ADDR-NVIC_VectTab_FLASH);
__MSR_MSP(msp);
((void(*)())reset)();
}
页:
[1]