• (转载)app和bootloader跳转 MSP与PSP


    1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了

    2.如果你的APP使用了ucos系统,在跳转函数中还需要增加__set_CONTROL(0);//把psp修改成msp;这样是为了把ucos系统中的psp置回msp,否则容易出现硬件中断

    MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13

    这意味着同一个逻辑地址,实际上有两个物理寄存器,一个为MSP,一个为PSP,在不同的工作模式调用不同的物理寄存器

    没有操作系统内核PSP与MSP模式:

    R13的值与MSP值相同,内核使用MSP

    带UCOSII操作系统内核PSP与MSP模式:

     

    带操作系统运行任务的时候R13值与PSP相同,内核使用PSP

    带操作系统进入中断的时候R13值与MSP相同,内核使用MSP

    所以内核是PSP还是MSP总结为:

    1)不使用OS时: 只用到MSP(中断和非中断都使用MSP);
    2)使用OS时(如UCOSII): main函数和中断使用MSP; 各个Task(线程)使用PSP(即任务栈);

    当带操作系统从APP区跳转到BOOT区的时候需要将SP设置为MSP,否则在BOOT区中使用中断将会引发硬件错误!

    如果在APP中打开了看门狗那么当跳转到BOOT中时也需要定时喂狗,否则会触发看门狗超时复位!

    ------------------------------------------------------------------文章2------------------------------------------------------------------

    Question:
    最近在搞STM32 的IAP。发现一个很奇怪的问题。
    程序A里面,跳转到程序B执行。
    A存放在0x08000000,B存放在0x0800e000.
    起初,B使用的内存大概6K,其中堆栈使用了4K。此时如果从程序A跳到程序B,B出现死机。但是如果用仿真器直接运行B是可以运行的。
    实在不知道什么问题,后来B的堆栈改小,设为1K,这是就正常了。能从程序A跳转到程序B,并且B也能正常运行。
    请问这是什么原因?程序B的运行为什么后它的内存大小的影响呢?
    片子是STM32F103R8T6.
    高手解答!! 谢谢了。
    ----------------------------------------------------------------------------------
    Answer:
    感觉是你在跳转到B的时候没有把程序B的主堆栈进行初始化,这样程序B在运行的时候还在使用程序A的堆栈指针,很可能会与程序B的全局变量区混到一起了,执行情况就没法预知了,会有某些奇怪现象发生。
    ----------------------------------------------------------------------------------
    A程序用了ucos2,而且不是在中断里跳转到B,那应该是在某个任务里跳转的吧。ucos2的官方移植版本,任务里使用的堆栈指针是PSP,如果你的A 程序是在使用PSP的任务里跳转到B程序的,那么函数void JumpBootloaderProgram(void)中的__set_MSP(*(volatile unsigned int*) ApplicationAddress)函数并没有使跳转到B后的堆栈指针初始化为主堆栈指针,即跳转到B后还是使用的程序A的PSP,问题可能会出在这 里。
    ----------------------------------------------------------------------------------
    还得再啰嗦几句,楼主所说的“把PSP和MSP都重新设置”指的是在函数JumpBootloaderProgram中又加入了一句 __set_PSP(*(volatile unsigned int*) ApplicationAddress)吗?如果是这样,貌似跳转到B之后还有隐患,因为由A跳到B后,主程序用的是PSP,而中断服务程序仍要使用 MSP,因为CM3的中断服务是“处理模式”,只能使用MSP。如果在跳转到B之前把MSP和PSP设为同样值的话,那么B程序的中断服务程序在使用堆栈 的同时,很可能也改写了主程序的堆栈中的内容。所以我觉得最好在由A跳转到B之前,在调用__set_MSP(*(volatile unsigned int*) ApplicationAddress)之前,把当前使用的堆栈指针由PSP改回MSP,然后再设置MSP,再跳转,这样比较好一些,跳转到B之后,无论 主程序还是中断服务程序都只使用MSP,也就不会冲突了。
    ----------------------------------------------------------------------------------
    恩。多谢高手指点。呵呵。
    在这里虚心接受建议。
    我现在这样改,应该就不会有问题了吧?
        JumpAddress = *(volatile unsigned int*) (ApplicationAddress + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        __set_PSP(*(volatile unsigned int*) ApplicationAddress);
        __set_CONTROL(0);
        __set_MSP(*(volatile unsigned int*) ApplicationAddress);
        Jump_To_Application();

    转载自:app和bootloader跳转 MSP与PSP - yeshenmeng - 博客园 (cnblogs.com)

  • 相关阅读:
    软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day4)
    软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day3)
    201521123066 《Java程序设计》第十二周实验总结
    201521123066 《Java程序设计》第十一周学习总结
    201521123066 《Java程序设计》第十周学习总结
    201521123066 《Java程序设计》第九周学习总结
    201521123066《Java程序设计》第八周学习总结
    201521123066《Java程序设计》第七周学习总结
    201521123066 《Java程序设计》 第六周学习总结
    201521123066《Java程序设计》第五周学习总结
  • 原文地址:https://www.cnblogs.com/mickey-double/p/15060565.html
Copyright © 2020-2023  润新知