嵌入式軟件開發(fā)之: 復位和初始化
13.5 復位和初始化
任何運行在實際硬件上的嵌入式應用程序,都必須在啟動時實現(xiàn)一些基本的系統(tǒng)初始化。本節(jié)將對此予以詳細討論。
13.5.1 初始化序列
圖13.14顯示了一個適用于ARM嵌入式系統(tǒng)的初始化序列。
圖13.14 ARM嵌入式系統(tǒng)的初始化序列
系統(tǒng)啟動時立即執(zhí)行復位處理程序,然后進入$Sub$$main()的代碼執(zhí)行。
復位處理程序是用匯編語言編寫的代碼塊,它在系統(tǒng)復位時執(zhí)行,完成系統(tǒng)初始化操作。對于具有局部存儲器的內核,如Caches、緊密藕荷存儲器(TCM)、存儲管理單元(MMU)和存儲器保護單元(MPU)等,在初始化過程這一階段完成必要的配置。復位處理程序在執(zhí)行之后,通常跳轉到__main以開始C庫的初始化序列。
13.5.2 向量表
所有的ARM系統(tǒng)都有一個向量表(vector table)。向量表不是初始化序列的一部分,但是對每個要處理的異常,它必須存在。這些地址通常包含以下形式的跳轉指令。
· Baddress>:該條指令實現(xiàn)了相對于pc的跳轉
· LDR pc,[pc,offset]:這條指令將異常處理程序的入口地址從存儲器裝載到pc。該地址是一個32位的絕對地址。由于有額外的存儲器訪問,裝載跳轉地址會使分支跳轉到特定處理程序,給系統(tǒng)執(zhí)行帶來延時。不過,可以使用這種方法跳轉到存儲空間內的任意地址。
· MOV pc,#immediate:將一個立即數(shù)復制到pc。使用該指令可以跨越整個地址空間,但是受到地址對齊問題的限制。這個地址必須由8位立即數(shù)循環(huán)右移偶數(shù)次得到。
另外,也可以在向量表中使用其他類型的指令。例如,F(xiàn)IQ處理程序可以從地址0x1c處開始執(zhí)行。因為它位于向量表的最后,這樣FIQ處理程序就可以不用跳轉,立即從FIQ向量地址處開始執(zhí)行。
下面的例子顯示了一個使用LDR指令的向量表裝載過程。
;**********************************
;* VECTOR TABLE *
;**********************************
AREA vectors, CODE
ENTRY
; 定義標準的ARM向量表
INT_Vectors
LDR PC, INT_Reset_Addr
LDR PC, INT_Undef_Addr
LDR PC, INT_Software_Addr
LDR PC, INT_Prefetch_Addr
LDR PC, INT_Data_Addr
LDR PC, INT_Reserved_Addr
LDR PC, INT_IRQ_Addr
LDR PC, INT_FIQ_Addr
在向量表的入口處要有ENTRY標識。該標識通知鏈接程序該代碼是一個可能的入口點,因而在鏈接時,不能被清除。
13.5.3 ROM/RAM重映射
啟動時,0x0處必須要有一條有效指令,因此,復位時0x0000地址必須為非易失性存儲器,如ROM或FLASH。
注意 | 有些系統(tǒng)是從0xffff0000處開始執(zhí)行的,對于這樣的系統(tǒng),地址0xffff0000處必須為非易失性存儲器。 |
可以將ROM定位在0x0處。但是,這樣配置有幾個缺點。首先ROM存取速度通常較RAM要慢,當跳轉到異常處理程序時,系統(tǒng)性能可能會大受影響。其次,將向量表放于ROM中,運行時不能修改。
存儲器地址重映射(Memory Remap)是當前很多先進控制器所具有的功能。所謂地址重映射就是可以通過軟件配置來改變存儲器物理地址的一種機制或方法。
當一段程序對運行自己得存儲器進行重映射時,需要特別注意保證程序執(zhí)行流程在重映射前后的承接關系。實現(xiàn)重映射的關鍵就是要使程序指針在remap以后能繼續(xù)往下得到正確的指令。本書中介紹兩種實現(xiàn)重映射的機制,不同的系統(tǒng)可能會有多種靈活的remap方案,用戶在具體實現(xiàn)時要具體分析。
存儲器相關文章:存儲器原理
評論