stack_size equ 0x00000400 ;棧大小設定為1024位元組
area stack, noinit, readwrite, align=
3 ;段名稱為stack,未初始化,允許讀寫,8位元組對齊
;area指示編譯器編譯出乙個新的**段或者資料段,align =
3,就是2的3次方位元組對齊,也就是8位元組
stack_mem space stack_size ;分配空間,大小為1024位元組,並把首位址賦值給stack_mem
__initial_sp ;初始化棧指標,指向棧的頂部,也就是上述空間的尾部,stm32採用滿遞減堆疊
定址方式
說明pop=ldm
push=stm
fa滿遞增
ldmfa
ldmda
stmfa
stmib
fd滿遞減
ldmfd
ldmia
stmfd
s***b
ea空遞增
ldmea
ldmdb
stmea
stmia
ed空遞減
ldmed
ldmib
stmed
s***a
滿遞增:sp指向最後乙個被壓入的元素,sp朝記憶體位址增加方向遞增滿遞減:sp指向最後乙個被壓入的元素,sp朝記憶體位址減小方向遞增
空遞增:sp指向最後乙個被壓入的元素的下乙個為空的位址,sp朝記憶體位址增加方向遞增
空遞減:sp指向最後乙個被壓入的元素的下乙個為空的位址,sp朝記憶體位址減小方向遞增
heap_size
equ0x00000200 ;堆大小設定為512位元組
area
heap, noinit, readwrite, align=3 ;段名稱為heap,未初始化,允許讀寫,8位元組對齊
__heap_base ;堆起始位址
heap_mem
space
heap_size ;分配堆空間
__heap_limit ;堆限制大小
preserve8 ;保持下述空間保持8位元組對齊
thumb ;使用thumb指令集,要宣告在任何使用thumb指令集的語句之前
area reset, data, readonly ;段名稱為reset,資料段,唯讀,保持8位元組對齊,由上面的preserve8指定
export __vectors ;向量表開始
export __vectors_end ;向量表結束
export __vectors_size ;向量表大小,可由上述兩個標號算出
;export 標號的輸出(類似於linux裝置驅動模組的export_symbol(symbol))
;dcd 用於分配一片連續的儲存單元,並且使用指定的資料進行初始化,仍然保持8位元組的對齊
__vectors dcd __initial_sp ; 堆疊頂部位址,復位後首先裝載堆疊
dcd reset_handler ; reset handler
dcd nmi_handler ; nmi handler
dcd hardfault_handler ; 硬體錯誤
dcd memmanage_handler ; mpu錯誤
dcd busfault_handler ; 匯流排錯誤
dcd usagefault_handler ; 引用錯誤
dcd 0 ; reserved
dcd 0 ; reserved
dcd 0 ; reserved
dcd 0 ; reserved
dcd svc_handler ; svcall handler
dcd debugmon_handler ; debug monitor handler
dcd 0 ; reserved
dcd pendsv_handler ; pendsv handler
dcd systick_handler ; 系統滴答計時器中斷響應函式
;上述為stm32內部指定中斷向量
; external interrupts
dcd wwdg_irqhandler ; window watchdog
......
dcd hash_rng_irqhandler ; hash and rng
dcd fpu_irqhandler ; fpu
__vectors_end ;中斷向量表結束位址
__vectors_size equ __vectors_end - __vectors ;定義中斷向量表長度為結束位址減去開始位址
area |.text|, code, readonly ;段名為.text(c編譯器產生的**段就是.text,此處可以嵌入c編譯出來的**段),**段,唯讀
; reset handler
reset_handler proc
export reset_handler [weak] ;weak,如果有重複的定義,優先執行其他的定義
import systeminit ;匯入systeminit標號
import __main ;匯入__main標號,也就是main()函式位址
ldr r0, =systeminit
blx r0 ;帶鏈結跳轉並切換指令集
ldr r0, =__main
bx r0 ;跳轉並切換指令集
endp
; dummy exception handlers (infinite loops which can be modified)
nmi_handler proc
export nmi_handler [weak]
b . ;死迴圈
endp
......
......
align ;預設的對齊方式,也就是4位元組對齊
;*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
; user stack and heap initialization
;*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
*****
****
if :def:__microlib ;如果勾選了此選項(在keil工程option的target選項右側)
export __initial_sp ;匯出三個符號
export __heap_base ;
export __heap_limit ;
else
import __use_two_region_memory ;否則匯入__use_two_region_memory
export __user_initial_stackheap ;匯出__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 ;等同於mov pc, lr
;跳轉並切換指令集,也就是切換到arm指令集
align
endif
end
先分配好棧,堆段
設定中斷向量表段
初始化堆疊(外部呼叫)
構建中斷處理函式,**段(裡面包含了中斷復位處理函式,裡面可以初始化整個系統,然後跳轉到main()函式處執行)
stm32如何執行軟復位 STM32啟動檔案
我們日常使用的嵌入式應用程式開發中都是編寫c c 語言,我們平時編輯乙個工程的話,只用從main函式開始編輯,微控制器程式也是從這個函式開始進行執行的。但是微控制器上電後是如何尋找到並執行main函式的呢?我們其實都會在心裡有乙個答案 啟動檔案 還記得我們當初配置第乙個stm32工程的時候在工程中新...
stm32啟動檔案分析
這篇文章主要是分析stm32啟動檔案,啟動檔案是由彙編編寫的,檔名為startup stm32f40 41 s。啟動檔案最主要的功能就是初始化堆疊指標sp,執行復位程式進入c語言main函式 1.初始化堆疊空間大小,定義棧頂位置 堆起始位置等等 2.定義中斷向量表,初始化sp指標 3.reset h...
STM32啟動檔案分析
1.啟動檔案主要作用 a.初始化指標大小 b.初始化堆指標大小 c.初始化中斷向量表 d.初始化系統時鐘 e.呼叫 main,實現堆疊的初始化,最終跳轉到c的main當中 2.棧主要儲存程式的變數,當程式變數較多時,可以將棧分配的更大,但不能超過內部sram的大小 mdk中,全域性變數和區域性變數都...