; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
复位之后 先SystemInit然后 再执行_main函数
进入__main后,先后调用的两个函数是__scatterload_rt2_thumb_only 和__rt_entry_sh。
跳到__user_initial_stackheap是为了获取有关堆栈的地址信息:
.总的来说,从上电到main函数之前,编译器为我们把RW段从加载域搬运到运行域,清零ZI段;设置好堆栈指针,初始化C库要用的的一些内存空间,设置浮点数状态字,做好一切初始化工作之后就跳到main函数执行,看来main函数前还是有很多活要干的,不是原来所想像的main就是C语言的入口这么简单。
一个ARM程序包含3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
由以上3点说明可以理解为:
RO就是readonly,
RW就是read/write,
ZI就是zero