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.

[参考译文] 编译器/TMS320F28379D:BINIT 功能出现问题、可能取决于所复制的代码大小

Guru**** 2589280 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/703086/compiler-tms320f28379d-problem-with-binit-feature-possibly-dependent-on-code-size-being-copied

器件型号:TMS320F28379D
主题中讨论的其他器件: C2000WARE

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

我在 为 TMS320F28379D 控制卡开发闪存应用时使用 C2000编译器的 BINIT 功能遇到了一个奇怪的问题。

我已附上该项目的精简版本。  其中的许多内容来自 C2000ware 通用头文件。

我一直在利用 binit 复制表功能在引导时将闪存的段自动复制到 RAM 中。  到目前为止、它一直运行良好、在这种情况下、我的代码已经增长、它似乎取决于所复制数据的大小。

观察到的行为(使用 C2000 codegen 工具18.1.1、18.1.2)

当我使用调试器进行编程并点击"run"时、一切都正常。  但是、如果我先断电、然后再备份、处理器似乎一直处于复位状态(我检查了引导模式引脚是否设置为 getmode)、并且在连接/未连接调试器的情况下加电时的行为是相同的。  很难调试它的状态、它可能是 ITRAP、也可能卡在引导 ROM 中、不确定。  我确实为 PIE 中的所有矢量分配了一个保留 ISR、如果它到达中断、它会使 LED 闪烁、但我尚未观察到这一点、因此我认为它不是 ITRAP。

明显的权变措施

如果我足够减小 CLA 程序代码大小、此行为将停止、并且我可以多次加电和断电、并且每次启动到闪存应用程序时(通过闪烁 LED 可以看到)。  您可以通过编辑 ClaTasks.cla 并删除所有 _mdebugstop()语句来尝试此操作。  似乎存在某种大小的问题、可能是 binit 例程失败了。  与此处理器中可用于 CLA 代码的0x3000相比、发生这种情况的大小完全不大。  我也不确定这只是与 CLA 代码段相关、这可能会发生在诸如 ramfuncs 之类的其他段中。

如果我使用15.12.7编译器、此行为也会停止(仅在18.1.1和18.1.2中可见)。  我仅测试了这3个编译器版本。

如果我不使用 BINIT 功能、只需将加载/运行变量与 memcpy 一起使用、此行为也会停止。  在项目中、我有两种不同的构建配置。  "DebugBINIT"使用 BINIT 功能。  而"Debug"仅使用加载/运行变量以及 memcpy。

观察结果

奇怪的是、当使用18.1.x 编译器并使用 BINIT 功能以及使用 XDS100v2调试器进行编程时、它在启动后运行良好。  即使我执行暂停、然后复位 CPU、然后重新启动、每次都可以正常运行。  但是、如果我断电、然后进行备份(无论是否连接了调试器)、它都不会引导闪存应用程序。

我发现唯一可行的是不使用 BINIT、不使用15.x.y 编译器或减小 CLA 代码大小。  所有这些似乎都是不相关的,也是奇特的,希望你们能给一些光亮。

e2e.ti.com/.../0334.test.zip

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

    不确定为什么要移动此项? 这似乎是编译器问题

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

    您好、富拉诺、

    在设置 PLL 和禁用看门狗之前、表初始化在启动例程中进行。 如果初始化时间过长、看门狗可能会启动。 您可以在内部使用看门狗禁用来定义某处_system_pre_init()例程。 它是在初始化之前调用的。

    int _system_pre_init (void)

    DisableDog ();

       返回1;


    Edward

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的!
    我在 InitSysCtrl()中的第一个东西是 DisableDog(),但这并不重要,因为看门狗在到达 main()的第一行之前被跳闸。 在 codestart 部分、我必须首先禁用看门狗。

    我想 RTS 库中 boot.asm 中的例程包括 BINIT 表副本、如果这些副本由于代码太大而耗时太长、则 WD 将启动。 谢谢爱德华!!!!!!