IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 - 推酷.pdfVIP

IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 - 推酷.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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的这个库函数我也 不 太懂,感觉最终的操作应该跟其他的一样吧 二,关于跳转部分的代码的理解(转

文档评论(0)

l215322 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档