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();
文章转载自:http://www.360doc.com/content/12/0530/22/532901_214850938.shtml
app和bootloader跳转 MSP与PSP的更多相关文章
- Cortex-M3双堆栈MSP和PSP+函数栈帧
为了防止几百年以后找不到该文章,特此转载 ------------------------------------------------开始转载--------------------------- ...
- iOS中两个APP之间的跳转和通信
app间的跳转 一:在第一个app首先要做下面这些操作: 1.在info.plist文件中的Information Property List下添加一项:URL types. 2.点开URL type ...
- iOS APP之间到跳转,以及热门应用,手机自带到应用跳转
应用之间的跳转 在第一个APP中,做如下操作:1.在info.plist文件中的"信息属性列表"下添加一项:"URL类型"; 2.点开"URL类型&q ...
- Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32)
Bootloader 跳转到 RT-Thread 或 FreeRTOS(基于 STM32) 作者:猾蚁 QQ:7376220一.Bootloader 程序1. 准备好升级程序项目,可以使用 STM32 ...
- 在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用
在UC浏览器打开链接唤醒app,假设没有安装该app,则跳转到appstore下载该应用 须要在project中设置例如以下: 1.打开project中的myapp-Info.plist文件 2.打开 ...
- app之间的跳转和传参问题
app 之间跳转和传参: 首先 创建2个app formApp (需要跳转到另外app的项目) toApp(被跳转的项目) 一:在toApp 项目中的操作: 1:创建URLSchemes ...
- 用weexplus从0到1写一个app(2)-页面跳转和文章列表及文章详情的编写
说明 结束连续几天的加班,最近的项目终于告一段落,今天抽点时间开始继续写我这篇拖了很久的<用weexplus从0到1写一个app>系列文章.写这篇文章的时候,weexplus的作者已经把w ...
- 从Cortex-M3的MSP 和PSP谈Linux能否在中断中使用Sleep
1.Cortex-M3 的PSP和MSP 曾经在STM32上使用过RT thread和uC/OS,对于任务切换代码一直是一知半解,没有自己手动写出来过,对于任务切换后的ORR LR, LR, #0 ...
- MSP与PSP
摘抄自Triton.zhang——eeworld 1. MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13 2. 权 ...
随机推荐
- Android之socket客户端
接收数据不要用readline(),用read() Socket mSocket = new Socket("192.168.1.100", 8888); DataInputStr ...
- 【4Opencv】如何识别出轮廓准确的长和宽
问题来源: 实际项目中,需要给出识别轮廓的长度和宽度. 初步分析: 轮廓分析的例程为: int main( int argc, char** argv ){ //read the image ...
- JavaScript中this的用法 及 如何改变this的指向
要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识. var fun = function(){ var flag = 1; console.log(fl ...
- 网络 --- 1 c/s (b/s)架构 ip 初始socket
一.c/s b/s c/s架构:客户端(client)/服务器(server) 软件cs架构:微信,陌陌,qq等 硬件cs架构:打印机 b/s架构:浏览器(browser)/服务器(server) ...
- C#操作字符串方法总结
/* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ####### ...
- cygwin下如何运行crontab定时脚本?
1. 安装cron服务(如果不能启动,使用管理员身份运行cygwin) cygrunsrv -I cron -p /usr/sbin/cron -a -D -I 是安装 cron是服务名 -p /us ...
- Nacos整合Spring Cloud Gateway实践
Spring Cloud Gateway官网:http://spring.io/projects/spring-cloud-gateway Eureka1.0的问题和Nacos对比:https://w ...
- P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
思路 和YY的GCD类似但是更加简单了 类似的推一波公式即可 \[ F(n)=\sum_{n|d}f(d) \] \[ f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) \] \ ...
- python3.6配置libsvm2.2
参考自:https://blog.csdn.net/weixin_35884839/article/details/79398085 由于需要使用到libsvm,所以开始配这个,所幸一次性就成功了. ...
- HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...