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.

[参考译文] TMS570LC4357:DMA 控制数据包 RAM 上的写回操作

Guru**** 2439710 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1279098/tms570lc4357-write-and-read-back-operation-on-dma-control-packet-ram

器件型号:TMS570LC4357

您好!

在我的项目中、我使用分配给3个 UART TX 通道的3个 DMA 通道。 其余的 DMA 通道应该未使用。 我要求确保寄存器写入、并且我按以下方式执行:

空 WriteAndRead (volatile uint32_t*常量 preg,常量 uint32_t 值)
{
   *preg=(uint32_t)值);
   Volatile uint32_t actualValue =*半固化;

   if ((actualValue & value)!= value)
   {
       ErrorRaise (值、实际值、*半固化片、半固化片)
   }

借助上述代码、我能够用 非常罕见的发生率 例如调用参数(uint32_t*) 0xFFf80030、0xe)和以下错误参数:
1:0xe、
2:0x0、
3:0xe、
4:0xFFF80030

因此、直到到控制数据包 RAM 的写入完成并且第一次读取操作(param 2)没有返回一个预期值、CPU 似乎没有被阻止。 但在几个时钟周期后、可以观察到正确的值(第3段)。

在《技术参考手册》SPNU563A 中、我找到了以下信息

"20.3.2通道配置":
"- RAM 可由队列 A 和队列 B 状态机以及 CPU 访问。"
"-当有同时访问时、优先级在一个固定优先级机制中由 CPU 解析
具有最高优先级。"

我的问题是:
-这是写或读操作的问题吗? 我需要确保在 DMA 传输触发之前所有参数都到位。
-我们是否可以估计需要应用的最大延迟值,以确保数据到位?
-如果应用一些 do-while ()循环修复一个问题,或者只是隐藏它? 能否说明此类行为的一些背景?
-从参考手册看,软件访问应该具有最高优先级,所以我不明白为什么这个问题是可见的。

感谢您的帮助、

此致、

S·索科洛夫斯基

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

    尊敬的 Sebastian Sokolowski:

    我能否让您的整个项目来测试您所讨论的问题?

    --

    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    遗憾的是、项目代码是机密信息。

    现在我看到、我通过增加计时器中断频率并将其与主计划去同步来提高了问题再现性。 这种方法也会增加 TX UART 流量、因此也属于这种情况。

    我猜、"控制数据包 RAM"读取操作不是原子操作。 那么、当操作过程中触发中断时、将会发生什么情况?

    此致、
    塞巴斯

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

    您好 Jagadish:

    我还有一些更新。

    "控制数据包 RAM"读取期间触发的定时器中断似乎会返回"0"而不是正确的值。 如果具有高可能性、其他中断也可能影响读取操作。  

    我执行了以下步骤来重现问题:
    -为3个 UART (SCI1、SCI3、SCI4)生成较大的 TX DMA 流量
    -将"RTI1比较中断0"配置为变量的原子增量。
    -在"控制包 RAM"中设置值之前对该变量进行原子读取
    -当问题被发现时,再次读取此变量。

    因此、我将在数据写入/读取期间观察变量的递增。 为了获得复制效果、我有时需要~20分钟的测试循环。 现在我有6个重现性-所有都具有观察到的变量增量、但位于不同的 RAM 地址上。 第二次读取的数据似乎总是返回正确的值、因此我认为读取操作会出现问题。

    此致、
    塞巴斯

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

    您好!

    进一步测试后、我看到上述中断问题不是根本原因、而是 硬件和软件之间额外波动的来源。  

    我发现有必要使用3个 DMA SCI TX 通道来重现此问题。 其中2人处于发送待定状态。 根据下图、我猜测一个由 FIFO A 处理、第二个由 FIFO B 处理、第三个是使用 CPU I/F 访问数据以进行配置。 因此、我们有3个资源并行尝试使用控制数据包访问仲裁器来访问控制数据包 RAM。

    您能否从硬件角度验证这种情况是否会导致在 CPU I/F 上读取0值而不是正确的值?

    下面是伪代码、它允许我重现此问题:

    #define buffer_size 128U

    while (true)
    {
      if (false == CheckUartTransmissionPending (Uart1Handler))
      {
        UartWriteDma (Uart1Handler、&buff1[0]、buff_size);
      }

      if (false == CheckUartTransmissionPending (Uart2Handler))
      {
        UartWriteDma (Uart2Handler、&buff2[0]、buff_size);
      }

      if (false == CheckUartTransmissionPending (Uart3Handler))
      {
        UartWriteDma (Uart3Handler、&buff3[0]、buff_size);
      }

    UartWriteDma 中的所有"DMA 控制数据包 RAM"写入操作都由以下函数完成:

    WriteAndRead (volatile uint32_t*常量 preg,常量 uint32_t)
    {
      *preg=(uint32_t)值);
      Volatile uint32_t actualValue =*半固化;

      if ((actualValue & value)!= value)
      {
        ErrorRaise (值、实际值、*半固化片、半固化片)
      }

    此致、

    塞巴斯

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

    您好!

    我知道这种行为很可能是因为在创建新的 DMA 传输之前没有检查"通道等待寄存器"造成的。 除了检查一些不同的寄存器(DMASTAT、 BTCFLAG、 HWCHENAR、SWCHENAR)、

    当我要查看"Channel Pending Register"时、我遇到了新的问题。 在每个 UART/DMA 通道上的第一个 TX DMA 传输后、相应的位处于"挂起"状态。 我可以观察到传输也被触发、但 "Pend"位未被清除。 下面是附加的寄存器状态。 据我所知、没有正在运行的操作、但由于某种原因、仍设置了待定操作。

    您知道为什么在成功传输后暂挂位不会被清除吗?

    此致、
    塞巴斯

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

    尊敬的 Sebastain:

     当接收到独立于 HWCHENS 或 AIM 的硬件请求时、会设置挂起位。 假设您正在使用硬件请求且 AIM = 1、在块传输结束时、PEND 位将被清除、但要重新启动下一个块、外设仍需要向 DMA 模块生成硬件 DMA 请求。  

    有关更多详细信息、请参阅以下主题:

    (13) AIM 的 DMA 挂起行为-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢。此致、
    Jagadish。

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

    您好 Jagadish

    我没有使用 AIM 功能。 由于这是与原始主题不同的主题(最可能与待处理请求的错误同步有关)、我创建了一个新主题、其中包含一个源代码示例:

    e2e.ti.com/.../tms570lc4357-channel-pending-register-is-never-cleared-after-the-sci-tx-dma-transfer-is-completed

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

    您好、Sebastian、

    请查看我在以下主题中的最新评论:

    (13) TMS570LC4357:在 SCI TX DMA 传输完成后、"通道挂起寄存器"永远不会被清零。 -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。