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