1. 程式人生 > >Cortex M3啟動檔案

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