這篇文章主要是分析stm32啟動檔案,啟動檔案是由彙編編寫的,檔名為startup_stm32f40_41***.s。
啟動檔案最主要的功能就是初始化堆疊指標sp,執行復位程式進入c語言main函式
1.初始化堆疊空間大小,定義棧頂位置、堆起始位置等等
2.定義中斷向量表,初始化sp指標
3.reset_handler復位函式定義
4.配置系統時鐘,進入main函式
stack_size equ 0x00000400
area stack, noinit, readwrite, align=3
stack_mem space stack_size
__initial_sp
在mdk幫助文件中可以查到equ是巨集定義的偽指令,它的作用就相當於c語言中的define,首先定義棧大小為1kb(0x00000400)。
棧的作用主要儲存函式中的區域性變數,函式呼叫過程中的形參,返回位址,因此在函式中如果有較多的區域性變數,大型陣列最好不要放在函式中定義,在這種情況下就要考慮棧大小是否充足,如果棧溢位了,那程式會出現跑飛,找不到返回位址。
area是告訴編譯器彙編乙個**段或者資料段,stack 表示段名,這個可以任意命名; noinit 表示不初始化; readwrite 表示可讀可寫, align=3,表示按照 2^3對齊,即 8 位元組對齊。
space是分配一定大小的記憶體空間,單位為位元組。
最後一句_initial_sp是棧頂指標,這裡棧的生長方向是從高位址到低位址,所以棧初始位址就是在高位址位置。
heap_size equ 0x00000200
area heap, noinit, readwrite, align=3
__heap_base
heap_mem space heap_size
__heap_limit
這裡是宣告堆的大小,方法和棧類似,不同點在於_heap_base堆初始位置在記憶體分配之前,也就是低位址,_heap_limit是堆結束位置,堆的生長方向是從低位址向高位址。堆主要用於動態記憶體的分配。
__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
...
這裡就是中斷向量表的定義,中斷向量表是儲存在flash的0位址位置。向量表第乙個位置儲存的是棧頂位址,即 __initial_sp,這個值在stm32開始執行後會賦給棧指標sp。向量表第二個位置儲存的是復位中斷的位址,其函式名reset_handler就是位址,在後面有定義,這個位址值會賦給程式執行位址指標pc,然後就執行復位程式。
reset_handler proc
export reset_handler [weak]
import systeminit
import __main
ldr r0, =systeminit
blx r0
ldr r0, =__main
bx r0
endp
復位程式會匯入systeminit和_main函式的位址,並由下面的彙編**,執行systeminit函式,這個函式是對系統時鐘進行設定,然後執行_main函式,這個函式是對堆疊進行一些初始化工作,然後跳轉到main函式,並且不在返回該位置。
整個過程就是先設定堆和棧的大小,並且設定相應的位址,然後定義中斷向量表,最後定義復位函式,跳轉到main函式。
STM32啟動檔案分析
1.啟動檔案主要作用 a.初始化指標大小 b.初始化堆指標大小 c.初始化中斷向量表 d.初始化系統時鐘 e.呼叫 main,實現堆疊的初始化,最終跳轉到c的main當中 2.棧主要儲存程式的變數,當程式變數較多時,可以將棧分配的更大,但不能超過內部sram的大小 mdk中,全域性變數和區域性變數都...
STM32 啟動檔案
先來看看啟動 中的偽操作和偽指令 equ 用於定義常量,相當於c中的巨集定義 如stack size equ 0x00000400 define stack size 0x00000400 align 位元組對齊方式 align 3 export 相當於宣告了乙個全域性變數 export vecto...
stm32啟動檔案
這是st提供的3個啟動檔案,分別適用於不同容量的stm32晶元。這三個檔案為 startup stm32f10x ld.s startup stm32f10x md.s startup stm32f10x hd.s 其中,ld.s適用於小容量 產品 md.s適用於中等容量產品 hd適用於大容量產品 ...