嵌入式系統建構開發運作於STM32的韌體程式.pdf
文本预览下载声明
嵌入式系統建構 :開發運作於STM32的韌體程式
台灣成功大學資訊工程系嵌入式系統開放教材: .tw/embedded/schedule
改編自: /module/forum/thread59988211.html
編譯者: 黃敬群 jserv.tw@
本文探討如何開發一個得以獨立運作於STM32硬體的韌體程式,會談到程式執行的原理、硬體運作機制
,以及GNU Toolchain如何編譯和連結我們撰寫的程式,過程中也探討如何使用OpenOCD把程式燒錄
寫到STM32晶片內部的Flash並執行,對於沒有實體裝置的開發者,本文也介紹QEMU系統模擬。
程式的運行方式
在開始進行程式開發前,我們先來探討最簡單的C程式如何運作。
為了使程式足夠簡單,我們可讓CPU直接從Flash上取得指令(fetch instruction)並執行,而且程式中沒用
到全域變數,因此編譯出來的目的檔(object file)中是data section長度是0,如此一來,避免了初始化
RAM的步驟,因為data section是可讀寫的,如果目的檔中有data section,我們就必須在程式的啟動過
程中,將data section複製到RAM中,方可確保程式得以正常工作。
程式的執行環境
我們來定義一下程式執行時的記憶體映射 (memory map) :
Flash的陰影區域表示保存的程式映像(program image),程式執行過程中的堆疊(stack)當然只能存於
RAM 中,示意圖右方黑點標註堆疊頂端指標。
Reset後程式的運行流程
一旦處理器Reset後,就會進行 「取得指令—解碼—執行」的循環,也就是3stage pipeline。因此,PC
(program counter; 以下PC均指此暫存器,而非個人電腦)暫存器在Reset後的值就顯得關鍵。在 《The
Definitive Guide To ARM Cortex M3》中 (簡體中文電子書),我們知道,在離開Reset狀態後,ARM
Cortex M3所做的第一件事,就是讀取下列兩個 32位元整數的值 :
● 從位址0處取出MSP (Main Stack Point)的初始值
● 從位址0處取出PC的初始值,處理器隨即自這個值所對應的位址處取值
可用下方示意圖說明 :
要注意,從位址0處取出PC的初始值,裡頭的LSB 必須為1 (稍後的實驗可察覺這點)。為什
麼呢?當一個例外處理程式(exception handler)的位址在LSB設定為1,代表該例外處理程式運作於
Thumb模式(Thumb mode),對ARM CortexM3來說,這是必要的,因為該處理器核心只支援Thumb2
指令集,而不支援ARM模式(也稱ARM code或ARM state),當然,該例外處理程式都運行於Thumb模
式,底下節錄 《The Definitive Guide To ARM Cortex M3》的描述 :
With the introduction of the Thumb2 instruction set, it is now possible to handle all processing
requirements in one operation state. There is no need to switch between the two. In fact, the
CortexM3 does not support the
显示全部