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.

[参考译文] TMS320F28377D:从闪存运行时、CpuTimer1中断发生故障

Guru**** 2562120 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/637524/tms320f28377d-cputimer1-interrupt-failing-when-running-from-flash

器件型号:TMS320F28377D

大家好、

我在28377D 微控制器上启动并运行了一个项目、我最初在28377S 上工作、然后将其移植。  在我的代码中、我有一个 ISR 链接到 CpuTimer1。  目的是检测微控制器和 FPGA 之间的通信故障。  我的基于 RAM 的构建工作正常、但当我在基于闪存的构建上运行代码时、我最终会运行到捕获所有非法_ISR 中。  我很困惑为什么会发生这种情况。  我为项目定义了_flash、因此我知道 ramfuncs 在启动时正在初始化。  我正在对正在发生的情况划伤我的头。  请提供任何帮助。

兰斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Lance、

    是否确保为需要复制到 RAM 的所有段执行 memcpy()?

    您是否尝试找到导致非法 ISR 陷阱的函数/指令? 使用单步执行/断点来识别导致非法陷阱的代码。

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

    我在初始化过程中运行 memcpy()调用。  我定义了_FLASH、因此在 InitSysCtrl 函数调用中调用它。  我的所有 ISR 都设置为从 RAM 以及任何其他时间关键型函数运行。  

    发生 ILLEGAL_ISR 的唯一时间是我使用饼图矢量表设置以使用 CpuTimer1中断、这是我使用代码行执行的操作:
    PieVectTable.Timer1_INT =&comm_watchdog_isr;

    当我随后配置 CpuTimer1Regs 以启用中断时、我会遇到该问题。 如果我从未初始化 CpuTimer1Regs、则不会出现此问题。 我在设置 PIE 矢量后初始化计时器。 我不知道这是否起作用、但我在从 RAM 运行时没有看到任何问题。

    我的配置函数将执行以下操作:
    CpuTimer1Regs.TPR.all = 0x0000;
    CpuTimer1Regs.TPRH 全部= 0x0000;
    CpuTimer1Regs.PRD.All = 0x00000FFF;
    CpuTimer1Regs.TCR.All = 0x4020;

    我还使用以下命令在我的标称 ISR 中重置计时器:
    CpuTimer1Regs.TCR.bit.TRB = 1;

    我尝试调试正在发生的情况、无法单步解决问题。 我可以在开始单步执行之前先完成所有配置并进入主后台循环。 我按住 F5键几分钟、无法使其跳闸非法 ISR。 任何其他想法都是有用的。

    兰斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    作为一个附录、我一直在做一些额外的测试、当我从闪存运行时、由于某种原因被触发的任何 ISR 最终会落入 ILLEGAL_ISR 中。 我将再次检查以确保 ramfuncs 的配置和相关的指针是正确的。

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lance、

    检查映射文件以查找 ISR 的运行地址,并确保代码在运行 memcpy()后位于该 RAM 地址。

    是否使用#pragma CODE_SECTION 将 ISR 分配给.TI.ramfunc 段? 或者您是否创建了不同的段?   

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vamsi、

    我正在使用#pragma CODE_SECTION 在启动时将函数分配给 Ramfuncs。 我查看了.map 文件、它将 RamfuncsRunStart 分配给0x0000A000、所涉及的特定 ISR 位于存储器位置0x0000A086。 当我执行反汇编时、我能够查看该存储器位置、它会找到相关 ISR 例程的第一条汇编指令。 我还检查了 PIE 矢量表、矢量也指向正确的存储器位置。  我不确定使用内存 LS4是否存在任何与之相关的问题。  如果可以的话、我可以更改 ramfuncs 的目标位置。  我不确定此时该怎么办。

    兰斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vamsi、

    我最后修改了我使用的链接器文件、该文件利用了2837xD_FLASH_CLA_lnk_CPU1.cmd 文件。 我将 ramfuncs 的运行位置更改为 LS3而不是 LS4、这似乎解决了问题。 这可能与以某种方式使用 CLA 有关吗? 我的工作正常、但这并不是问题根源的令人满意的答案。

    兰斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lance、

    我在 TRM 中看到以下详细信息。  您是否可以将 LS4配置为 CLA 程序存储器-请检查。  在这种情况下、CPU 无法从 LS4获取、因此您将达到 ILLEGAL_ISR。  希望这对您有所帮助。

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vamsi、

    我检查了 CLA 配置代码、并将 LS4配置为 CLA1程序存储器。 这就是为什么将 ramfuncs 部分切换到 LS3、从而解决了该问题。 感谢所有的帮助

    此致、

    Lance Hummel