讓單片機運行速度更快一些
所以,在RamApp.lnx中指定的定位規(guī)則應(yīng)該在SDRAM中,如下:
MEMORY
{
ram1: ORIGIN = 0x00003000, LENGTH = 0xf000
ram: ORIGIN = 0x00F00000, LENGTH = 0x7000
}
SECTIONS
{
.data : {} > ram1
.text : {} > ram
}
最后,在860單片機系統(tǒng)的地址映射規(guī)則如圖2所示。對照圖1,可以觀察到這和傳統(tǒng)的程序地址映射有很大不同。
圖2地址映射表
3.2 搬運的過程
860T上電復(fù)位,RomTool.bin首先被執(zhí)行,完成初始化工作后,運行代碼搬運函數(shù),將RAMapp.bin搬運到SDRAM中,隨后改變PC(Program Counter)的值,無條件轉(zhuǎn)移到SDRAM中運行RAMapp.bin,如圖3所示。
圖3從Flash到SDRAM搬運代碼的過程
3.3 搬運代碼的驅(qū)動模塊及跳轉(zhuǎn)模塊源代碼
(1)搬運代碼驅(qū)動模塊的代碼
void MoveCodeF_to_RAM(UWORD *FlashCode_Add, UWORD *RamCode_Add,UWORD CodeLen) {
do{
*RamCode_Add++ = *FlashCode_Add++;
CodeLen?
} while ( CodeLen!=0)
}
該段代碼是將開始地址為FlashCode_Add,長度為CodeLen的Flash代碼搬運到開始地址為RamCode_Add,長度為CodeLen的SDRAM 中。
(2)主函數(shù)及跳轉(zhuǎn)模塊
#define FlashCode_Add_V 0x02810000
#define RamCode_Add_V 0x00f00000
#define CodeLen_V 0x00070000/4
void main(){
UWORD *I=(UWORD *) FlashCode_Add_v;
UWORD *j= (UWORD *) RamCode_Add_v;
UWORD *k= (UWORD *) CodeLen_V;
MoveCodeF_to_RAM( (UWORD *) i, (UWORD *) j, (UWORD *)k );
# 跳轉(zhuǎn)模塊
asm(“addis r2,0,0x00f0”);
asm(“ori r2,r2,0x0000”); # 代碼起始地址0x00f00000
asm(“mtspr LR,r2”);
asm(“bclr 20,0”); # 無條件轉(zhuǎn)跳到鏈接寄存器
# (LR)中的地址
}
FlashCode_Add_V:被搬運代碼的首地址,在Flash中。
RamCode_Add_V:被搬運代碼的目標(biāo)地址,在RAM中。
CodeLen_V:被搬運代碼的長度,按32位計算。
該函數(shù)在調(diào)用代碼搬運MoveCodeF_to_RAM函數(shù),將代碼從Flash搬運到SDRAM中后,將程序指針轉(zhuǎn)移到SDRAM中。注意跳轉(zhuǎn)的地址一定要和RamCode_Add_V一致。
4 小 結(jié)
可見,正確完成代碼搬運的關(guān)鍵在于:
① 確定被搬運代碼的物理地址映射規(guī)則, 物理地址一定是在SDRAM中;
② 被搬運代碼是被燒結(jié)在Flash中,后來又被搬運到SDRAM中;
③ 無條件轉(zhuǎn)移到SDRAM中,運行被搬運代碼(應(yīng)用程序代碼)。
對于其它型號的單片機,可以根據(jù)該原理類推,方法是一樣的,只是具體的代碼不同而已。相信你的單片機系統(tǒng)在經(jīng)過這樣的處理后,效率一定會高很多。
評論