由於嵌入式系統在每次重啟的時候都要執行一次代碼的拷貝過程,這樣會浪費很多時間。對於我們來說,只要記憶體沒有斷電,裡面就有我們的代碼,而沒有必要重新拷貝一次。就這一點,對於嵌入式系統的快速重啟做了充分研究,給出了具體實現過程,其套用甚是廣泛,有一定的套用價值。
隨著計算機技術的發展,工業技術也跟著迅猛發展起來了,而伴隨著嵌入式的套用也很變得非常廣泛。 arm晶片為了保證指令運行的實時性,指令沒有直接在flash裡面運行,而是先把flash裡面的數據拷貝到讀取速度比較快的sdram裡面,然後運行,這樣就提高了運行速度。但是由於程式的固定性,在我們重新啟動的時候,會再次拷貝代碼。我們知道sdram是掉電不保存數據的,但是,如果sdram沒有掉電,裡面的數據是不會丟失的。而我們重啟的時候並沒有給晶片斷電,而這個時候系統又要重新拷貝一次代碼,造成了時間的浪費。 當然在工業上,我們的系統啟動起來之後,往往重新啟動的可能性較少,這樣每次啟動浪費的時間也就可以忽略不計了。不過,在我們使用數位相機的時候,要搶拍一個鏡頭,這個時間可能就是毫秒級的,在每次開機的時候都需要幾秒的啟動時間,是無法忍耐的。而也不能一直開機,攜帶型的相機電池的電量太有限了。我們經常的一種解決辦法是將系統切換到低功耗模式,而僅僅是低功耗模式還是要浪費電量。而我們想,如果只給sdram供電,作為待機模式,每次按下復位鍵的時候就直接跳到sdram中運行,而不必再次複製代碼。這就實現了快速啟動,電池的供電時間也相應的延長了。
① 上電,復位完成;② 嵌入式arm核自動把flash裡面最低的4k啟動代碼複製到sram裡面,並從sram的0x0000_0000地址開始執行;③ 完成一些必要的初始化工作,將flash中的代碼拷貝到sdram中;④ 跳轉到sdram中運行;通過以上步驟,就進入了我們的應用程式,或者是作業系統。 在我們需要復位的時候, 即nreset管腳出現一個向下的脈衝,即出現復位。當nreset信號為低電平時,arm處理器放棄任何指令的執行,並從增加的字地址處取指令;當nreset信號變為高電平時,arm處理器進行如下操作:1.將當前的pc值和cpsr值寫入r14_svc和spsr_svc,已經保存的pc和spsr的值是未知的;2.強制m:0]為10011(超級用戶模式),將cpsr中的“i”和“f”位設為1,並將t位清零;3.強制pc從0x00地址取下一條指令。4.恢復為arm狀態開始執行。即程式會跳到0x0000_0000這個地址位置,開始執行上面所述的第三步和第四步。 我們知道從flash裡面讀取數據比起sdram是想當慢的,而這裡又要進行一次代碼的拷貝工作,這也是一個相當長的時間。不過這個時候我們可以發現,我們並沒有斷電,sdram裡面放的數據還是我們代碼,我們沒有必要重新拷貝這些代碼了,在下次啟動的時候,只需直接跳轉到sdram中運行,做一些初始化工作就可以了。這樣重新啟動速度就相當迅速了。
下面是系統自開機開始, 程式修改復位跳轉指令的流程圖,在修改0x0000_0000處的跳轉指令可用如下數據替代: 使用ldr pc, =0x3000_0000指令,反彙編後得到的32位指令數據是0xe3a0_f5c0,將其放到0x0000_0000處即可。 而修改0x0000_0000處的數據,可用如下指令: 程式經過以上配置,就可以實現系統的快速重啟。