大家好,关于flash程序考到内存运行以及CMD文件有些疑惑,请教一下,盼指点,不胜感激!
l CMD文件配置:
SECTIONS
{
……
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
……
}
l #pragma CODE_SECTION(InitFlash, "ramfuncs");
void InitFlash(void)
{
EALLOW;
FlashRegs.FOPT.bit.ENPIPE = 1;
FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;
FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;
FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;
EDIS;
asm(" RPT #7 || NOP");
}
l DSP281x_GlobalPrototypes.h中:
extern void InitFlash(void);
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
l 主程序中:
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd ,&RamfuncsRunStart );
InitFlash();
初步理解:MemCopy将段ramfuncs的起始地址(FLASHD-0x3EC000)到接收地址的程序拷入内存RAML0(origin=0x008000,length=0x001000,4K×16位)进行运行。
疑问:
1. 段Ramfuncs定义为InitFlash函数,是否仅InitFlash函数导入内存运行呢?从一些资料上看,好像是整个flash程序拷入内存运行,是这样吗?如果这样的话,内存RAML0只有4K×16位的空间,是否要求Ramfuncs中的程序不超过4K×16位?具体是哪些程序拷入内存运行,以及这些程序的大小是否受4K×16位的限制,如果查看拷入内存程序的大小呢?
2. 调试中发现190K大小的TOF.out烧入flash无法运行;编写了一个最简单的指示灯循环点亮的程序,build生产106K的TOF.out,烧入flash运行正常,加MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd ,&RamfuncsRunStart ); InitFlash();函数执行速度快,不加则慢些。对程序的大小限制摸不准了,是否只要TOF.out<256K(128K×16位),均可以写入falsh?
3. 另外仿真器内存调试时,190K大小的TOF.out可以load进去执行正常,而DSP只有18K×16位的ram(M0、M1、L0、L1、H0),程序是load到仿真器去了吗?
4. CMD文件中,内存的M0(1K×16位)、M1(1K×16位)、L1(4K×16位)、H0(4K×16位,一半)用来存储数据,内存的L0(4K×16位)、H0(4K×16位,另一半)用来存储程序。M0存储数据段.stack(函数传递变量或局部变量占用的空间)。L1存储数据段.ebss(大寄存器模式时的全局变量和静态变量预留空间)。H0存储数据段.esystem(动态存储分辨预留空间。如果有far函数,此空间被相应占用,没有,次空间保留为0。Far函数什么意思?)。L0存储程序段ramfuncs(ramfuncs包含哪些程序,如何控制大小?)。
5. 全局静态数组是否存储在L1(4K×16位),那么定义Uint16型数组时最大只能到4096?
6. 假设一个数组中有8K字节固定的数据,全局静态变量没法定义并赋值的话,存到flash里面怎么操作呢?之前C语言51开发通过unsigned char code table[1000]={1,2,3,……1000};DSP中如何实现呢?
|