? ? 關于ARMv7上電復位后,通過復位向量初始化堆棧位置、PC指針,然后跳轉到匯編入口,開始執行系統初始化等等操作,熟悉了解這個過程,對于嵌入式系統軟件開發來說至關重要。不同的SOC在BootROM與Flash的地址分配上,可能有差別,但總體從復位開始,到程序正常啟動運行的大概流程是通用的。
? ? 先看一幅圖:
? ? 上圖描述了在 ARMv7-M 架構(常用于 Cortex-M 系列處理器)中,中斷向量表的定義、存儲位置以及在系統啟動時的關鍵重映射機制。其核心工作流程可分為以下幾個部分:
1. 物理存儲與邏輯映射
系統中有兩個關鍵的中斷向量表副本:
物理存儲位置 (Flash): 中斷向量表通常被永久地燒錄在非易失性存儲器(Flash)的起始位置(例如?
0x0800_0000
)。圖中?Flash Memory
?區域的?中斷向量表
?組件即代表此物理副本。邏輯映射地址 (BootROM): 然而,ARM 架構規定,CPU 在上電或復位后,會固定地從地址?
0x0000_0000
?開始獲取主棧指針(MSP)的初始值和復位異常向量。圖中?BootROM
?框架內的?中斷向量表
?組件代表的就是這個邏輯地址空間。
2. 重映射機制 (VTOR)
這兩個地址空間最初并不重合。為了解決這個問題,ARMv7-M 引入了向量表偏移寄存器(VTOR)。
啟動階段: 在芯片啟動初期,硬件可能會自動將 Flash 物理地址(
0x0800_0000
)映射到邏輯地址(0x0000_0000
),使得 CPU 能夠正確讀取到存儲在 Flash 中的向量表。這是一種簡單的硬件重映射。運行階段: 在軟件初始化后,可以通過配置 VTOR 寄存器,將中斷向量表的邏輯地址直接指向物理存儲地址(即?
0x0800_0000
)。圖中的虛線箭頭?通過VTOR重新映射
?形象地表示了這一過程。完成重映射后,所有后續的中斷發生時,CPU 都會根據 VTOR 指向的地址(Flash 中的物理向量表)來查找并執行對應的中斷服務程序。
3. 初始化流程
圖中的?復位向量
?指向?復位句柄處理函數
,該函數是系統啟動后執行的第一個程序,它負責關鍵的初始化操作:
.data 段初始化: 將已初始化的全局變量、靜態變量的初始值從 Flash(
DATA_init
)復制到 SRAM 中的運行時位置(DATA_runtime
),如藍色箭頭所示。.bss 段清零: 將未初始化的全局變量、靜態變量所在的內存區域(
BSS
)全部清零,如綠色箭頭所示。棧初始化: 使用向量表中最開始的條目「初始化 SP」的值來設置主棧指針,圖中通過隱藏線暗示了棧指針的初始值來源于向量表。
總結
? ? 中斷向量表在物理上存儲于 Flash,但通過?VTOR 重映射機制,使其在邏輯上能夠響應 CPU 從?0x0000_0000
?地址開始訪問中斷向量的要求。復位異常是啟動流程的觸發器,其服務函數不僅引導程序跳轉到主應用程序,更肩負著完成數據段初始化、為 C 語言運行環境做好準備的關鍵任務。