Cortex M3啟動檔案
啟動檔案是由彙編編寫,是系統上電覆位後第一個執行的程式。主要做了以下工作。
1、初始化堆疊指標 SP = _initial_sp
2、初始化PC指標 = Reset_Handler
3、初始化中斷向量表
4、配置系統時鐘
5、呼叫C庫函式_main() 初始化使用者堆疊,從而最終呼叫main函式去到C的世界
啟動檔案ARM彙編指令
EUQ 給數字常量取一個符號名,相當於C語言的define
AREA 彙編一個新的程式碼段或者資料段
SPACE 分配記憶體空間
PRESERVE8 當前檔案堆疊需按照8位元組對齊
EXPORT 宣告一個標號具有全域性屬性,可被外部檔案使用
DCD 以位元組為單位分配記憶體,要求4位元組對齊,並要求初始化這些記憶體
PROC 定義子程式,與ENDP成對使用,表示子程式結束
WEAK 弱定義,如果外部檔案宣告一個標號,則優先使用外部檔案定義的標號,如果外部檔案沒有定義也不出錯。要注意的是:這個不是ARM的指令,是編譯器的,放在一起只是為了方便。
IMPORT 宣告標號來自外部檔案,跟C語言關鍵字類似。
B 跳轉到一個標號
IMPORT 宣告標號來自外部檔案,跟c語言的EXTERN類似
ALIGN 編譯器對指令或者資料的存放地址進行對齊,一般需要跟一個立即數,預設的標識4位元組對齊。要注意的是:這個不是ARM指令是編譯器的,放在一起只是為了方便。
END 到達檔案末尾,檔案結束。
LDR 從儲存器中載入一個字到暫存器
BL 跳轉到暫存器給出的地址,並根據暫存器的LSE確定處理器的狀態,還要把跳轉前的下條指令儲存到LR
BX 跳轉到由暫存器/標號給出的地址,不用返回
復位程式是系統上電後第一個要執行 的程式
;Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK];弱定義
IMPORT _main
IMPORT SystemInit ;初始化系統時鐘,由使用者定義
LDR R0, = SystemInit
BLX R0
LDR R0 , = _main ;C庫函式,實現堆疊的初始化和呼叫
BX R0
ENDP
這個函式是上電後第一個執行的程式,其中SystemInit初始化時鐘,在rcc檔案中定義這個函式。主要是初始化系統的時鐘。
至於_main中的初始化堆疊和呼叫估計是_main函式呼叫這個啟動檔案開始部分的初始化堆疊的函式。
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
;堆疊定義
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
堆定義
;*******************************************************************************
; User Stack and Heap initialization堆疊和堆初始化函式
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END