ARM Starup.s Analysis
startup.s 文件主要完成三个工作:
- 堆栈以及堆的初始化
- 定位中断向量表
- 调用Reset Handler
ARM Cortex-m0 startup.s
Stack_Size EQU 0x0
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp EQU 0x20010000
;// <h> Heap Configuration
;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>
Heap_Size EQU 0x0
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8 ;below is 8 Bytes allign
THUMB ;below is THUMB code
; Vector Table Mapped to Address 0 at Reset
AREA |.vectors_table|, DATA, READONLY, ALIGN=8
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler()
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD SysOnIntrHandle
DCD WdgIntrHandle
DCD Timer0IntrHandle
DCD Timer1IntrHandle
DCD Timer2IntrHandle
DCD BlueWizIntrHandle
DCD HciDmaIntrHandle
DCD BzdmaIntrHandle
DCD CrossBarIntrHandle
DCD Gpio0IntrHandle
DCD Gpio1IntrHandle
DCD LogUartIntrHandle
DCD DataUartIntrHandle
...
;jump to excute function 'Reset_Handler'
Reset_Handler
PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit ;defined with C
IMPORT __main ;main entry
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
PROC 指令:
FUNCTION 指令标记函数的开始。 PROC 是 FUNCTION 的同义词。
语法 label FUNCTION [{reglist1} [, {reglist2}]]
其中: reglist1 是由被调用方保存的 ARM 寄存器的可选列表。 如果 reglist1 不存在,并且调试器检查寄存器使用情况,则调试器假定正在使用 AAPCS。 reglist2 是由被调用方保存的 VFP 寄存器的可选列表。
EXPORT 指令:
EXPORT 指令声明一个符号,可由链接器用于解析不同的对象和库文件中的符号引用。 GLOBAL 是 EXPORT 的同义词。 语法
EXPORT {[WEAK]}
EXPORT symbol {[attr}]}
EXPORT symbol [WEAK{,attr}]
其中: symbol 是要导出的符号名称。 符号名区分大小写。 如果省略了 symbol,则导出所有符号。
WEAK 仅当没有其他源导出另一个 symbol 时,才应将此 symbol 导入其他源中。 如果使用了不带 symbol 的 [WEAK],则所有导出的符号都是处于次要地位的。
attr
是下列项之一:
DYNAMIC 当源代码链接到动态组件中时,symbol 对于其他组件是可见的。
PROTECTED 当源代码链接到动态组件中时,symbol 对于其他组件是可见的,但是不能由其他组件重新定义。
HIDDEN 当源代码链接到动态组件中时,symbol 对于其他组件是不可见的。