首页 在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处

在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处

举报
开通vip

在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处 我们都知道Cortex-M3的启动和以前的内核启动不一样,如arm7的内核,在 flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处。而Cortex-M3的flash的第一个地址0x0800 0000处存放的是初始默认的堆栈指针的地址(大 容量的一般是0x2000 0400),在0x0800 0004处存放的是一个地址,所以内 核上电后,它会先从0x0800 0004处取出地址,并跳转到这个地址处,也就是 初始代码的地址处 __iar_p...

在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处
在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处 我们都知道Cortex-M3的启动和以前的内核启动不一样,如arm7的内核,在 flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处。而Cortex-M3的flash的第一个地址0x0800 0000处存放的是初始默认的堆栈指针的地址(大 容量的一般是0x2000 0400),在0x0800 0004处存放的是一个地址,所以内 核上电后,它会先从0x0800 0004处取出地址,并跳转到这个地址处,也就是 初始代码的地址处 __iar_program_start,这就是启动代码的入口:在 startup_stm32f10x_hd.s中。 __iar_program_start: 08000C20 F7FFFFD5 BL __low_level_init ;跳转到 __low_level_init 08000C24 2800 CMP R0, #0x0 08000C26 D001 BEQ __iar_init$$done 08000C28 F7FFFFDE BL __iar_data_init2 __iar_init$$done: .text_2: 08000C2C 2000 MOVS R0, #0x0 08000C2E F7FFFA7F BL main __low_level_init中,下划线的部分是源程序,也即是在startup_stm32f10x_hd.s中的代码 __low_level_init: 08000BCE 4804 LDR R0, [PC, #0x10] MOV R11, LR 08000BD0 46F3 MOV R11, LR BLX R0 08000BD2 4780 BLX R0 ;跳转到SystemInit_ExtMemCtl处, SystemInit_ExtMemCtl是初始化外部储存器的一段代码。 PUBWEAK SystemInit_ExtMemCtl 作用就是当用到外部sram的时候,就转到 system_stm32f10x.c中,执行void SystemInit_ExtMemCtl(void) 函数(前提 是 #define DATA_IN_ExtSRAM 要打开),而不用外部sram时,就执行 startup_stm32f10x_hd.s中的SystemInit_ExtMemCtl。 LDR R1, =sfe(CSTACK) ; restore original stack pointer 08000BD4 4903 LDR R1, [PC, #0xC] MSR MSP, R1 08000BD6 F3818808 MSR MSP,R1 ;把堆栈指针存入r13中 MOV R0,#1 08000BDA F04F0001 MOV R0, #0x1 BX R11 08000BDE 4758 BX R11 ;返回到__iar_program_start:,执 行__iar_data_init2,初始化数据,一般是全局变量 __iar_data_init2: 08000BE8 B510 PUSH {R4,LR} 08000BEA 4804 LDR R0, [PC, #0x10] 08000BEC 4C04 LDR R4, [PC, #0x10] 08000BEE E002 B 0x8000BF6 08000BF0 F8501B04 LDR R1, [R0], #0x4 08000BF4 4788 BLX R1 08000BF6 42A0 CMP R0, R4 08000BF8 D1FA BNE 0x8000BF0 08000BFA BD10 POP {R4,PC} ;初始化完成后,把LR压入 PC继续先下执行,看看上面执行到哪了,下一条就是__iar_init$$done了,再 执行到main了,也就是进入我们的main()函数了。 08000BFC BC0B0008 DC32 0x08000BBC 08000C00 CC0B0008 DC32 0x08000BCC __iar_zero_init2: ; 对全局变量清零,从我们自己定义的堆栈处向上清零,个数有全局变量占的空间 决定 08000C04 2300 MOVS R3, #0x0 08000C06 E005 B 0x8000C14 08000C08 F8501B04 LDR R1, [R0], #0x4 08000C0C F8413B04 STR R3, [R1], #0x4 08000C10 1F12 SUBS R2, R2, #0x4 08000C12 D1FB BNE 0x8000C0C 08000C14 F8502B04 LDR R2, [R0], #0x4 08000C18 2A00 CMP R2, #0x0 08000C1A D1F5 BNE 0x8000C08 08000C1C 4770 BX LR 08000C1E 0000 MOVS R0, R0 注意的是,__iar_data_init2:等的代码在 __exit 0x08000c51 0x14 Code Gb exit.o [5] __iar_data_init2 0x08000be9 0x1c Code Gb data_init2.o [4] __iar_program_start 0x08000c21 Code Gb cmain.o [4] __iar_sh_stdout_close 0x08000c39 0x14 Code Gb iarwstd.o [5] __iar_sh_stdout_handle 0x20009660 0x4 Data Lc iarwstd.o [5] __iar_zero_init2 0x08000c05 0x1a Code Gb zero_init2.o [4] __low_level_init 0x08000bcf Code Gb startup_stm32f10x_hd.o [1] 自己看看map文件吧。 这写就是我自己的理解。嘿嘿,希望对初学者有点帮助
本文档为【在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_963767
暂无简介~
格式:doc
大小:17KB
软件:Word
页数:4
分类:
上传时间:2017-11-14
浏览量:32