適于OMAP的多級啟動(dòng)Boot Loader
Boot Loader是嵌入式系統的重要組成部分,它是在操作系統啟動(dòng)之前運行的初始化加載程序,用于設置操作系統運行的硬件環(huán)境并將Flash中存儲的操作系統加載到RAM中運行。
1 OMAP的啟動(dòng)方式
OMAP多采用外部Flash啟動(dòng)方式。以OMAP5910為例,它包含一顆TMS320C55x DSP核心以及一顆ARM925核心,其中MPU(ARM925)為主控核心,它可以控制DSP內核的啟動(dòng)、復位等操作。OMAP5910上電時(shí),MPU首先啟動(dòng),從地址0x00000000開(kāi)始讀取指令,運行程序。一般應在0x00000000地址處放置一條跳轉指令,令其指向Boot Loader啟動(dòng)程序的入口處,OMAP5910啟動(dòng)后跳轉至Boot Loader程序處執行硬件環(huán)境設置及操作系統加載工作。根據OMAP5910的地址空間映射關(guān)系[1],0x00000000地址屬于EMIFS(慢速片外存儲器接口)總線(xiàn),CS0空間,用于連接外部Flash,因而OMAP5910的啟動(dòng)階段的程序在外部Flash中進(jìn)行取指操作。
在實(shí)際應用中發(fā)現,如果操作系統占用空間比較大,使得Boot Loader需要從Flash中拷貝的代碼量很大,那么系統的啟動(dòng)過(guò)程會(huì )耗費較長(cháng)的時(shí)間。由于MPU需要在Flash中取指,又要將同一空間中其他部分的數據搬移到不同的RAM(DSP運行的內部SRAM以及MPU運行的SDRAM)中,從而使得程序取指錯誤的概率增加。經(jīng)過(guò)測試發(fā)現,隨著(zhù)Flash擦寫(xiě)次數的增多,Flash性能下降,這種錯誤的概率會(huì )顯著(zhù)增加。這種錯誤體現到應用中,就會(huì )造成整個(gè)系統在啟動(dòng)過(guò)程中偶爾出現莫明其妙的死機,只能通過(guò)斷電重新啟動(dòng)才能解決,因而這種啟動(dòng)方式存在較大的隱患。
2 多級啟動(dòng)Boot Loader
2.1 設計思想
考慮到啟動(dòng)過(guò)程中MPU需要從Flash中取指,這種操作既有風(fēng)險且取指周期又長(cháng),因而應盡量減少在Flash中的取指動(dòng)作。而RAM作為高速存取設備,其讀寫(xiě)周期比Flash要短得多,因而將代碼拷貝過(guò)程中的指令放到RAM中進(jìn)行取指操作,既能降低取指周期,又能降低載入系統時(shí)的風(fēng)險。通過(guò)上述分析,可以設計一種多級載入的BOOT過(guò)程,首先用一段盡量短的程序將傳統意義上的Boot Loader拷貝到一段空白(載入操作系統時(shí)不會(huì )占用)的RAM中,之后再跳轉到RAM中的Boot Loader程序入口,執行真正的Boot Loader程序。與操作系統相比,Boot Loader程序代碼要短得多,拷貝時(shí)間基本可以忽略,因而運行風(fēng)險也小很多。這段程序在Flash中運行,任務(wù)是拷貝Boot Loader程序,可以稱(chēng)之為Mini Loader。
2.2 具體過(guò)程
多級Boot Loader啟動(dòng)過(guò)程分為Mini Loader、System Loader以及Flasher 3個(gè)部分。
(1) Mini Loader
Mini Loader在Flash中運行,其目的是從Flash中將Boot Loader程序拷貝到RAM中。為了盡量減小Flash中運行程序的數量就需要Mini Loader盡量短小,故而Mini Loader在進(jìn)行拷貝動(dòng)作之前只需要配置與外部總線(xiàn)EMIFS、EMIFF相關(guān)的寄存器。具體流程如圖1所示。同時(shí)還要注意需要設置MPU的中斷向量表0x00000000的跳轉地址為Mini Loader的程序入口。
(2) System Loader
該部分為傳統意義上的Boot Loader過(guò)程,完成硬件環(huán)境相關(guān)設置及初始化,并將操作系統載入到RAM中運行。需要注意的是,MPU本身的中斷向量表須載入到內部SRAM中,其他操作系統部分可以載入到外部SDRAM中。
由于OMAP平臺為雙核心結構,因此 System Loader除了需要載入MPU系統本身之外,還需要配置DSP的載入及啟動(dòng)過(guò)程。DSP有3種啟動(dòng)方法:Flash引導方式與ARM載入方式,參考文獻[2]對這兩種方式進(jìn)行了對比分析。本設計采用ARM載入方式,這樣可以通過(guò)ARM動(dòng)態(tài)配置DSP部分的代碼,控制DSP核心的處理流程。與參考文獻[2]所不同的是,本方法中DSP程序采用與MPU操作系統相同的方式存儲,也存入Flash中,而不是作為常量數組編入Boot Loader程序中,這種方式較參考文獻[2]中的方法更加便于管理,單獨對DSP程序進(jìn)行升級也更加方便,而且減小了System Loader的程序長(cháng)度,更有利于多級啟動(dòng)方式。
因為OMAP本身的GPIO(MUPIO)有限,所以大多設計都要采用FPGA作為外圍擴展控制器,用來(lái)擴展更多的控制端口以及通信端口。一般FPGA本身無(wú)法存儲程序,其程序存儲在片外ROM中,FPGA上電之后可以通過(guò)多種方式自行加載到ROM中運行。本設計通過(guò)MPU加載FPGA程序,并將FPGA固件程序也存儲于同一Flash中,這樣省去了一片FPGA專(zhuān)用ROM,既方便代碼管理,又降低了硬件成本和設計復雜度。以XILINX公司的XC2S系列FPGA為例,其加載程序時(shí)可采用串行加載模式,選擇FPGA為從模式,將OMAP本身的MCBSP配置為SPI主模式,工作于時(shí)鐘停止模式,包含一個(gè)時(shí)鐘周期延時(shí),輸出時(shí)鐘信號高有效,采用幀同步模式,每個(gè)數據幀8 bit。給FPGA載入程序時(shí),要將存儲于Flash中的FPGA程序代碼讀出,由于XILINX開(kāi)發(fā)工具ISE輸出的HEX文件以字節(8 bit)為單位,而Flash中存儲的內容以雙字(32 bit)為單位(由ARM指令長(cháng)度而定),因而從Flash中讀出32 bit的數據之后需要按照從高到低的字節順序發(fā)送。而且,ISE的HEX文件每字節bit排列順序與MCBSP的傳輸順序正好相反,因此每個(gè)字節內部需要將bit反向重排。
System Loader流程如圖2所示,啟動(dòng)順序與本小節所述順序正好相反,這是因為FPGA一般多用于進(jìn)行硬件設備的控制,所以需要最先啟動(dòng);而DSP由于其自身特點(diǎn),多用于數據處理工作,作為MPU的協(xié)處理器使用,因此需要在MPU操作系統啟動(dòng)之前做好準備。
評論