嵌入式系統(tǒng)快速重啟的研究
嵌入式系統(tǒng)啟動(dòng)流程
① 上電,復(fù)位完成;② 嵌入式ARM核自動(dòng)把flash里面最低的4k啟動(dòng)代碼復(fù)制到SRAM里面,并從SRAM的0x0000_0000地址開始執(zhí)行;③ 完成一些必要的初始化工作,將FLASH中的代碼拷貝到SDRAM中;④ 跳轉(zhuǎn)到SDRAM中運(yùn)行;通過以上步驟,就進(jìn)入了我們的應(yīng)用程序,或者是操作系統(tǒng)。
在我們需要復(fù)位的時(shí)候, 即nRESET管腳出現(xiàn)一個(gè)向下的脈沖,即出現(xiàn)復(fù)位。當(dāng)nRESET信號為低電平時(shí),ARM處理器放棄任何指令的執(zhí)行,并從增加的字地址處取指令;當(dāng) nRESET信號變?yōu)楦唠娖綍r(shí),ARM處理器進(jìn)行如下操作:1.將當(dāng)前的PC值和CPSR值寫入R14_svc和SPSR_svc,已經(jīng)保存的PC和 SPSR的值是未知的;2.強(qiáng)制M[4:0]為10011(超級用戶模式),將CPSR中的“I”和“F”位設(shè)為1,并將T位清零;3.強(qiáng)制PC從0x00地址取下一條指令。4.恢復(fù)為ARM狀態(tài)開始執(zhí)行。即程序會(huì)跳到0x0000_0000這個(gè)地址位置,開始執(zhí)行上面所述的第三步和第四步。
我們知道從flash里面讀取數(shù)據(jù)比起SDRAM是想當(dāng)慢的,而這里又要進(jìn)行一次代碼的拷貝工作,這也是一個(gè)相當(dāng)長的時(shí)間。不過這個(gè)時(shí)候我們可以發(fā)現(xiàn),我們并沒有斷電,SDRAM里面放的數(shù)據(jù)還是我們代碼,我們沒有必要重新拷貝這些代碼了,在下次啟動(dòng)的時(shí)候,只需直接跳轉(zhuǎn)到SDRAM中運(yùn)行,做一些初始化工作就可以了。這樣重新啟動(dòng)速度就相當(dāng)迅速了。
快速重啟思想
核心思想:在Bootloader里面,程序執(zhí)行到復(fù)制程序的一塊,可以判斷PC當(dāng)前計(jì)數(shù)在哪個(gè)存儲(chǔ)器里面,如果在SRAM中,就把代碼復(fù)制到SDRAM里面,如果在SDRAM中,就直接跳過復(fù)制程序這一段,然后繼續(xù)執(zhí)行。
根據(jù)上面這個(gè)思想, 可以先將地址為0x0000_0000這里的跳轉(zhuǎn)指令直接改成跳轉(zhuǎn)到SDRAM存儲(chǔ)器,如LDR PC,=0x3000_0000。
這樣在Reset的時(shí)候,我們就可以直接從0x0000_0000地址跳到0x3000_0000開始運(yùn)行。這樣我們就達(dá)到了快速啟動(dòng)的目的。
如圖2 所示, 在系統(tǒng)加電的時(shí)候,程序從地址為 0x0000_0000開始的SRAM處運(yùn)行,如上圖1所示。
然后,程序在SRAM中將代碼自身復(fù)制到地址為0x3000_0000開始處,如圖2中2所示。
評論