最近学习了DSP28335,用RAM连接核心板可以运行程序,想着烧到FALSH里面,结果发现程序卡死了,遂去网上找问题并线下摇了个大佬帮忙排查问题。
在这里记录一下问题,以及解决办法。
笔者先去网上搜怎么把RAM程序烧到FLASH里面的,总结为下面:
1、在cmd文件夹(其实放哪里都行,为了方便统一管理笔者放进cmd里面了)里面添加F28335.cmd文件。添加办法:(1)别的历程里面复制一个;(2)右键工程文件名,点击 Add Files... 在下载CCS的文件夹里面搜索F28335.cmd即可。
2、右键F28335_RAM_lnk.cmd文件,点击 Exclude from Build ,会发现该文件会变成灰色,现在cmd文件夹里面只有DSP2833x_Headers_nonBLOS.cmd和F28335.cmd。(想要改回RAM只需要再点一下就行了,然后把F28335.cmd变成灰色)
3、在主函数所在的.c里面加入下面这四个声明:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
4、加入 DSP2833x_MemCopy.c 文件,其实这个文件就一个函数:
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}
5、在InitPieVectTable();//初始化中断向量函数后面加上:
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
到这一步正常就全部完成了,按理说就可以下载到FLASH里面了,但是笔者遇到了问题,下面是描述问题以及是怎么解决的:
CCS编译正常且当时在RAM里面程序也正常运行了,但是按照上面步骤配置完文件后,发现烧入到FLASH的程序不能正常运行,连接仿真器进入调试发现程序会卡死在这个函数里面
interrupt void ILLEGAL_ISR(void) // Illegal operation TRAP
{
// Insert ISR Code here
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
asm(" ESTOP0");
for(;;);
}
经过查询发现是因为模板工程是只在RAM运行的,没有考虑到烧到FLASH里面,它的DSP2388x_SysCrtl.c里面没有 #pragma CODE_SECTION(InitFlash, "ramfuncs"); 这句代码导致的问题。加上后去 F28335.cmd 里的 SECTIONS 里面有下面代码:
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
然后程序就正常了,写出来希望可以帮助一下朋友。