在main()之前-IAR都做了啥.pdfVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在main()之前-IAR都做了啥

[原创]在main()之前,IAR都做了啥? 最近要在Cortex-M3上写一个简单的操作系统,打算使用IAR,为了写好启动代码,花了一些时间了解了 IAR在main()以前做了些什么事。 首先系统复位时,Cortex-M3从代码区偏移0获取栈顶地址,用来初始化MSP寄存器的 值。 接下来从代码区偏移0取第一个指令的跳转地址。这些地址,是CM3要求放置中断向量表的 地方。 这里是一个程序的启动区的反汇编: __vector_table: 2600 2000 7E1D 0800 这个程序是由IAP程序来启动的,IAP程序获取0的MSP值(0,并设置为MSP 的值,即主堆栈最大范围是00x200025FF。接下来IAP程序获取0的 Reset_Handler的地址(0x08007E1D),并跳转到Reset_Handler()执行。 IAP在这里完全是模仿了Cortex-M3的复位序列,也就是说,在没有IAP的系统上,CM3只能从 0取MSP,从0取第一条指令所处地址。而IAP就存在在0个 地址上,IAP的启动,已经消耗掉了这个复位序列,所以IAP要启动UserApp程序的时候,也是完全模仿 Cortex-M3的复位序列的。 接下来我们看看复位后第一句指令——Reset_Handler()函数里有什么。 若我们使用的是ST公司标准外设库,那么已经有了现成的Reset_Handler,不过他是弱定义 ——PUBWEAK,可以被我们重写的同名函数覆盖。一般来说,我们使用的都是ST提供的Reset_Handler, 在V3.4版本的库中,可以在startup_stm32f10x_xx .s 中找到这个函数: PUBW EA K Reset_Handler SECTION .text :CODE:REORDER(2) Reset_Handler LDR R0, SystemInit BLX R0 LDR R0, __iar_program_start BX R0 看来ST没有做太多的事,他只调用了自家库提供的SystemInit函数进行系统时钟、Flash读取的初始化, 并把大权交给了__iar_program_start这个IAR提供的“ 内部函数”了,我们就跟紧这个 __iar_program_start跳转,看看IAR做了什么,上面一段代码的反汇编如下: Reset_Handler: __iar_section$$root : 08007E1C 4801 LDR R0, [PC, #0x4]; LDR R0, SystemInit 08007E1E 4780 BLX R0;BLX R0 08007E20 4801 LDR R0, [PC, #0x4];LDR R0, __ iar_program_start 08007E22 4700 BX R0;BX R0 08007E24 6C69 08007E26 0800 08007E28 7D8D 08007E2A 0800 细心的观众会发现地址是0x08007E1C,比我们查到的0x08007E1D差了1,这是ARM家族的遗留问 题,因为ARM处理器的指令至少是半字对齐的(16位T HUMB指令集 or 32位ARM指令集),所以PC指针的 LSB是常为0的,为了充分利用寄存器,ARM公司给PC的LSB了一个重要的使命,那就是在执行分支跳转 时,PC的LSB 1,表示使用T HUMB模式,LSB 0,表示使用ARM模式,但在必威体育精装版的Cortex-M3内核 上,只使用了T HUMB-2指令集挑大梁,所以这一位要常保持1,所以我们查到的地址是 0x08007E1D(C 1100,D 1101),放心,我们的CM3内核会忽略掉LSB(除非为0,那么会引起

文档评论(0)

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

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

1亿VIP精品文档

相关文档