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.

[参考译文] TMS320F28034:引导加载程序问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem

器件型号:TMS320F28034

您好!

我的客户有一个引导代码项目和一个应用代码项目。

他们升级应用程序代码的流程如下所示:

1.当从 SCI 接收到升级请求时、应用程序代码将擦除该标志(告知需要对该应用进行插拔)、然后启用看门狗并触发看门狗复位。

在看门狗复位后、代码将转到 code_start、在这里、我们将检查 Flag、然后跳转到引导代码项目 c_int00、在 c_int00之后、我们应该转到 引导代码 main()、在这里我们完成了应用代码的加载、 在 main()的末尾,我们将跳转到应用 c_int00,然后它应该转到应用 main()。

但是,在150个不能正确进入 app main()的应用程序中,我们有20个,但我们确信新的应用程序代码已经加载到器件中,因为我们已经读出内存并比较结果。 我们猜代码卡在应用 c_int00的某个位置、并触发非法陷阱。

我们已将坏器件焊接到好的电路板上、问题出在坏器件上。

我们不知道为什么它会滞留在应用 c_int00中。 我们猜这是因为我们已经完成了两次 c_int00、一次引导 c_int00、一次应用 c_int00。

但为什么它会导致问题呢? 为什么仅在某些器件上出现该问题?

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

    Howard、  

    它将需要更多的调试来缩小问题范围。   

    [引用 userid="2766666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem ]我们不知道为什么它会滞留在应用 c_int00中。 我们猜这是因为我们已经完成了两次 c_int00、一次引导 c_int00、一次应用 c_int00。[/quot]

    听起来基本流程适用于大多数器件、因此我认为没有两个 c_int00必然是问题所在。  我要问的问题是器件卡在 c_init00中的确切位置(以及原因)?   

    您是否可以尝试使用 CCS 连接到"块"器件、仅加载符号、重置并在其卡住的地方进行调试?  CPU 尝试执行什么操作,以及导致它卡住的原因-例如循环索引错误?  

    是仅在执行更新流程时卡住、还是在不更新时卡住 (即卡在"是"路径和"否"路径中)。

    这种行为是否是最近开始的? 以前是否有工作流程发生了变化?  了解发生了什么变化(如果有)有助于缩小问题范围。

    我还建议检查是否有任何勘误表或使用说明适用于这种情况。

    -洛里

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

    您问:您能否尝试使用 CCS 连接到"块"器件、 仅加载符号、复位和调试其卡住的位置?  CPU 尝试执行什么操作,以及导致它卡住的原因-例如循环索引错误?  

    我的答案:它在这里很糟糕

    您问:它是仅在更新流程中卡住、还是在不更新时卡住 (即它是否停留在"是"路径和"否"路径中)。

    我的答案:不更新时不会卡住。

    您问:这种行为是否是最近开始的? 以前是否有工作流程发生了变化?  了解发生了什么变化(如果有)有助于缩小问题范围。

    我的答案:以前、我们不会直接分支到应用 c_int00。 我们将标志写入0x5A、然后触发看门狗复位、然后返回到 CODE_START 并分支到应用 c_int00。  

    这就是我们怀疑 c_int00的原因。 由于使用之前的工作流程、在 code_start 后将只有一个 c_int00。 使用新的工作流程、将执行2个 c_int00。

    我们怀疑 c_int00、因为我们猜它会占用部分 RAM 并写入一些特定的值、而对于引导 c_int00、它会占用部分 RAM、 如果我们直接分支到应用 c_int00、它也可能占用 RAM 的某些部分、并且可能会与引导 c_int00使用的区域发生冲突。

    我希望您能够确认我怀疑不可能发生的情况、并且问题不应与 RAM 有关、然后我可以研究其他原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="27666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3773174 #3773174"]

    我的答案:它在这里很糟糕

    [/报价]

    这似乎是应用程序代码内的无限循环。  汇编代码显示"无条件分支至标签 FXM_F_selfLoop "。   由于 FXM_F_selfLoop 是同一个位置、因此它只是循环。  如果代码位于此处、则它将一直循环(正在执行此操作)、除非看门狗超时。  

    我不认为 FXM_F_selfLoop 是 c_init00的一部分。   您能否确认 FXM_F_selfLoop 是应用程序代码的一部分?  映射文件将在此处提供帮助、因为它将显示映射到该存储器位置的内容。  如果这在应用程序代码中、 CPU 如何在这个 while 循环中永久结束? 或者、系统中是否应该发生不应该发生的事情?

    [引用 userid="2766666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3773174 #3773174]c_int00、因为我们猜它会占用部分 RAM 并写入一些特定值、对于引导 c_int00、它会占用部分 RAM、 如果我们直接分支到应用 c_int00、它也可能占用 RAM 的某些部分、并且可能会与引导 c_int00使用的区域发生冲突。

    我建议检查.map 文件、看看不同初始化之间在内存使用方面是否存在任何冲突。  另一个建议是在工作用例中的初始化之后转储内存、并将其与非工作用例进行比较。  

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

    您好!

    初始化后、我们使用 CCS 存储器浏览器转储了 RAM 和闪存以获取良好的器件和不良器件。 好器件和坏器件闪存看起来是相同的(我只是大致检查、因为我没有软件来比较2个 bin 文件)、但 RAM 是不同的。

    e2e.ti.com/.../good-device-whole-flash.bine2e.ti.com/.../good-device0x0_7E00_0x400.bine2e.ti.com/.../good-device0x8000_7E00_0xA000.bine2e.ti.com/.../bad-device-whole-flash.bine2e.ti.com/.../bad-device-0x0_7E00_0x400.bine2e.ti.com/.../bad-device-0x8000_7E00_0xA000.bin

    引导代码和应用代码的存储器映射 如下:引导位于闪存扇区 A 中、应用位于其余扇区中。

    e2e.ti.com/.../APP.mape2e.ti.com/.../Boot.map

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

    Howard,我将查看您发送的信息,并在星期一返回给您。  

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

    Howard、  

    [引用 userid="3469" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3773342 #3773342">我不认为 FXM_F_selfLoop 是 c_init00的一部分。   您能否确认 FXM_F_selfLoop 是应用程序代码的一部分?  映射文件将在此处提供帮助、因为它将显示映射到该存储器位置的内容。  如果这在应用程序代码中、 CPU 如何在这个 while 循环中永久结束? 或者、它是否应该在这里结束、但系统中应该发生一些不是这样的情况?

    对此问题有任何反馈?  看起来它在 app.map 和 boot.map 中。   

    [引用 userid="27666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3774552 #3774552"]但 RAM 不同[/quot]

    好的-它实际上是在使用的 RAM 吗?  

    应用程序是否假定 RAM 位置是特定值而没有 设置 初始值?  例如-如果一个位置在加电时被假定为零。 在某些器件上可能是这样、但在其他器件上可能不是这样。  在此器件上、加电后 RAM 处于未知状态。

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

    对此问题有任何反馈?  看起来它在 app.map 和 boot.map 中。  

    Howard:似乎 FXM_F_selfLoop 既不在 app.map 中也不在 boot.map 中、我在两个映射文件中都找不到它。

    应用程序是否假定 RAM 位置是特定值而没有 设置 初始值?  例如-如果一个位置在加电时被假定为零。 在某些器件上可能是这样、但在其他器件上可能不是这样。  在此器件上、加电后 RAM 处于未知状态。

    霍华德:我不确定、什么类型的代码会将 RAM 位置假定为特定值? 如何使用我们自己的代码将所有 RAM 归零?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="2766666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3777742 #3777742"] FXM_F_selfLoop [/quot]

    Howard、 有一个拼写错误-我的问题是关于 FXN_F_selfLoop。  它是您与循环永远共享的反汇编中显示的函数。

    [引用 userid="27666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3777742 #3777742]Howard:我不确定、哪种代码会将 RAM 位置假定为特定值? 如何使用我们自己的代码将所有 RAM 归零?

    一个示例-如果代码显示 if (x = 0) but x was never initialized (x = 0)、则代码假定为0或非零-加电后两者都不是确定性的。  相反、代码应初始化变量。

    我的目标是提供调试问题的想法。  我真的觉得客户应该尝试在连接 Code Composer Studio 的情况下重新创建该场景。  设置一个从其中调用无限循环函数的硬件断点、并查看代码为什么会出现在那里。   

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

    Lori、

    我确信  FXN_F_selfLoop 是从引导中调用的、因为地址是0x3f6b83、与引导映射文件匹配。

    但我不知道如何进行调试以了解它如何最终实现 FXN_F_selfLoop。

    我们已经在引导代码的 LB c_int00处设置了一个断点、它可以在那里停止、然后我们单击"恢复"图标、它将在 FXN_F_selfLoop 结束。

    我们不知道在哪里可以找到 c_int00源文件、也不能使用 CCS 进行分步调试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="2766666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3777835 #377835"]我确信  FXN_F_selfLoop 是从引导中调用的,因为地址是0x3f6b83,它与引导映射文件匹配[/quot]

    我相信我还看到了应用程序.map 文件中列出的此函数?

    [引用 userid="27666" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3777835 #377835"]

    我们已经在引导代码的 LB c_int00处设置了一个断点、它可以在那里停止、然后我们单击"恢复"图标、它将在 FXN_F_selfLoop 结束。

    我们不知道在哪里可以找到 c_int00源文件、也不能使用 CCS 进行分步调试。

    [/报价]

    这是编译器源代码的一部分。  当 CCS 为源代码提供服务时、浏览到编译器安装位置。   这可能位于 CCS 目录下(C:\ti\ccs1031\ccs\tools\compiler...) 但取决于安装。  检查项目属性可帮助您找到它:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="3469" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1020720/tms320f28034-bootloader-problem/3777856 #3777856"]
    我确信  FXN_F_selfLoop 是从引导中调用的、因为地址是0x3f6b83、与引导映射文件匹配

    我相信我还看到了应用程序.map 文件中列出的此函数?

    [/报价]

    哦、我明白了。  地址与引导.map 相同。  明白。