打印
[STM32F1]

bootloader使用了 ucos2 导致 应用程序 ucos2 没有跑起来

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



使用特权

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

本版积分规则

49

主题

220

帖子

3

粉丝