程序升级时跳转到应用程序的方法
来源:互联网 发布:淘宝智能版 一钻 编辑:程序博客网 时间:2024/05/16 14:26
从事单片机工作有几年了,对于单片机程序升级还是接触的不多,看别人写的两个程序,觉得在bootloader里跳转到应用程序方法还是挺不错了,先做下记录,怕以后忘记了。
首先来看看第一个
假设应用程序的入口地址为appadder,
void (*UserProgram)();//定义一个函数指针
UserProgram = (void (*)()) (appadder); //把应用程序入口地址赋给函数指针
(*UserProgram)();//调用一次函数指针,即跳转到应用程序入口,执行应用程序
这个方法在ARM7中使用没有问题
这里重点要理解指针函数和函数指针,区别的最简单的方法就是看*号是在括号里还是括号外,如果在括号里就是函数指针,就像上面void (*UserProgram)();就是个函数指针,如果是void *UserProgram();他就是个指针函数。
cortex-M3的做法会多一步,不但要初始化NVIC,还要初始化SP指针,因为两者所在的模式不同
定义一个跳转函数
void runApp(unsigned int addr)
{
unsigned int *p = (unsigned int *)addr;
unsigned int sp = *p++;
void (*func)(void) = (void (*)(void))*p;//把应用程序入口地址赋给函数指针
NVIC_DeInit(); //初始化NVIC
__MSR_MSP(sp);//
func();
while(1);
}
1、__MSR_MSP 的实现看 cortexm3_macro.s
2、汇编指令 MSP 的意义看 Cortex-M3 的指令手册
3、sp的含义,就是应用程序中断向量的含义了:偏移0=Initial SP,偏移4=Reset Vector,所以P装载为 addr ,SP装载为addr+4
这么做,相当于仿真了一个复位,只是这个复位后的 SP,PC 分别从目标镜像,也就是 addr开始的单元得到的,而不是真正的物理地址 0 , 另外,如果做得地道的话,应该要配置一下 NVIC 指向新的镜像的中断向量表,这里也做了,只是 ST 的代码一般都自带了 NVIC_Configuration 这么一个函数,所以只要在中断没有打开的情况下,在应用程序里面配置也是可以的,只是这样就和真正的复位相比而言,差了一步
首先来看看第一个
假设应用程序的入口地址为appadder,
void (*UserProgram)();//定义一个函数指针
UserProgram = (void (*)()) (appadder); //把应用程序入口地址赋给函数指针
(*UserProgram)();//调用一次函数指针,即跳转到应用程序入口,执行应用程序
这个方法在ARM7中使用没有问题
这里重点要理解指针函数和函数指针,区别的最简单的方法就是看*号是在括号里还是括号外,如果在括号里就是函数指针,就像上面void (*UserProgram)();就是个函数指针,如果是void *UserProgram();他就是个指针函数。
cortex-M3的做法会多一步,不但要初始化NVIC,还要初始化SP指针,因为两者所在的模式不同
定义一个跳转函数
void runApp(unsigned int addr)
{
unsigned int *p = (unsigned int *)addr;
unsigned int sp = *p++;
void (*func)(void) = (void (*)(void))*p;//把应用程序入口地址赋给函数指针
NVIC_DeInit(); //初始化NVIC
__MSR_MSP(sp);//
func();
while(1);
}
1、__MSR_MSP 的实现看 cortexm3_macro.s
2、汇编指令 MSP 的意义看 Cortex-M3 的指令手册
3、sp的含义,就是应用程序中断向量的含义了:偏移0=Initial SP,偏移4=Reset Vector,所以P装载为 addr ,SP装载为addr+4
这么做,相当于仿真了一个复位,只是这个复位后的 SP,PC 分别从目标镜像,也就是 addr开始的单元得到的,而不是真正的物理地址 0 , 另外,如果做得地道的话,应该要配置一下 NVIC 指向新的镜像的中断向量表,这里也做了,只是 ST 的代码一般都自带了 NVIC_Configuration 这么一个函数,所以只要在中断没有打开的情况下,在应用程序里面配置也是可以的,只是这样就和真正的复位相比而言,差了一步
0 0
- 程序升级时跳转到应用程序的方法
- android中跳转到系统管理应用程序界面的方法
- iOS 应用内跳转到应用程序的方法!
- IOS的Safari浏览器跳转到应用程序和应用程序应用内跳转到手机应用程序
- ubuntu中将程序的快捷方式添加到“应用程序”中的方法
- fedora中将程序的快捷方式添加到“应用程序”中的方法
- ios-应用程序跳转到指定的页面
- 如何从一个应用程序跳转到其他程序
- 跳转到某个应用程序
- 跳转到控制器的方法
- 应用程序自动升级程序
- C语言函数指针跳转到程序固定地址(0x8000)执行程序的方法
- C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法
- 判断应用程序运行状态,退出程序的方法,程序从后台恢复到前台
- 跳转到Android的程序卸载界面
- 有关程序版本升级的问题--升级到“妻子1.0”
- 升级到 MediaPlayer 11 时跳过验证副本的方法
- iOS 应用程序跳转到appstore
- 公司面试题——Android内存管理
- 复习1
- 初学java单例的理解
- 聚集索引&非聚集索引
- django 错误 : 'str' object is not callable 解决
- 程序升级时跳转到应用程序的方法
- Understanding Python's "with" statement
- 数据结构第一章知识点导图
- android错误之android.content.res.Resources$NotFoundException
- sublime text 2 注册码
- AdaBoosting流程及数学证明
- 周工作报告140915
- [MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据
- 关于java cxf的webservice,(restfurl可以)可用asix和cxf接收