- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 - 推酷
原文
搜索
登录
推酷
文章
站点
主题
公开课
活动
客户端 荐
周刊
编程狂人
设计匠艺
一周拾遗
更多
讨论区
关于我们
IAP升级功能编写初期的一些
困惑与疑问---完成功能后的总结
时间 2014-06-18 16:46:58 CSDN博客
/super_demo/article/details主题 技术
一,网上下载的例程,跳转部分的代码有差异,尤其是用的汇编那句
eg:
①Jump_To_Application = (pFunction)(*(vu32*) (IAPSTART + 4));
__MSR_MSP(*(vu32*) IAPSTART);
Jump_To_Application();
跟踪__MSR_MSP(一般这个函数都在库文件里有,跟踪不到就用搜索找)找到汇编函数为
__MSR_MSP
MSR MSP, r0 ; set Main Stack value
BX r14
②//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)0x2FFE0000)==0//检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);//用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr);//初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地
址)
jump2app();//跳转到APP.
}
}
跟踪MSR_MSP找到函数为
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0//set Main Stack value
BX r14
}
③
//判断用户是否已经下载程序,因为正常情况下此地址是栈地址。
//若没有这一句的话,即使没有下载程序也会进入而导致跑飞。
if (((*(__IO uint32_t*)ApplicationAddress) 0x2FFE0000 ) == 0
{
SerialPutString(Execute user Program\r\n\n);
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
跟踪 __set_MSP 找到函数为
__ASM void __set_MSP(uint32_t mainStackPointer)
{
msr msp, r0
bx lr
}
总结以上发现都是操作ARM的R0跟R14(LR)寄存器。
还有一种不太一样的,就是stm32F4的库函数中的跳转,如下所示
④
//测试用户app地址是不是在APPLICATION_ADDRESS位置。检测栈顶的地址,来检验app是否下
载成功
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) 0x2FFE0000 ) == 0
{
//APPLICATION_ADDRESS + 4对应的是app中断向量表的第二项,复位地址
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
//把地址强转为函数指针
Jump_To_Application = (pFunction) JumpAddress;
//设置主函数栈指针
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
//调用函数,实际失去app复位地址去执行复位操作
Jump_To_Application();
}
跟踪 __set_MSP 找到函数为
static __INLINE void __set_MSP(uint32_t topOfMainStack)
{
register uint32_t __regMainStackPointer __ASM(msp);
__regMainStackPointer = topOfMainStack;
}
对于M4的这个库函数我也 不 太懂,感觉最终的操作应该跟其他的一样吧
二,关于跳转部分的代码的理解(转
您可能关注的文档
- GSAR_All_2000.pdf
- GTK+ and Glade3 GUI Programming Tutorial--中文系列.pdf
- GS-8800射频一致性测试系统介绍.pdf
- GROMACS上如何进行GPU加速.pdf
- G_ZG_螺距_大小径对照表.pdf
- GUI使用说明V1.6.pdf
- GRE高频600词汇总:O—Q.pdf
- H Inferring protein-protein interactions through high-throughput interaction data from dive.pdf
- H25C80Ⅲ-D 规格书 20130429.pdf
- H3C_MSR系列路由器_软件激活指导-5W100-正文.pdf
文档评论(0)