版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。http://blog.csdn.net/wfq0624
1.1__main()代码执行分析
以keyled程序为例说明,keyled代码请参考我的博客网址:http://my.csdn.net/wfq0624/code/detail/7645
程序经过汇编启动代码,执行到__main()后,可以看出有两个大的函数:
__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。
__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。
分析__scatterload()函数
执行到__main(),先跳转到_scatterload下图红框框中代码所示,执行完后,R10和R11就被赋给成了下面两个值。
Map文件中的symbol
Region$$Table$$Base 0x00000394 Number 0anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x000003b4 Number 0anon$$obj.o(Region$$Table)
然后执行_scatterload_null代码,将R10对应地址存放的的4个字copy到R0~R3中,可以看出
R0:0x1000表示的是keyled.o加载域起始地址
R1:0x30000100为keyled.o运行域地址
R2:0X160为copy的大小,keyled.o的大小从map文件中得知就是0x160 Byte
R3:0X1E4 是_scatterload_copy 代码的起始地址,实用BXR3 就能跳转到_scatterload_copy来复制代码。
跳到_scatterload_copy,开始copy,循环0x16次,每次搬移4个字(16Byte),共搬移0x16*0x10=0x160
复制完keyled.o代码后,进一步循环到_scatterload_null准备好,ZI段需要清零的地址和范围
执行完这个循环后
R1:0x30050000 为ZI段的起始地址
R2:0x618为ZI段大小,换成十进制是1560.从map文件得知ZI大小就是1560Byte
R3:0x20c 为_scatterload_zeroinit 的地址
执行下面红框框中循环体,共清零0x610Byte范围,然后再执行蓝框框中代码,清零8Byte,总共0x618
ZI段清零(0x30050000~0x30050618)
然后使用BX R14跳转到0x000001BC处,顺序执行到BL __rt_enty 指令
成功跳转到__rt_enty函数
分析__rt_entry()函数
先调用__user_setup_stackheap()函数来建立堆栈
可以看出在这个函数中,会执行到BL__user_initial_stackheap()函数,这样也就明白了,为什么使用分散加载文件,需要设置__user_initial_stackheap这个函数来设置堆栈空间。
分享到:
相关推荐
Keil_ARM_MDK_5.00_Keygen_serial_Crack.exe,KEIL最新序列号
keil全系列破解用工具(Keil_ARM_MDK_5.00_Keygen_serial_Crack),要用管理员权限使用
最近使用新版本的MDK,发现Ti的Stellaris ICDI调试器选项没了,因此TIVA C就无法直接使用keil来调试了。原来是新版本529之后都被移除了,但是keil官方有给出独立的调试器安装包,安装后就可以继续使用了。
RealView_MDK_2440_快速开发快速入门RealView_MDK_2440_快速开发快速入门
MDK最详细中文手册。keil是目前应用最广的编译软件,可编译包括51和ARM处理器在内的大多数处理应用程序。本文档详细说明了软件的基本使用以及一些高级应用说明。
MDK_ARM裸奔笔记之UART(查询发送&中断接收)_PC端_源代码 VS2005 自己写的,不喜勿下
CooCox_Colink_MDK_Plugin_V1.81_Setup,用于安装keil上的coocox仿真器的驱动程序
keil_MDK_and_keygen_new_安装说明.zip
1 - Install mdk315b 2 - Replace the files: \Keil\ARM\BIN\ARM.DLL with one from mdk305a\Keil\ARM\BIN\ARM.DLL \Keil\ARM\BIN31\ARM.DLL with one from mdk305a\Keil\ARM\BIN30\ARM.DLL \Keil\UV3\UV3.DLL ...
SeggerEval_STM32F103_MB672_CM3_KEIL_MDK_GUI_OS_120425
STM32_MDK启动代码分析(精)STM32_MDK启动代码分析(精)STM32_MDK启动代码分析(精)
MDK_PACK.zipMDK_PACK.zipMDK_PACK.zipMDK_PACK.zipMDK_PACK.zipMDK_PACK.zip
C语言二维码(QR)生成代码, MDK环境下使用! 可直接生成二维码
MDK_5官方用户手册。MDK是一个功能强大但易于学习和使用的开发系统。它由MDK-Core和软件包组成,可以根据应用程序的需求下载和安装它们。
Keil_RealView_MDK_4.50官方原版及注册机下载地址+安装破解教程
MDK_STM32例程 包括USB_test,Uart_test,spi_test等
STM32 keil mdk启动代码发分析_转2010年01月29日 星期五 13:50 ;// <h> Stack Configuration ;// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ;// </h> Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA ...
Keil_RealView_MDK_4.50官方原版下载地址+注册机+安装破解教程,笔者已经验证可用,内涵注册机。
一套自己用的配色方案,增加了一些常用关键字,使用了自由软件的雅黑字体(压缩包中带),在Keil_ARM_MDK_5.26.2下配的,其它版本也能用。 修正了上一个版本的中有几个地方不合理的配色。因为上传了的资源不能改,...
采用KEIL MDK开发环境,实现USB下的HID人类接口驱动程序,内附全部源码,欢迎交流!