[ARM] Cortex-M Startup.s啟動文件相關代碼解釋


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啟動文件相關代碼解釋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM