在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_SR cpu_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
}
|