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.

[参考译文] TMS320F28069:将 ISR 放置在不同的 RAM 空间内会导致不同的运行方式

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/963470/tms320f28069-place-the-isr-in-different-ram-space-will-cause-different-behavior

器件型号:TMS320F28069

您好!

我的客户编写了完全相同的代码来控制功率级、并尝试将 ISR_PRG 放置在不同的位置。

当他们将代码放置在 L4 SARAM 中(在下图中注释掉)时、代码可以正常运行。

当它们将代码放置在 L6 DPSARAM 中时、代码无法正常运行、并导致其功率级烧毁。

我们检查了映射文件并在下面找到了差异:

为什么在2个不同的 RAM 部分中运行 ISR 会导致不同的行为?

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

    唯一的疑问是  :L4 SARAM 由密码保护、  而 L6 DPSARAM 不受保护。  

    并且通过使用 memcpy()将 ISR 从闪存(安全)复制到 RAM、然后在 RAM 中运行。

    但是、器件不受保护、所有密码为0xFFFF、这意味着器件被解锁。

    我的问题是:

    考虑到器件未锁定、在不同的 RAM 部分中运行 ISR 代码会导致不同的行为是什么?

    2.如果器件被密码锁定、如何将代码从闪存复制到 RAM? 复制到安全 RAM 和不安全 RAM 之间是否有任何区别?

    3.如果 ISR 代码被复制到不安全的 RAM 中、并且代码将使用 已初始化的全局变量(应该驻留在安全闪存中)、ISR 代码是否能够使用它?

    4.如果 ISR 代码被复制到不安全的 RAM 中、并且代码将调用驻留在安全 RAM 中的函数、是否会正确调用该函数?

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

    Howard、

    我相信、安全/非安全可能是您提到的问题。

    尽管 CSM 中没有密码(器件不安全)、但在启动 位于0x3F7FF8-0x3F7FFF 的 CSM 密码位置时仍需要一次性读取。  完成此操作后、具有安全功能的所有 RAM 都将解锁并完全可读。

    如果在程序开始时执行此操作、器件将保持解锁状态、直到下一个电源循环或 XRSn 事件。

    这对于客户来说是最快的途径、因为他们不必更改代码来提供安全保护。

    要回答您的后续问题、如果器件保持安全/锁定状态、则访问将如下所示:

    -如果代码从安全存储器执行、则可以毫无问题地访问其他安全存储器中的数据

    -如果代码从非安全存储器中执行、它不能只从安全区域"读取"数据、而是需要对安全存储器进行函数调用、然后将任何数据返回到非安全函数。

    我建议客户通过 TRM 的安全部分从上述链接中阅读、以进行完整的分析。

    最棒的

    Matthew

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

    Matt、

    在 TRM 中、它说:

    在引导过程中、引导 ROM 对闪存中的代码安全模块(CSM)密码位置执行虚拟读取。 执行此读取操作是为了解锁新的或已擦除的器件、该器件中未存储密码、因此可以执行闪存编程或将代码加载到 CSM 保护的 SARAM 中。

    我不认为这是问题、因为引导 ROM 已经解锁了器件。

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

    Howard、

    感谢您指出这一点、我忘记了虚拟阅读。  您能否评论一下客户在从 CCS 或独立运行时是否发现此问题。  我提出的原因是、如果在连接 CCS 的情况下加载/运行、我认为在这种情况下有可能跳过 Brom (CCS 处理加载并跳转到 main)。  我们的示例中应该有一些初始化函数来模拟这种情况、包括虚拟读取;这可能会出现在 SYSCTRL.C 中  我会确保这些被调用在调试环境中、否则 CSM 将保持锁定状态。

    客户可以做的一件事是在控制代码启动之前(以及在 FET 通电之前)放置一个断点、以避免出现问题)、 然后使用存储器窗口或变量读取任何安全存储器(闪存或 SRAM)、并确保其返回非0000。  如果它们确实读回0000、则表示 CSM 仍然处于活动状态。

    最棒的

    Matthew