您好!
我的客户编写了完全相同的代码来控制功率级、并尝试将 ISR_PRG 放置在不同的位置。
当他们将代码放置在 L4 SARAM 中(在下图中注释掉)时、代码可以正常运行。
当它们将代码放置在 L6 DPSARAM 中时、代码无法正常运行、并导致其功率级烧毁。
我们检查了映射文件并在下面找到了差异:
为什么在2个不同的 RAM 部分中运行 ISR 会导致不同的行为?
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.
您好!
我的客户编写了完全相同的代码来控制功率级、并尝试将 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
Howard、
感谢您指出这一点、我忘记了虚拟阅读。 您能否评论一下客户在从 CCS 或独立运行时是否发现此问题。 我提出的原因是、如果在连接 CCS 的情况下加载/运行、我认为在这种情况下有可能跳过 Brom (CCS 处理加载并跳转到 main)。 我们的示例中应该有一些初始化函数来模拟这种情况、包括虚拟读取;这可能会出现在 SYSCTRL.C 中 我会确保这些被调用在调试环境中、否则 CSM 将保持锁定状态。
客户可以做的一件事是在控制代码启动之前(以及在 FET 通电之前)放置一个断点、以避免出现问题)、 然后使用存储器窗口或变量读取任何安全存储器(闪存或 SRAM)、并确保其返回非0000。 如果它们确实读回0000、则表示 CSM 仍然处于活动状态。
最棒的
Matthew