官术网_书友最值得收藏!

第8章 ARM處理器啟動過程

8.1 ARM處理器上電/復位操作

ARM處理器上電與復位操作過程類似,都是從處理器的低端復位向量地址0位置讀取第一條指令,由于ARM處理器的異常中斷向量是連續排列的,所以異常中斷入口指令一般都是一條跳轉指令,至少跳過異常中斷向量區,然后按照程序流程執行。

不同嵌入式處理器的啟動模式有很大差別,相同架構的不同處理器型號或序列的啟動模式也不一樣,比如:MC68VZ328(MC68K)有4種啟動模式;PPC405GP(PowerPC)有兩種啟動模式;PPC440EP(PowerPC)有8種啟動模式;SB1250(MIPS)有兩種啟動模式;PNX1700(DSP)有4種啟動模式,而大部分處理器只有一種啟動模式,可通過芯片的數據手冊了解芯片的啟動模式。

ARM處理器中的大部分也只有一種啟動模式,如S3C4510、S3C44B0、IXP425等,但有的也有兩種或多種啟動模式,如AT40800、CS89712等。

在ARM處理器中,不管是一種啟動模式還是兩種啟動模式,每種啟動模式都是從處理器的低端復位向量地址0位置讀取第一條指令是不變的,不同的是,只有一種啟動模式的處理器啟動時都是從掛在CS0片選上的flash或ROM芯片的0地址處讀取指令,而有兩種啟動模式的處理器的另一種啟動模式是從片內的ROM或SRAM的0地址位置讀取指令。

我們這里只列出AT40800系列芯片的啟動模式,如表8-1所示:

表8-1 AT40800系列芯片啟動模式

8.2 ARM處理器系統初始化過程

每次系統上電/復位啟動時,處理器都處于一種最低性能即只有最基本功能的狀態,此時它只能從復位向量地址處去讀取指令,其他功能模塊都處于禁止或者不可預知狀態,而一旦處理器從復位向量地址位置讀取到第一條指令開始執行,那么從軟件的角度看,處理器和整個系統就開始進入了軟件可控狀態,系統下面的行為就由軟件流程決定,軟件要做的第一件事就是初始化整個系統。

系統初始化的一般順序為:

1)禁止MMU,關閉中斷,禁止cache;

2)根據硬件設計配制好處理器時鐘、DRAM時鐘、定時器時鐘;

3)根據系統中所用的flash和DRAM芯片容量和電氣參數設置它們的起始地址、容量、刷新頻率等;

4)將固化在flash芯片中的程序搬移到DRAM內存中;

5)使能cache,使能MMU,跳轉到DRAM內存中運行繼續初始化,包括根據具體應用以及系統中的硬件配置初始化各個功能模塊、安裝好異常中斷處理程序、使能中斷等;

6)進行操作系統相關初始化。

8.3 ARM處理器系統初始化編程注意事項

在上述系統初始化過程中有以下兩點需要注意,如果處理不好就可能出現程序跑飛的情況。

1)如果需要將程序從flash搬移到DRAM中運行

在現代嵌入式系統中,由于DRAM的速度比flash的速度快很多,所以除了極少數對性能要求不高但對成本要求很高的系統把程序放在flash中并一直在flash中運行外,大部分嵌入式系統都是將程序從flash芯片搬到DRAM芯片中運行,這樣就會存在一個問題,因為我們編譯鏈接程序都是將程序鏈接到程序最后運行的場所DRAM中的地址上,但是系統啟動時只能從flash中讀取指令,所以從系統啟動讀取的第一條指令到進入到DRAM運行前的程序代碼是與地址無關的,如果要跳轉到某個標號處運行,必須是基于pc的,不能是絕對跳轉指令,因為此時程序存放的位置與其所鏈接到的位置不同,如果使用跳轉指令,程序將跑飛。

2)如果要求程序在MMU使能狀態下運行,即系統工作在虛擬地址模式

MMU使得系統能夠更好地管理內存,因為MMU可以將同一段物理內存映射到多段虛擬地址空間上,而且可以將物理上不連續的內存映射到連續的虛擬內存空間(減少內存碎片),另外MMU還可以控制虛擬內存區段的緩沖特性和訪問權限,所以MMU可以提高內存的使用效率,使程序仿佛能夠使用比實際物理內存容量多得多的內存空間,提高系統性能,同時也增加了系統的安全性,所以在帶有MMU功能的處理器系統中,一般都應該使能MMU,充分利用其功能。這樣一來也會導致一個和上面相同的問題,因為在使用MMU的系統中,各種物理存儲空間的實際物理地址與對應的虛擬地址設置得各不相同,包括flash和DRAM的物理地址與虛擬地址。系統啟動時MMU被禁止,系統運行在實模式即物理地址模式,但程序卻被編譯鏈接到了虛擬地址上,這樣在使能MMU之前,存放在flash或DRAM中的程序的實際地址(物理地址)與其鏈接到的地址是不相同的,所以從系統啟動到MMU使能之間的程序代碼也應該是與地址無關的,如果要跳轉到某個標號處運行,必須是基于pc的,不能是絕對跳轉指令,否則程序也將跑飛。

主站蜘蛛池模板: 酒泉市| 专栏| 兴仁县| 铜鼓县| 嘉善县| 蚌埠市| 绩溪县| 额济纳旗| 喀喇沁旗| 浦江县| 平阳县| 福海县| 丁青县| 富蕴县| 东兴市| 瑞安市| 屏南县| 滦平县| 聂荣县| 宜宾市| 漳平市| 谢通门县| 平利县| 宽城| 长宁县| 肥城市| 大城县| 会宁县| 长白| 文成县| 南木林县| 乾安县| 南康市| 大悟县| 罗城| 邵阳县| 松桃| 乌拉特前旗| 贺州市| 莎车县| 金昌市|