【背景】执行CODE_SECTION搬移程序后,程序进入异常中断分支,去除CODE_SECTION搬移程序,程序执行正常。
【CCS版本】:CCS6.1
【cmd文件如下】:cmd文件无地址冲突,RAM的地址空间有0x2800,而flash要搬移的程序只有0x18a6
MEMORY
{
PAGE 0 : /* Program Memory */
.......
RAMLS0 : origin = 0x008000, length = 0x002800
}
SECTIONS
{
.......
ramfuncs : LOAD = FLASHC,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(4)
}
【map文件如下】:
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
PAGE 0:
........
RAMLS0 00009000 00003000 000018a6 0000175a RWIX
........
ramfuncs 0 00084000 000018a6 RUN ADDR = 00009000
00084000 000008da xxx.obj (ramfuncs:retain)
000848da 000004ff xxx.obj (ramfuncs)
00084dd9 0000027d xxx.obj (ramfuncs)
00085056 00000250 xxx.obj (ramfuncs)
000852a6 00000231 xxx.obj (ramfuncs)
000854d7 00000221 xxx.obj (ramfuncs)
000856f8 000000a0 xxx.obj (ramfuncs)
00085798 00000084 xxx.obj (ramfuncs)
0008581c 0000004f xxx.obj (ramfuncs)
0008586b 00000037 F2837xD_SysCtrl.obj (ramfuncs)
000858a2 00000004 F2837xD_usDelay.obj (ramfuncs)
.......
0 000858a6 _RamfuncsLoadEnd
abs 000018a6 _RamfuncsLoadSize
0 00084000 _RamfuncsLoadStart
0 0000a8a6 _RamfuncsRunEnd
abs 000018a6 _RamfuncsRunSize
0 00009000 _RamfuncsRunStart
【DSP程序如下】:
1)初始化flash:仅执行InitSysCtrl函数,其他flash相关函数未使用,且人为定义了#define _FLASH
#pragma CODE_SECTION(InitFlash, "ramfuncs");
#pragma CODE_SECTION(FlashOff, "ramfuncs");
#define _FLASH
void InitSysCtrl(void)
{
DisableDog();
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitFlash();
#endif
}
2)被调用函数
#pragma CODE_SECTION(TestSampleData, "ramfuncs");
void TestSampleData(void)
{
........
}
【程序执行结果】:
烧写完flash,执行后,直接进入非法中断程序中。 一旦将除flash操作外的所有的CODE_SECTION全部删除,不再进行flash搬移到ram操作,程序执行完全正确,不会再进入非法中断中。
// Illegal Operation Trap
interrupt void ILLEGAL_ISR(void)
{
// Insert ISR Code here
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
asm (" ESTOP0");
for(;;);
}