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.

[FAQ] [参考译文] [常见问题解答]编译器/TMS320F28377D:使用 BINIT 和 TABLE ()运算符将闪存代码复制到 RAM 问题

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/834944/faq-compiler-tms320f28377d-copy-flash-code-to-ram-issue-using-binit-and-table-operator

器件型号:TMS320F28377D

工具/软件:TI C/C++编译器

您好!

背景:

我尝试从闪存中运行代码、但为了获得更好的性能、某些函数正在从 RAM 中执行。 在 cmd 文件中、使用了 table 操作符和 BINIT、我希望引导加载程序的自动复制功能能够在引导期间将代码从闪存复制到 RAM。

问题描述:

当调试器被连接时、项目运行正常。 编译器在构建项目时没有任何错误消息、在点击"调试"按钮后、调试器可以自动将应用程序置于 main 中、代码可以在我按下"运行"后安全地从该处运行。

但是、如果我断开调试器的连接并按下复位按钮(板载)来复位器件、程序被卡住。 我在 main()中有一个 LED 闪烁功能,用于指示程序运行良好,但 LED 没有闪烁。 如果我关闭器件电源并再次上电(无论是否连接了调试器)、程序将不会仍然运行。

可能的原因:

我在论坛上看到一个主题与此类似。 在这种情况下、原因是需要复制的代码太大、因此引导加载程序复制它所用的时间太长、看门狗跳闸。 如果这也是我的问题的原因、我有一个问题、希望你们能帮我解决。

在 boot28.asm 中、我可以看到、如果使用 binit 和 table 运算符、在引导期间会有代码用于将相对函数从闪存复制到 RAM。 如果看门狗是导致此问题的原因、那么为什么在我的情况下、在连接调试器和调试器件时看门狗未跳闸? 看门狗仅在调试器断开连接或器件未被调试时跳闸、这难道不奇怪吗?

我是说、无论调试器是否已连接、还是器件是否正在调试、都应在所有条件下执行 code_start 函数和_c_int00函数以设置 C 环境。 那么、为什么在调试器件的情况下看门狗没有跳闸? 调试器件时、看门狗复位中断是否被调试器阻止? 感谢大家的帮助。

此致、

John

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

    John、

    [引用用户="John Zhou ]]我看到论坛上发布的一个主题与此类似。 在这种情况下、原因是需要复制的代码太大、因此引导加载程序复制它所用的时间太长、看门狗跳闸。 [/报价]

    您可以通过在 CODE_START 例程的开头禁用看门狗来检查问题的原因是否与看门狗相关。 在这种情况下、在处理 BINIT 表的 boot28.asm 中调用 c_int00例程之前、看门狗将被禁用。  

    使用 CCS 加载和调试代码时、GEL 文件通常用于将目标设置和初始化到连接调试器所需的状态。 尽管我尚未验证、但很可能在目标连接期间禁用 GEL 文件中的看门狗、因此在使用 CCS 进行调试时不会触发该行为、而是仅在独立运行时触发。  

    希望这对您有所帮助。

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

    您好、Aarti、

    非常感谢您的想法。 这正是我要找的。

    [引用用户="AarticG"]

    您可以通过在 CODE_START 例程的开头禁用看门狗来检查问题的原因是否与看门狗相关。 在这种情况下、在处理 BINIT 表的 boot28.asm 中调用 c_int00例程之前、看门狗将被禁用。  

    [/报价]

    我将像您说的那样进行检查、并告诉您结果。 但我旁边没有测试板。 当我回到办公室时、一旦我拿到测试板上的手、我将在2天内完成此操作。

    [引用用户="AarticG"]

    使用 CCS 加载和调试代码时、GEL 文件通常用于将目标设置和初始化到连接调试器所需的状态。 尽管我尚未验证、但很可能在目标连接期间禁用 GEL 文件中的看门狗、因此在使用 CCS 进行调试时不会触发该行为、而是仅在独立运行时触发。  

    [/报价]

    如果是这种情况、那么它肯定会解释很多。 如果您能够稍后验证、您能告诉我结果吗? 非常感谢。

    此致、

    John

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

    您好、Aarti、

    我已经检查了禁用看门狗的问题。 确实是看门狗是导致问题的原因。

    一旦我在 CodeStartBranch.asm (CODE_START 函数)的开头禁用了看门狗、就可以安全地将应用程序加载到闪存中并在没有连接调试器和调试器件的情况下运行。

    在调试器件时以及调试器将应用程序带到 main()之前,看门狗已被禁用的假设似乎是正确的。 总之、如果您能够验证结果、您能告诉我吗? 非常感谢。

    此致、

    John

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

    很高兴听到您的问题得到解决。

    [引用 user="John Zhou ]\n 在调试器件时以及调试器将应用程序带到 main()之前,假设看门狗已被禁用似乎是正确的。 无论如何、如果您能够验证结果、您能否告诉我?

    是的、就是这样、当使用 CCS 进行调试时、您甚至可以通过在 CCS Registers 视图中检查 WDCR 寄存器来确认这一点。

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

    您好、Aarti、

    我已经检查了 WDCR 寄存器。 在 CCS 中按下"Debug"按钮后禁用了看门狗。

    非常感谢您的帮助。

    此致、

    John