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.

[参考译文] TMS320F28379S:TMS320F28379S:在具有不同入口点的执行之后无法执行程序

Guru**** 2539500 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003438/tms320f28379s-tms320f28379s-cannot-execute-program-after-execution-with-different-entry-point

器件型号:TMS320F28379S
Thread 中讨论的其他器件:controlSUITE

与 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/758274/tms320f280049-cannot-execute-program-after-execution-with-different-entry-point 中描述的问题几乎相同

图像正常时:

  1.  通过 CCS 成功将映像写入 MCU
  2. 通过调试器成功引导
  3. 已关闭
  4. 通电后、MCU 仍能成功引导

当映像为 NG 时

  1.  通过 CCS 成功将映像写入 MCU
  2. 通过调试器成功引导
  3. 已关闭
  4. 已通电、则 MCU 无法引导

这是我的代码。 请注意 GPIO_WritePin 行 (GPIO_PIN_DEBUG_LED0、低电平)。  注释掉此行后、图像正常。 但是、当我们保持该线时、图像是 NG。

SET_EUSTER_A瞄准_delkey_fan (false、false、true、true、true、200、 200);
睡眠(3);
GPIO_WritePin (GPIO_PIN_DEBUG_LED0、高电平);
SET_EUSTER_A瞄准_delkey_FAN (false、true、false、true、10000, 10000);
睡眠(3);
GPIO_WritePin (GPIO_PIN_DEBUG_LED0、低电平);
SET_EUSTER_A瞄准_delkey_FAN (真、假、真、真、15000、 15000);
睡眠(1);
GPIO_WritePin (GPIO_PIN_DEBUG_LED0、高电平);
GPIO_WritePin (GPIO_PIN_DEBUG_LED1、高电平);
SET_EUSTER_A瞄准_delkey_fan (false、true、true、true、true、20000、 20000);
睡眠(1);
// GPIO_WritePin (GPIO_PIN_DEBUG_LED0、低电平);
SET_EUSTER_A瞄准_delkey_FAN (true、false、true、true、25000、 25000);
睡眠(1);
我注意到 OK 图像的入口点地址是偶数、而 NG 图像的入口点地址是奇数。
入口点符号:"_c_int00"地址:00094a48 //确定
入口点符号:"_c_int00"地址:00094a4f // NG
此外、我跟踪先前的线程以在 /Applications/ti/controlSuite/device_support/F2837xS/v210/F2837xS_common/source/F2837xS_CodeStartBranch.asm 中禁用看门狗、然后入口点的地址仍然为0x00094a4f、但它可以成功引导(在断电和打开后)。
这里是我的开发环境
  • CCS 10.1.0.00010
  • 工具链:TI v18.1.4.LTS
  • controlSUITE: /Applications/ti/controlSuite/device_support/F2837xS/v210/F2837xS_common
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BTW、这里是 F2837xS_CodeStartBranch.asm 的代码

    ;//############################################

    ;// TI 版本:F2837xS 支持库 V210美元

    ;//$Release Date: Tue Nov1  15:35:23 CDT 2016 $

    ;//版权所有:版权所有(C) 2014-2016 Texas Instruments Incorporated -

    ;//       http://www.ti.com/ 保留所有权利$

    ;//############################################

    (三

    WD_DISABLE  .set  1  ;设置为1可禁用 WD、否则设置为0

      .ref _c_int00

      全局代码_start

    (三

    *函数:codestart 段

    *

    *说明:分支到代码起始点

    (三

      .sect "codestart"

    code_start:

      如果 WD_DISABLE = 1

        LB WD_DISABLE   ;分支到看门狗禁用代码

      其他

        LB _c_int00     ;分支到 RTS 库中启动。_asm

      .endif

    ;结束 codestart 段

    (三

    *函数:WD_DISABLE

    *

    *说明:禁用看门狗计时器

    (三

      如果 WD_DISABLE = 1

      .text

    WD_DISABLE:

      SETC OBJMODE     ;为28x 目标代码设置 OBJMODE

      EALLOW        ;启用 EALLOW 受保护寄存器访问

      MOVZ DP,#7029h>>>6 ;设置 WDCR 寄存器的数据页

      MOV @7029h、#0068h ;将 WDCR 中的 WDDIS 位置位以禁用 WD

      EDIS         ;禁用 EALLOW 受保护的寄存器访问

      LB _c_int00     ;分支到 RTS 库中启动。_asm

      .endif

    ;结束 wd_disable

      .end

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

    您好!

    [引用 userid="487521" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003438/tms320f28379s-tms320f28379s-cannot-execute-program-after-execution-with-different-entry-point ]此外、我按照上一个线程在 /Applications/ti/controlSuite/device_support/F2837xS/v210/F2837xS_common/source/F2837xS_CodeStartBranch.asm 中禁用看门狗、然后入口点的地址仍然为0x00094a4f、但可以成功引导(在关闭和打开电源后)。

    禁用 WD 后、代码始终正常工作。 是这样吗? 如果是、我们建议在您的主应用程序中保持 WD 禁用和启用状态、并确保在超时期间为其提供服务。  

    此致、

    Vivek Singh

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

    您好、Vivek、

    感谢您的反馈。 我们将尝试您建议的方法在我们的主应用中启用 WD。

    但是、奇怪的是、为什么不同的地址(尤其是奇数的地址)可以使 WD 超时? 所有这些代码(F2837xS_CodeStartBranch.asm、boot28.asm)都来自 TI CodeSuite。 我们没有修改它们... 您能否分享有关入门级奇数地址问题的更多见解?

    我的猜测是 boot28.asm 尝试初始化存储器映射、基于入口点地址的中断矢量、并且一些 memcpy/memset 操作需要字对齐、16位... 然后、奇数地址会导致对齐错误、然后跳转至错误的 main ()地址...

    BR、

    Yagamy

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

    您好!

    [引用 userid="487521" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003438/tms320f28379s-tms320f28379s-cannot-execute-program-after-execution-with-different-entry-point/3708560 #3708560"]但请注意,为什么不同的地址(特别是奇数地址)可以使 WD 超时?

    我可能会误解这一点。  我认为即使 使用与入口点相同的奇数地址、如果您禁用 WD、它也可以正常工作。 难道不是这样吗?  

    此致、

    Vivek Singh

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

    您的理解是正确的。 让我来整理一下我们已经测试的内容:

    1. WD 被禁用、奇数地址作为入口点=>确定
    2. WD 被禁用、即使作为入口点的地址=>确定
    3. WD 被启用、作为入口点的奇数地址=> NG
    4. WD 被启用、即使作为入口点的地址=>确定

    我的问题是、为什么4个可以工作、而3个不能工作。 在我的代码中、当我只向 GPIO_WritePin 添加一行函数调用时、这会增加目标文件的4个字节、然后使链接器重新排列目标文件、最后将 EntryPoint _c_init00 ()放置到奇数地址。

    虽然我可以始终在  F2837xS_CodeStartBranch.asm 中禁用 WD 以仅处理 12个情况、但我仍然想了解更多为什么4个可以工作、但3个不能工作、因为我们需要向客户提供技术说明、以减轻他们在 F2837xS_CodeStartBranch.asm 中禁用 WD 的顾虑。

    他们认为、禁用 WD  是一种权变措施、如果我们不知道真正的根本原因、则必须有一些副作用。  如果根本原因是以下原因之一、他们可以接受该解决方法:

    • 奇数作为入口点地址、作为 F28379S 的勘误表
    • 工具链中的已知问题、无论是汇编器、链接器还是编译器
    • controlSUITE 中的已知问题

    BR、

    Yagamy

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

    我认为它与入口点无关、因为如果这导致了问题、则 WD 禁用将不起作用。 我想这是因为添加了导致 WD 超时的代码。 我想、添加该行后、由于某种原因、它会增加 WD 禁用前的执行时间、这足以让 WD 超时。 您可以将代码执行从 Entrypoint _c_init00 ()配置为在 main()中运行,这样可以在两种情况下使用 CCS 禁用 WD,并查看是否有任何差异。  

    此致、

    Vivek Singh

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

    您能否指导我如何将代码执行从 Entrypoint 配置为 main()?

    BTW, 我们的程序也会在 main()执行的早期阶段禁用 WD。 它看起来是:

    void main(){

      InitSysCtrl();/*来自 F2837xS_SYSCTRL.c *

      (笑声)

    空 InitSysCtrl(void){
      //
      //禁用看门狗
      //
      DisableDog ();
      (笑声)

    您可以看到看门狗在执行 main()后的很早的阶段被禁用。  c_init00 ()的实现由 TI 提供。 我们没有对其进行修改。 当我们在目标文件中增加4个字节(通过添加函数调用)时,为什么_c_init00 ()的执行需要更长的时间来触发 WD?

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

    您好!

    请参阅此 E2E 帖子以了解代码分析。

    [引用 userid="487521" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003438/tms320f28379s-tms320f28379s-cannot-execute-program-after-execution-with-different-entry-point/3712719 #3712719"]BTW, 我们的程序还会在 main ()执行的早期阶段禁用 WD。 看起来像:[/引号]

    是的、这就是我在之前的帖子中提到的内容。 当您添加少量代码行时、到达禁用 WD 的应用程序代码的执行时间会更长、因此 WD 会超时。 请注意、我们有完整的 cinit 代码、它在 CPU 跳转到主应用程序之前执行。  

    此致、

    Vivek Singh