1. 定義一個段名為CSTACK, 這里:
NOROOT表示如何定義的段沒有被關聯,那么同意會被優化掉,如果不想被優化掉就使用ROOT.
后面的括號里數字表示如下:
(1):這個段是2的1次方即2字節對齊
(2):這個段是2的2次方即4字節對齊
(3):這個段是2的3次方即8字節對齊
SECTION CSTACK:DATA:NOROOT(2)
2. 下面代碼表示執行后面的指令函數(我理解為函數~),指令函數_iar_program_start和SystemInit為系統定義好的,在C庫啟動代碼中。
SystemInit:完成系統的初始化,自帶的模塊,主要是設置系統的時鍾。
__iar_program_start:這個函數是在啟動代碼中 \arm\src\lib\thumb\下面的代碼中找到,是系統自帶的啟動模塊
EXTERN __iar_program_start
EXTERN SystemInit
3. PUBLIC 表示導出標號。外部可以使用
符號 __vector_table 是有特殊意義的,所以必須注意添加進去
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name “__vector_table” has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
PUBLIC _vector_table
4. 通過 SFE 運算得到改段的結束地址,注意這個運算是在link的時候完成。所以IAR 的處理辦法就是先定義一個block作為堆棧區,然后將堆棧指針放到這個block的末端
剩下的就是各個中斷向量
DATA
__vector_table
DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler ......
5. 首先,因為之前是DATA模式,所以這里先切換回THUMB模式。
PUBWEAK: PUBLIC WEAK
如果程序員在自己的代碼中定義了后面聲明的中斷處理函數(如這里的NMI_Hander),那么在本文件中系統自帶的中斷處理函數無效,如果程序員沒有自定義,則執行本文件的處理函數。
THUMB
PUBWEAK Reset_Handler SECTION .text:CODE:REORDER(2) Reset_Handler LDR R0, =SystemInit BLX R0 LDR R0, =__iar_program_start BX R0 PUBWEAK NMI_Handler SECTION .text:CODE:REORDER(1) NMI_Handler B NMI_Handler
未經允許不得轉載:浩瀚先森 » [ARM] Cortex-M Startup.s啟動文件相關代碼解釋
