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.

[参考译文] TMS320F28027:当 CSM 被锁定时、固件自动复位

Guru**** 2893300 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/991046/tms320f28027-firmware-automatically-resets-when-csm-is-locked

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

当 CSM 密码未被设定(全部为0xFFFF)时、我有一个应用程序按预期工作、但是当我将密码设定为锁定闪存时、系统运行时间少于一秒、然后复位。  我认为这是因为代码的某些部分正在非法访问受保护的存储器。  如果我在应用程序开始时解锁闪存并将其保持解锁状态、则处理器不会意外复位。

解锁主器顶部的闪存、并且从不重新锁定它(除了复位/断电时发生的自动锁定)、从而在一开始就无法锁定的目的?

或者、查找导致此复位的违规代码的好策略是什么?  我可以在编写 CSM 密码的情况下运行调试器、但它看起来像是一个 catch 22、因为我只需要解锁以连接调试器、而问题仅在锁定时发生。

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

    我不相信 CSM 是发起复位的。 CSM 仅在连接 JTAG 时阻止对安全资源的访问。 来自 TRM:  

    "当 CPU 对片上安全存储器位置的访问受到限制时、该器件是安全的。  当安全时、根据程序计数器当前 指向的位置、可以提供两个级别的保护。 如果代码当前从安全存储器内部运行、则仅阻止通过 JTAG 的访问 (即通过调试探针)。 这允许安全代码访问安全数据。 相反、如果代码 从非安全存储器运行、则阻止对安全存储器的所有访问。 用户代码可以 动态进入和退出安全存储器、从而允许从非安全 存储器进行安全函数调用。 同样、即使主程序 循环从非安全存储器运行、也可以将中断服务例程放置在安全存储器中"

    请尝试以下操作:

    • 禁用应用程序中的看门狗(如果当前已启用)。
    • 如果您的应用中已禁用 WD、请尝试以下操作:将一个非常简单的代码(例如切换您可以在外部监控的 GPIO 引脚)编程到闪存中。 运行此示例时要考虑安全性和安全性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    禁用看门狗会将行为从复位更改为仅无响应。  因此、为了在技术上正确、系统由于看门狗超时而复位、但仅当 CSM 密码已设置时。  如果这是由于非法的存储器访问、这是否意味着在不安全的存储器中运行的代码正在访问安全的存储器?  这是我应该能够在映射文件中找到的吗?

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

    显然、这是 WD 重置您的器件。 您可以通过测量复位脉冲的宽度来确认这一点;由 WD 启动的复位将是512个 OSCCLK 周期宽。 运行为 WD 提供服务的例程时存在一些问题。 该例程从现在开始在哪个存储器中运行?

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

    触摸看门狗的所有代码均从闪存运行。

    如果我理解正确、唯一可以运行的位置代码是 M0/M1 SARAM、这是不安全的。  分配给该存储器的唯一内容是堆栈。

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

    因此、从闪存本身运行应用程序没有问题。 如果未连接 JTAG 连接器、无论您循环通电多少次、您的应用程序都能正确启动、运行、服务 WD 等、前提是器件不能使用密码进行保护。  

    如果器件使用密码进行保护、只要在应用程序中执行不安全例程、应用程序就可以正常运行。  

    只有在使用密码保护设备且未执行不安全例程时、您才会看到问题。  

    您是否尝试过增大堆栈大小?

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

    我在堆栈中添加了0x100、但没有看到任何变化。  如果这是非法访问的结果、则 M0/M1 SARAM 之外运行的代码是否会反映这一点?  我在本节中没有任何内容。

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

    你说的是真的。 总结:  

    • 在安全器件上、CPU 可以安全存储器中提取代码以执行。 应用程序代码不需要显式取消保护。 这就是应用程序通常的运行方式。
    • 在安全存储器中运行的代码将能够读取另一个安全存储器中的任何位置。
    • 但是、在非安全存储器中运行的代码只能在密码匹配流程(PMF)之后访问安全存储器中的某个位置、即在密码写入密钥寄存器且器件不安全之后。  

    由于您没有从 M0/M1执行代码、请尝试我的以下建议:  

    将非常简单的代码(例如切换可在外部监控的 GPIO 引脚)编程到闪存中。 在应用程序中执行不安全代码的情况下、在安全设备上运行此示例。

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

    我已经测试过、在锁定和未锁定情况下、我能够重复切换 IO 而不进行复位。

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

    好的、您的应用程序中似乎存在阻止 WD 服务的情况。 我很难分辨可能发生的情况。 这种性质的问题需要手动调试、远程调试可能无效。 一个建议:您可以在代码的不同部分切换 GPIO 引脚不同次数、以"跟踪"应用程序执行的距离。 除此之外、我现在无法想到任何东西。

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

    我已经把它缩小了、至少首先、这是个问题。  当我初始化 CTRL 子系统时、被调用的函数之一是 CTRL_setEstParams。  此函数是 ROM 函数。  位于 L0 SARAM 中的变量会传递到该函数中。  因此、ROM 代码(不安全)正在访问安全 RAM。  我不明白这为什么会导致 WD 被取消处理、但在之前解锁、在调用此函数后重新锁定似乎允许代码保持运行。

    当系统实际驱动电机时,还有更多代码页可供检查。  您能否确认访问安全 RAM 的 ROM 函数违反了安全存储器?

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

    请澄清"ROM"。 您是指引导 ROM 吗? 我认为这不是因为它不包含一个名为“CTRL_setEstParams”的函数,AFAIK。 或者、您是指用户 OTP、它是安全的?

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

    在进一步检查之后,我认为它实际上是一个引起问题的函数调用 CTRL_initCtrl()。  如果在该函数之前调用 CsmLock、则在 WD 超时后复位。  如果我在这个函数之后调用 CsmLock、我的应用程序继续运行、至少在空闲状态下。  在映射文件中、我找到了以下行:

    abs  003fd88b _CTRL_initCtrl

    TRM 中描述哪些存储器是安全的、哪些不是安全的、这两个表中的任何一个都不表示该地址。

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

    该地址是 IQMath 的一部分: IQMath         003f86  0000082a 0000082a 00000000 RWIX

    请参阅位于 C:\ti\c2000\C2000Ware_3_04_00_00\libraries\boot_rom\F2802x\v2_0\rom_sources\Release 的引导 ROM 映射文件。 该地址是引导 ROM 的一部分、不安全。

    有关器件存储器映射、请参阅 SPRS523P 中的图9-1。

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

    0x3FD88B 不在 IQMath 部分中。  根据存储器映射、0x3FD000 - 0x3FDFFF 是保留段。  这是否仍然不安全?

    即时解锁和在主系统顶部解锁与永不重新锁定之间有何区别?  一个是否比另一个更安全?

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

    您好 Todd、

    [引用 userid="460910" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/991046/tms320f28027-firmware-automatically-resets-when-csm-is-locked/3661685 #3661685"]L0 SARAM 中的变量会传递到该函数中。  因此、ROM 代码(不安全)正在访问安全 RAM。  我不明白这为什么会导致 WD 被取消处理、但在之前解锁、在调用此函数后重新锁定似乎允许代码继续运行。

    正如您所知、ROM 是不安全的、它无法从安全 RAM 访问内容、因此 ROM 函数将无法访问变量、因此代码执行可能不会按预期发生、并且 WD 服务代码可能永远不会执行。 解锁 CSM 后、它工作正常、因为不再存在安全限制。 您需要检查代码并对代码进行正确分区、以便任何非安全函数都不应访问安全存储器中的任何内容。 这将解决您面临的问题。

    此致、

    Vivek Singh

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

    如果我解锁主器件顶部的 CSM、并且从不锁定它、这是否会使系统保持打开状态以从 JTAG 读取、或者它是否保持安全?

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

    如果您解锁 CSM、那么它就像器件上没有安全性一样好。 我们不建议在应用程序代码中解锁 CSM。  

    此致、

    Vivek Singh