一種片外Flash存儲器IAP的方案
2.軟件實現(xiàn)
2.1 IAP實現(xiàn)要點分析
在嵌入式應(yīng)用系統(tǒng)中,通常要求記錄一些現(xiàn)場的傳感、交互輸入數(shù)據(jù),通常把數(shù)據(jù)記錄在Flash存儲器中,以 便下次上電能獲得以前的數(shù)據(jù)。如果系統(tǒng)程序和數(shù)據(jù)分開存儲。那么只要對存放數(shù)據(jù)的Flash器件進行編程即可。然而大多數(shù)嵌入式系統(tǒng),程序和需保存的數(shù)據(jù)都共存于同一Flash存儲器中,那么是否也如前所述,可對Flash存儲器直接編程呢?理論和實踐都表明不可以。
先從理論上計算:LPC2210允許的芯片核工作頻率(CCLK)范圍是10-60MHz,存儲器讀訪問長度由存儲器組配置寄存器BCFG中讀訪問的長度域控制WST1控制,其最大可用長度為35個CCLK,而SST39VF160的扇區(qū)擦除典型時間為18ms。下面是計算算式:
TRDmax=RDLenmax/CCLKmin=35/10×10-6=3.5μs
Tp=18ms>>3.5μs其中:TRDmax--最大讀訪問的時間;
RDLenmax--最大讀訪問可用長度;
CCLKmin--最小核工作時鐘頻率;
Tp--扇區(qū)擦除典型時間。
算式得出扇區(qū)擦除典型時間遠(yuǎn)大于最大讀訪問時間。這樣一來,如果再給某FLASH寫數(shù)據(jù),同時于其中預(yù)取指,那么因Flash執(zhí)行命令期間,對其他操作不響應(yīng),預(yù)取出的必定是其數(shù)據(jù)引腳上的不確定數(shù)據(jù),預(yù)取指失敗。實踐也表現(xiàn),如果在程序執(zhí)行過程中,對同一Flash進行扇區(qū)擦除,必定引起預(yù)取指中斷。
為了解決在同一Flash芯片存放程序并IAP這一問題,引進代碼重映射的思想。所謂重映射就是代碼先自復(fù)制到制定存儲區(qū),然后跳轉(zhuǎn)到制定區(qū)的起點開始執(zhí)行。這里,IAP程序先自復(fù)制到LPC2210片內(nèi)SRAM中,然后跳轉(zhuǎn)到SRAM執(zhí)行IAP代碼。前面過說,ARM7為馮·諾依曼結(jié)構(gòu),這就為IAP程序重映射提供了可能。
編寫可重映射代碼的關(guān)鍵是要解決程序中相對偏移的問題,ARM7指令系列中涉及相對偏移的指令主要有LDR/STR以跳轉(zhuǎn)指令。這里的解決方案是:凡涉及偏移值的指令通通采用基址變址尋址方式,以PC寄存器作基址寄存器,以立即數(shù)為變址,這樣當(dāng)程序塊整塊移動時,要加載的數(shù)據(jù)或跳轉(zhuǎn)的地址與當(dāng)前PC值的偏移值固定,解決了相對偏移問題。
2.2 扇區(qū)擦除
移值固定,解決了相對偏移問題。事先編程在Flash中的程序前自復(fù)制到SRAM制定的位置,然后,賦PC為SRAM中扇區(qū)編程代碼段的起點ERASEPART。程序于SRAM中的ERASEPART起點開始執(zhí)行,按照SST39VF160扇區(qū)擦除的時序要求開始擦除。按照ARM公司提出的ATPCS規(guī)定,C語言程序調(diào)用匯編程序時,寄存器R0-R3傳遞參數(shù),返回值由寄存器R0傳遞原則,扇區(qū)擦除程序的一個參數(shù),要擦除的扇區(qū)號,由R0傳遞;返回參數(shù)置于R0,扇區(qū)擦除成功返回"1",否則返回"0"。
2.3 字編程
程序于SRAM中的PROGRAMPART起點開始執(zhí)行,按照SST39VF160字編程的時序要求開始編程。入口參數(shù)有三個,一次為編程地址、數(shù)據(jù)起始地址、編程數(shù)據(jù)長度。字編程成功返回"1",否則返回"0"。
3.結(jié)論
在嵌入式應(yīng)用系統(tǒng)中,IAP是極為有效的一種技術(shù)。根據(jù)本文提出的方案,在實際應(yīng)用中只需針對選用的Flash,更改特定的擦、寫操作代碼就可實現(xiàn)系統(tǒng)片外存儲器的在應(yīng)用編程。本文提出的IAP代碼重入到SRAM執(zhí)行的方法,有效地解決了應(yīng)用無片內(nèi)程序存儲器的32位ARM處理器的嵌入式系統(tǒng)IAP難題,有很大的應(yīng)用價值。
評論