單片機快速啟動的實現
啟動程序過程
系統硬件初始化
系統上電或復位后,程序從位于地址0x0的Reset Exception Vec
tor處開始執行,因此需要在這里放置Bootloader的第一條指令:b ResetHandler,跳轉到標號為ResetHandler處進行第一階段的硬件初始化,主要內容為:關看門狗定時器,關中斷,初始化PLL和時鐘,初始化存儲器系統。執行完以上程序后,系統進行堆棧和存儲器的初始化。系統堆棧初始化取決于用戶使用了哪些中斷,以及系統需要處理哪些錯誤類型。一般情況下,管理者堆棧必須設置,如果使用了IRQ中斷,則IRQ堆棧也必須設置。如果系統使用了外設,則需要設置相關的寄存器,以確定其刷新頻率、總線寬度等信息。
代碼段復制到RAM中運行
因為嵌入式系統的代碼通常都是固化在ROM或者Flash中,上電后開始運行。由于ROM和Flash的讀取速度相對較慢,這樣無疑會降低代碼的執行速度和系統的運行效率。為此,需要把系統的代碼復制到RAM中運行。使用SDT鏈接器ARMLink產生的定位信息,把RO的有效代碼和數據段到RAM中。ARMLink將編譯后的程序鏈接成ELF文件。映像文件內部共有三種輸出段:RO段、RW段和ZI段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數據、可讀寫的數據、初始化為0的數據,ARMLink同時還產生了這三種輸出段的起始和終止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$Limit。可以在程序中使用這些定位信息。將ROM中的代碼和數據搬移到RAM中,具體程序如下。

BNE %B0 /*如果沒有復制完,跳轉到0標示符處的匯編語句,繼續復制,參見ARM指令幫助手冊
建立二級中斷向量表
在ARM系統中,中斷向量表位于0X0開始的地址處,意味著無論運行什么樣的上層軟件,一旦發生中斷,程序就得到Flash存儲器中的中斷向量表里去,降低系統的運行效率。因此在RAM中建立自己的二級中斷向量表,當中斷發生后,程序直接從RAM中取中斷向量進入中斷子程序。尤其是在中斷頻繁發生的系統里,這種方法可以大大提高系統的運行效率,具體的實現代碼如下

其中HANDLER是一個宏,用于查找中斷處理程序的入口地址。這些地址存放在由HandleXXX指向的表項中,該表定位在RAM高端,基地址為_ISR_STARTADDRESS

MMU的應用
MMU是存儲器管理單元的縮寫,是用來管理虛擬內存系統的器件。MMU通常是CPU的一部分,本身有少量存儲空間存放從虛擬地址到物理地址的匹配表,此表稱作TLB(轉換旁置緩沖區)。所有數據請求都送往MMU,由MMU決定數據是在RAM內還是在大容量外部存儲器設備內。如果數據不在存儲空間內,MMU將產生頁面錯誤中斷。MMU存儲器系統的結構允許對存儲器系統的精細控制,大部分的控制細節由存在存儲器中的轉換表提供。這些表的入口定義了從1KB~1MB的各種存儲器區域的屬性。MMU完成的兩個主要功能是:將虛地址轉換成物理地址,控制存儲器存取允許。MMU關掉時,虛地址直接輸出到物理地址總線。
經過以上的分析可以發現,系統啟動程序主要是完成了硬件的初始化,以及克服Flash或ROM讀取速度慢的弱點,提高指令和數據的讀取速度,實現系統的高速運行,并且通過MMU的應用,減少RAM的使用,降低系統成本。
參考文獻
1 S3C2410數據手冊
2 ARM920T數據手冊
3 王京林.ARM7在嵌入式應用中啟動程序的實現


評論