隨著計算機(jī)技術(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ī)的時候,要搶拍一個鏡頭,這個時間可能就是毫秒級的,在每次開機(jī)的時候都需要幾秒的啟動時間,是無法忍耐的。而也不能一直開機(jī),便攜式的相機(jī)電池的電量太有限了。我們經(jīng)常的一種解決辦法是將系統(tǒng)切換到低功耗模式,而僅僅是低功耗模式還是要浪費電量。而我們想,如果只給SDRAM供電,作為待機(jī)模式,每次按下復(fù)位鍵的時候就直接跳到SDRAM中運行,而不必再次復(fù)制代碼。這就實現(xiàn)了快速啟動,電池的供電時間也相應(yī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.強(qiáng)制M[4:0]為10011(超級用戶模式),將CPSR中的“I”和“F”位設(shè)為1,并將T位清零;3.強(qiáng)制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)迅速了。
下面是系統(tǒng)自開機(jī)開始, 程序修改復(fù)位跳轉(zhuǎn)指令的流程圖,在修改0x0000_0000處的跳轉(zhuǎn)指令可用如下數(shù)據(jù)替代: