打印

stm32+ucos2的bootloader 在application 代码跑 ucos2 死机,是msp psp 的...

[复制链接]
1271|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljxh401|  楼主 | 2021-6-4 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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
}


使用特权

评论回复

相关帖子

沙发
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)();
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

220

帖子

3

粉丝