嵌入式系統(tǒng)快速重啟的研究
本文論述了嵌入式系統(tǒng)的啟動過程,由于嵌入式系統(tǒng)在每次重啟的時候都要執(zhí)行一次代碼的拷貝過程,這樣會浪費很多時間。對于我們來說,只要內(nèi)存沒有斷電,里面就有我們的代碼,而沒有必要重新拷貝一次。本文就這一點,對于嵌入式系統(tǒng)的快速重啟做了充分研究,在文章的最后給出了具體實現(xiàn)過程,其應(yīng)用甚是廣泛,有一定的應(yīng)用價值。
前言
隨著計算機技術(shù)的發(fā)展,工業(yè)技術(shù)也跟著迅猛發(fā)展起來了,而伴隨著嵌入式的應(yīng)用也很變得非常廣泛。
ARM芯片為了保證指令運行的實時性,指令沒有直接在FLASH里面運行,而是先把flash里面的數(shù)據(jù)拷貝到讀取速度比較快的SDRAM里面,然后運行,這樣就提高了運行速度。但是由于程序的固定性,在我們重新啟動的時候,會再次拷貝代碼。我們知道SDRAM是掉電不保存數(shù)據(jù)的,但是,如果 SDRAM沒有掉電,里面的數(shù)據(jù)是不會丟失的。而我們重啟的時候并沒有給芯片斷電,而這個時候系統(tǒng)又要重新拷貝一次代碼,造成了時間的浪費。
當(dāng)然在工業(yè)上,我們的系統(tǒng)啟動起來之后,往往重新啟動的可能性較少,這樣每次啟動浪費的時間也就可以忽略不計了。不過,在我們使用數(shù)碼相機的時候,要搶拍一個鏡頭,這個時間可能就是毫秒級的,在每次開機的時候都需要幾秒的啟動時間,是無法忍耐的。而也不能一直開機,便攜式的相機電池的電量太有限了。我們經(jīng)常的一種解決辦法是將系統(tǒng)切換到低功耗模式,而僅僅是低功耗模式還是要浪費電量。而我們想,如果只給SDRAM供電,作為待機模式,每次按下復(fù)位鍵的時候就直接跳到SDRAM中運行,而不必再次復(fù)制代碼。這就實現(xiàn)了快速啟動,電池的供電時間也相應(yīng)的延長了。
Samsung ARM系列S3C2440處理器簡介
在這里所使用的S3C2440處理器是Samsung公司推出的基于ARM920T核的32位RISC微處理器。S3C2440具有低功耗、低成本和高性能的特點,已成為PDA、智能手機、網(wǎng)絡(luò)計算機終端以及智能設(shè)備的終端產(chǎn)品等的熱門解決方案之一。
S3C2440內(nèi)部資源豐富、結(jié)構(gòu)復(fù)雜、接口眾多,具有相互獨立的16kB指令緩存和16kB數(shù)據(jù)緩存,帶有MMU虛擬存儲單元和AMBA總線接口。
S3C2440支持的內(nèi)外圍設(shè)備包括外部存儲控制器、中斷控制器、LCD控制器、8通道10bit精度的ADC和觸摸屏控制器、SD/MMC卡控制器、4通道DMA、4通道具有PWM功能的定時器、具有日歷功能的實時時鐘、看門狗定時器、3通道UART(包含IRDA紅外線數(shù)據(jù)通訊口)、USB主機/設(shè)備接口、I2C總線接口、I2S數(shù)字音頻總線接口、2通道SPI總線接口、通用I/O端口以及具有鎖相環(huán)功能片上時鐘發(fā)生器等、同時也可以柑橘需要進(jìn)行功能擴展從而支持以太網(wǎng)接口、PCMCIA接口及IDE接口等。
S3C2440外部存儲器電路圖
在這里我們使用FLASH作為程序和數(shù)據(jù)固化的存儲器,使用SDRAM作為系統(tǒng)啟動之后, 程序運行的區(qū)域。而S3C2440核內(nèi)部4k的SRAM固定作為最初的啟動代碼使用,地址是從0x0000_0000開始的。
這里使用nGCS6將SDRAM的地址編址到0x3000_0000位置處,使用ADDR尋址,使用DAT讀取和寫入需要的數(shù)據(jù),使用FCON控制信號控制SDRAM的狀態(tài)。
使用FCON控制FLASH的狀態(tài),根據(jù)DATA按照時序送入數(shù)據(jù)和命令,做相應(yīng)的處理。
這三部分就構(gòu)成了ARM運行的最小系統(tǒng)。
嵌入式系統(tǒng)啟動流程
① 上電,復(fù)位完成;② 嵌入式ARM核自動把flash里面最低的4k啟動代碼復(fù)制到SRAM里面,并從SRAM的0x0000_0000地址開始執(zhí)行;③ 完成一些必要的初始化工作,將FLASH中的代碼拷貝到SDRAM中;④ 跳轉(zhuǎn)到SDRAM中運行;通過以上步驟,就進(jìn)入了我們的應(yīng)用程序,或者是操作系統(tǒng)。
在我們需要復(fù)位的時候, 即nRESET管腳出現(xiàn)一個向下的脈沖,即出現(xiàn)復(fù)位。當(dāng)nRESET信號為低電平時,ARM處理器放棄任何指令的執(zhí)行,并從增加的字地址處取指令;當(dāng) nRESET信號變?yōu)楦唠娖綍r,ARM處理器進(jìn)行如下操作:1.將當(dāng)前的PC值和CPSR值寫入R14_svc和SPSR_svc,已經(jīng)保存的PC和 SPSR的值是未知的;2.強制M[4:0]為10011(超級用戶模式),將CPSR中的“I”和“F”位設(shè)為1,并將T位清零;3.強制PC從0x00地址取下一條指令。4.恢復(fù)為ARM狀態(tài)開始執(zhí)行。即程序會跳到0x0000_0000這個地址位置,開始執(zhí)行上面所述的第三步和第四步。
我們知道從flash里面讀取數(shù)據(jù)比起SDRAM是想當(dāng)慢的,而這里又要進(jìn)行一次代碼的拷貝工作,這也是一個相當(dāng)長的時間。不過這個時候我們可以發(fā)現(xiàn),我們并沒有斷電,SDRAM里面放的數(shù)據(jù)還是我們代碼,我們沒有必要重新拷貝這些代碼了,在下次啟動的時候,只需直接跳轉(zhuǎn)到SDRAM中運行,做一些初始化工作就可以了。這樣重新啟動速度就相當(dāng)迅速了。
快速重啟思想
核心思想:在Bootloader里面,程序執(zhí)行到復(fù)制程序的一塊,可以判斷PC當(dāng)前計數(shù)在哪個存儲器里面,如果在SRAM中,就把代碼復(fù)制到SDRAM里面,如果在SDRAM中,就直接跳過復(fù)制程序這一段,然后繼續(xù)執(zhí)行。
根據(jù)上面這個思想, 可以先將地址為0x0000_0000這里的跳轉(zhuǎn)指令直接改成跳轉(zhuǎn)到SDRAM存儲器,如LDR PC,=0x3000_0000。
這樣在Reset的時候,我們就可以直接從0x0000_0000地址跳到0x3000_0000開始運行。這樣我們就達(dá)到了快速啟動的目的。
如圖2 所示, 在系統(tǒng)加電的時候,程序從地址為 0x0000_0000開始的SRAM處運行,如上圖1所示。
然后,程序在SRAM中將代碼自身復(fù)制到地址為0x3000_0000開始處,如圖2中2所示。
在將代碼復(fù)制完之后將地址為0x0000_0000處的復(fù)位中斷跳轉(zhuǎn)矢量改為跳轉(zhuǎn)到0x3000_0000,如圖2中3所示。
然后程序跳轉(zhuǎn)到SDRAM中,地址為相對于0x3000_0000的一個偏移量,這個偏移量為當(dāng)前地址距0x0000_0000的偏移量,如圖2中4所示。
在圖2中5中,如果用戶使用了Reset按鍵,重新啟動系統(tǒng),我們就可以從地址為0x0000_00000處直接跳轉(zhuǎn)到0x3000_0000這個位置,開始進(jìn)行硬件初始化等工作,這次就不會有代碼拷貝的過程了。
快速重啟軟件流程
下面是系統(tǒng)自開機開始, 程序修改復(fù)位跳轉(zhuǎn)指令的流程圖,在修改0x0000_0000處的跳轉(zhuǎn)指令可用如下數(shù)據(jù)替代:
使用LDR PC, =0x3000_0000指令,反匯編后得到的32位指令數(shù)據(jù)是0xE3A0_F5C0,將其放到0x0000_0000處即可。
而修改0x0000_0000處的數(shù)據(jù),可用如下指令:
程序經(jīng)過以上配置,就可以實現(xiàn)系統(tǒng)的快速重啟。
結(jié)論
系統(tǒng)的快速重啟,應(yīng)用將非常廣泛。即使是嵌入式系統(tǒng)慢慢的也將變得很復(fù)雜,系統(tǒng)所占的空間也在慢慢的變大,這樣一個復(fù)制過程將嚴(yán)重影響很多設(shè)備的使用,最簡單的就是數(shù)碼相機了。