This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
对于一个新项目、我尝试使用 TMS320F28035。 我尝试在 实验套件中运行示例程序 example_2803xAdcc.c。 当我使用"28035_RAM_lnk.cmd"从 RAM 编译时、它可以正常运行。 但是、当我使用" F28035.cmd"从闪存运行时 、程序崩溃、调试器显示它已登录 到 DSP2803x_DefaultIsr.c 的 ILLEGAL_ISR (void)中 能不能帮我解决这个问题
此致、
Ramesh
Ramesh、
问题在于、F28035.cmd 文件在将代码加载到闪存中时、也有一个用于定义为"ramfuncs"的任何段的指令被加载到闪存、但是从 RAM 复制/运行。 在调用此部分中的任何函数之前、必须在 C 代码中处理从闪存到 RAM 的复制。 您选择的示例 ADCexmapping 是 usDelay 函数到"ramfuncs "部分、但由于您尚未将其从闪存复制到 RAM、代码将分支到它期望函数位于内存中的位置、 但它将不会出现、最终您将遇到从未定义的存储器执行的非法 ISR。
以下是.cmd 文件中的部分、它指示链接器将代码加载到闪存、但从 RAM 执行:
ramfuncs : LOAD = FLASHD, RUN = RAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), LOAD_SIZE(_RamfuncsLoadSize), PAGE = 0
要修复此问题、您需要将这些代码行添加到 main 之前的 Example_2803x_Adc3.c 文件中
extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart; extern Uint16 RamfuncsLoadSize;
然后在调用 InitAdc()之前添加此行
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
重新编译/重新加载、现在一切都应该正常。
最棒的
Matthew
尊敬的 Mathew:
感谢您的支持。 我更新了代码。 现在、它不会卡在非法 ISR 中、但仍然无法正常工作。 ADC 数据未更新、并且 LoopCount 未更新。 调试器处于冻结状态。
此致、
Ramesh
Ramesh、
感谢更新、还有一个函数应该从 RAM 运行、当被放置在闪存中时、内存访问时间太慢、无法正常工作。
如果您打开 DSP2803x_adc.c 文件、您将在 第208行看到以下函数
uint16
AdcConversion (空)
将此语句置于函数上方
#pragma CODE_SECTION (AdcConversion、"ramfuncs");
这也会将函数放置在 RAM 中、之后的操作应该正常。
最棒的
Matthew
谢谢 Matthew。 现在工作正常。
此致、
Ramesh