STM32 CM3/CM4 ------ startup.s 文件分析 ------ IAR 版本
startup.s 功能
不同的開發環境(IAR、KEIL、GCC編譯器),startup.s的內容多少有些差別,但是功能基本如下:
文件功能:
;* This module performs:
;* - Set the initial SP
;* - Configure the clock system
;* - Set the initial PC == __iar_program_start,
;* - Set the vector table entries with the exceptions ISR address.
;* After Reset the Cortex-M3 processor is in Thread mode,priority is Privileged, and the Stack is set to Main.
The vector table is normally located at address 0.
在函數__iar_program_start() 內會調用 main() 函數
向量表
在 startup.s 內,定義了一個向量表,不同于GCC編譯器由鏈接腳本決定向量表存儲在ROM(flash)的哪個地址,IAR是 .icf 文件內決定存儲地址,默認從地址0開始(對于STM32,就是 flash 的起始地址 0x08000000)存每個向量,向量指向的位置就是對應的中斷服務函數
向量表的起始處都必須包含以下向量:
主堆棧指針(MSP)的初始值
復位向量(根據CM3權威指南,復位向量是PC初始值,也就是說程序是從中斷服務函數 Reset_Handler 開始運行的)
NMI
硬 fault 服務例程
后兩者也是必需的,因為有可能在引導過程中發生這兩種異常。
所以 0x20000D84 就是主堆棧指針的初始值,0x08059545-1就是復位向量,指向中斷服務函數Reset_Handler
startup.s 文件內容
以下是 IAR 版本的 startup.s
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
......
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
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER(1)
HardFault_Handler
B HardFault_Handler
......
除了 Reset_Handler 中斷服務函數, 其他中斷服務函數都是死循環,B 是跳轉指令(即函數調用)。BLX 也是跳轉指令。
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD:數據定義( Data Definition )偽指令
一般用于為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。
語法格式:
標號 DCD(或 DCDU) 表達式
DCD(或 DCDU)偽指令用于分配一片連續的字存儲單元并用指定的表達式初始化。其中表達式可以為程序標號或數字表達式。 DCD 也可用 “ &” 代替。
用 DCD 分配的字存儲單元是字對齊的,而用 DCDU 分配的字存儲單元并不嚴格字對齊。
結合前面的截圖,上面幾行分析如下:
為 CSTACK 分配存儲地址 0x08000000,地址上的內容為 CSTACK 的值是 0x20000D84
為 Reset_Handler 分配存儲地址 0x08000004,地址上的內容為中斷服務函數指針(0x08059545),指向中斷服務函數 Reset_Handler
為 NMI_Handler 分配存儲地址 0x08000008,地址上的內容為中斷服務函數指針(0x08059591),指向中斷服務函數 NMI_Handler
函數 Reset_Handler 內沒有對 SP 進行初始化,存疑。
總結
以上是生活随笔為你收集整理的STM32 CM3/CM4 ------ startup.s 文件分析 ------ IAR 版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 控制文件损坏处理
- 下一篇: vivo 新机通过工信部入网认证,预计为