让单片机运行速度更快一些
所以,在RamApp.lnx中指定的定位规则应该在SDRAM中,如下:
MEMORY
{
ram1: ORIGIN = 0x00003000, LENGTH = 0xf000
ram: ORIGIN = 0x00F00000, LENGTH = 0x7000
}
SECTIONS
{
.data : {} > ram1
.text : {} > ram
}
最后,在860单片机系统的地址映射规则如图2所示。对照图1,可以观察到这和传统的程序地址映射有很大不同。

图2地址映射表
3.2 搬运的过程
860T上电复位,RomTool.bin首先被执行,完成初始化工作后,运行代码搬运函数,将RAMapp.bin搬运到SDRAM中,随后改变PC(Program Counter)的值,无条件转移到SDRAM中运行RAMapp.bin,如图3所示。

图3从Flash到SDRAM搬运代码的过程
3.3 搬运代码的驱动模块及跳转模块源代码
(1)搬运代码驱动模块的代码
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)主函数及跳转模块
#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 );
# 跳转模块
asm(“addis r2,0,0x00f0”);
asm(“ori r2,r2,0x0000”); # 代码起始地址0x00f00000
asm(“mtspr LR,r2”);
asm(“bclr 20,0”); # 无条件转跳到链接寄存器
# (LR)中的地址
}
FlashCode_Add_V:被搬运代码的首地址,在Flash中。
RamCode_Add_V:被搬运代码的目标地址,在RAM中。
CodeLen_V:被搬运代码的长度,按32位计算。
该函数在调用代码搬运MoveCodeF_to_RAM函数,将代码从Flash搬运到SDRAM中后,将程序指针转移到SDRAM中。注意跳转的地址一定要和RamCode_Add_V一致。
4 小 结
可见,正确完成代码搬运的关键在于:
① 确定被搬运代码的物理地址映射规则, 物理地址一定是在SDRAM中;
② 被搬运代码是被烧结在Flash中,后来又被搬运到SDRAM中;
③ 无条件转移到SDRAM中,运行被搬运代码(应用程序代码)。
对于其它型号的单片机,可以根据该原理类推,方法是一样的,只是具体的代码不同而已。相信你的单片机系统在经过这样的处理后,效率一定会高很多。
评论