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.

[参考译文] TMS320F28377S:启用代码安全模块后、应用程序无法运行

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/737708/tms320f28377s-application-fails-to-run-after-enabling-code-security-module

器件型号:TMS320F28377S

大家好、

我们开发了一个自定义引导加载程序应用程序、用于更新主应用程序。 固件更新过程在启用代码安全模块之前没有问题。 我们的自定义引导加载程序能够擦除应用程序使用的闪存、下载并写入闪存新应用程序、然后使用 CRC 验证新应用程序代码、最后启动新应用程序。

为了使操作更简单、我们仅使用区域1、并将所有闪存和安全 RAM 分配到区域1、如下所示:

     .sect "Dcsm_otp_z1_linkpointer"
;.long   0x1FFFFFFF    ;Z1-LINKPOINTER1
;.long   0xFFFFFFFF    ;保留
;.long   0x1FFFFFFF    ;Z1-LINKPOINTER2
;.long   0xFFFFFFFF    ;保留
;.long   0x1FFFFFFF    ;Z1-LINKPOINTER3
;.long   0xFFFFFFFF    ;保留

     .sect "Dcsm_otp_z1_pswdlock "
   long 0xFFFFFF0F    ;Z1-PSWDLOCK  -保护密码
   长整型0xFFFFFFFF    ;保留

     .sect "Dcsm_otp_Z1_crclock"
;   .long 0xFFFFFFFF    ;Z1-CRCLOCK
;.long   0xFFFFFFFF    ;保留

     .sect "Dcsm_otp_z1_bootctrl"
;.long   0xFFFFFFFF    ;保留
;   .long 0xFFFFFFFF    ;Z1-BOOTCTRL

     .sect "Dcsm_zsel_Z1"

   长   0xFFFFFFFF     ;Z1-EXEONLYRAM
   长   0xFFFFFFFF     ;Z1-EXEONLYSECT
   long   0x10005555     ;Z1-GRABRAM   - CLA、区域1的所有 RAM 块
   长   0x15555555     ;Z1-GRABECT  -区域1的组1和所有闪存扇区

   长   0x111111     ;Z1-CSMPSWD0 (128位密码的 lsw)
   长   0x22222222     ;Z1-CSMPSWD1
   长   0x333333     ;Z1-CSMPSWD2
   长   0x444444     ;Z1-CSMPSWD3 (128位密码的 MSW)

由于所有闪存都分配给区域1、因此应用程序从安全存储器运行。 "ramfunc"也被放置在安全 RAM (RAMD0和 RAMD1)中、任务堆栈也被放置在安全存储器 RAMLS0-5中。 我们将非安全 RAMGS4-11块用于".CIO"、".esysmim"、".ebs"、DMA 缓冲区和用于堆的外部 SRAM。

启用代码安全模块后、我们的自定义引导加载程序仍然能够擦除应用程序使用的闪存、下载并写入闪存新应用程序、验证新应用程序代码、但当新应用程序启动时、处理器挂起、我不知道在哪里。
如果我使用"Wait Boot Mode bootoption"来解锁处理器、然后将 PC 设置为应用程序入口点(在使用我们的自定义引导加载程序更新应用程序后)、则应用程序运行正常。

如何调试这种情况以找出导致 CPU 挂起的原因? 我还应该检查什么?

非常感谢、

多鲁

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

    请在安全存储器中堆栈不是一个好主意。 原因相同、如果您有任何从非安全 RAM 运行的函数、则它将无法访问堆栈、因此代码将无法按预期运行。 您能将堆栈分配到非安全 RAM 中并查看它是否有用。

    此致、
    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Vivek、将堆栈放置在 RAMGS0-3中可以解决该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vivek、

    只需确认我了解为什么在非安全存储器中移动堆栈可以解决该问题。

    我们不会将代码放置在非安全存储器中、但由于我们使用 RTOS 并动态创建函数指针表(位于非安全存储器中的".ebss"部分)、因此我们最终会从非安全存储器调用函数、而非安全存储器无法访问来自安全存储器的数据。

    如果我的假设正确、可能需要在 TRM 中添加注释、因为它不容易被发现。

    再次感谢、
    多鲁
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您的理解是正确的。 TRM 确实提到了从非安全存储器运行的代码无法访问安全存储器中的数据、但未明确解释此问题。 我们将了解将来是否可以在安全 RAM 中添加有关堆栈分配的注释。

    此致、
    Vivek Singh