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.

[参考译文] TMS320F28069F:寄存器不更新

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/977482/tms320f28069f-registers-do-not-update

器件型号:TMS320F28069F

在尝试设置 DCBEVT1时会发生真正的怪异事件、这似乎会忘记 EALLOW、但实际上不会。 代码为:

uint16 st1 = GetST1 ();
uint16 WriteIsAllated = IsRegWriteAllated();
Debug_Assert (WriteIsAllhed);
BridgePwmRegsPtr [相位]->TZEINT.BIT.DCBEVT1 = 0;
DEBUG_ASSERT (BridgePwmRegsPtr [相位]->TZEINT.bit.DCBEVT1 = 0);

由于某种原因、DCBEVT1偶尔未能更改为1。 使用另一个代码、我将检查 ST1中的 EALLOW 位是否被置位、即写入保护被禁用(这是一致的)。 当 DEBUG_ASSERT 中断时、我还会检查调试器中的 EALLOW 位。 我是一个损失、有人知道我在这里做错了什么、或者什么 H/W 或编译器错误会导致这种情况吗?

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

    我现在怀疑它与 CLA 访问相同的寄存器(尽管位不同)有关。 我让 CPU 等待 CLA 完成、到目前为止没有发生错误。 想知道位字段访问对于 TI 编译器是否是原子性的。

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

    约斯特

    虽然读取/修改/写入在 C28x 流水线 sans CLA 内是原子的(超过 D2阶段的指令完成)、但当 C28x/CLA 共存时、我需要检查仲裁。  我知道访问不会丢失、而是会停止。  

    但是、正如您提到的、如果 C28x 读取寄存器内容、并且在它可以写回之前 CLA 会修改该寄存器、那么这个问题可能会发生。  从这个意义上讲、由于 C28x 管线内的读取/写入之间存在一个周期滞后、并且 CLA 也获得一个写入寄存器的自由周期、所以不会有 STALL。

    让我做更多挖掘、并获得有关上述内容的可靠参考/答案。  我今天稍后会回复。

    最棒的

    Matthew

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

    我在 下面的 F2806x TRM 中包含了一个 CPU/CLA 仲裁的片段、并在这里进行了链接。 在这种情况下、它提到了在 R MODIFY W CPU 访问之间发生的 CLA 写入、CLA 写入可能会丢失。  在您的情况下、我认为这取决于编译器如何将您的寄存器操作从 CPU 转换为 R mod W 或其他形式。  更重要的是、R mod 写入不是在同一周期内完成。   

    我们可以通过深入了解拆分来了解具体发生的情况、但通过调试、任何情况下都可以避免对双存取进行任何写入。   

    最棒的

    Matthew

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

    谢谢。 也许 CLA 在两个周期之间读取空、然后在 CPU 写入时为其自身有一个空周期、然后 CLA 将对其进行覆盖。 无论如何、互斥锁在这里不是奢侈品、这解决了问题。 也许我会出于好奇而亲自检查一下拆卸过程。