ljxh401 发表于 2021-6-4 15:59

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
}


ljxh401 发表于 2021-6-4 23:02

自己给自己解答:
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]
查看完整版本: stm32+ucos2的bootloader 在application 代码跑 ucos2 死机,是msp psp 的...