微处理器从内存RAM中取指令的速度要比从flash中取指令要快好多倍,但是RAM的缺陷限制了其不能存储用户程序代码,因为RAM掉电会丢失数据,但是其速度要快,而flash内信息掉电不丢失,因此可以保存用户编程的代码,但是其运算速度使得在一些实时性要求高或者对时间要求苛刻的场合不能满足要求。如果能够将两者有机的结合到一起,从而可以解决这两者之间的矛盾。
从片内flash搬运到RAM中的方法有两种不同的选择,一种是将flash中部分代码搬运到RAM中运行;另一种便是将flash的所有程序代码都搬运到RAM中运行。前者利用#pragma CODE_SECTION(cpu_timer0_isr, "ramfuncs");来声明将所要搬运的函数在flash上电初始化时自动将声明的函数搬运到RAM的ramfuncs段中,此方法也可以将所有的函数代码都搬运到RAM中,但是,这无疑有点麻烦,有多少个函数就需要写多少条这样的语句,而且也只是搬运了函数代码,其他的初始化数据段没有搬运,但是这种方法可以在用户程序太大以至于RAM中无法将所有代码都容纳下的情况下,将部分主要的要求时间苛刻的函数搬运到RAM中运行以提高系统性能,例如一些中断函数。第二种方法可以在用户编写代码都能被RAM所容纳下的情况下提高系统整体的性能,将flash代码全部搬运到RAM中。但是当代码不能被RAM所容纳时此方法编不在可行,只有硬件外扩RAM才行。下面就介绍一下这两种方法的具体实现方法:
方法一:
1、 cmd定义:
ramfuncs : LOAD = FLASHJ, PAGE = 0
RUN = RAMH0, PAGE = 0
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
2、定义变量(装载或运行的起始地址)
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
3、把要拷贝到RAM里的函数(eva_timer1_isr,eva_timer2_isr...)定义到段ramfuncs
#pragma CODE_SECTION(eva_timer1_isr, "ramfuncs");
#pragma CODE_SECTION(eva_timer2_isr, "ramfuncs");
#pragma CODE_SECTION(evb_timer3_isr, "ramfuncs");
// 声明中断函数
interrupt void eva_timer1_isr(void);
interrupt void eva_timer2_isr(void);
interrupt void evb_timer3_isr(void);
interrupt void evb_timer4_isr(void);
//初始化flash 控制寄存器函数为
void InitFlash(void)
{
//函数内容省略,可参考TI提供的函数即可
}
4、在主函数中执行调用以下函数
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
至此便将声明的中断函数在flash上电初始化时自动搬运到RAM中运行。
方法二:
1、参考博文:DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行
2、参考论文《基于DSP28335程序移植方法的研究与实现》 有助于理解系统启动过程及FLASH引导模式