DELAY_US()函数宏定义在F2837xD_Example.h中,实际调用的是F28x_usDelay()函数,这个函数是TI提供的库函数,若工程中使用了基于FLASH的cmd文件,这个函数将被加载到FLASH中,但需要复制到RAM中运行。
复制相关函数到RAM区的函数memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize)在F2837xD_SysCtrl.c中,由函数InitSysCtrl()调用,且这部分语句依赖宏定义条件语句#ifdef _FLASH. 故DELAY_US()正常运行,需在工程中增加预定义_FLASH,且程序中调用函数InitSysCtrl()。
在F28377D单核CPU1程序中,按上述设置,可正常使用DELAY_US()函数。在开发双核程序时,CPU2使用DELAY_US()函数又开始进入非法中断。经查,CPU2程序中没有进行系统初始化,即未调用函数InitSysCtrl(),导致DELAY_US()未能成功复制到RAM中。在CPU2程序中增加代码:
#ifdef _FLASH
//
// Copy time critical code and Flash setup code to RAM. This includes the
// following functions: InitFlash()
//
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitFlash();
#endif
问题解决。