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:我可以强制仲裁

Guru**** 2480925 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/908319/tms570lc4357-can-i-force-arbitration

器件型号:TMS570LC4357

我对 DMA 工作集更新有一些疑问。

 

  1. 更新频率如何? 该文件说‘仲裁时’,但这似乎有点手摇。
  2. 是否有办法强制进行仲裁、以便在我检查工作集时始终更新该工作集? 当前我正在触发一个到最高优先级 DMA 通道的软件请求来复制1个字节。 这是否会强制仲裁? 如果通道由于已完成复制1个字节的硬件请求并且当前正在等待下一个字节的另一个硬件请求而没有‘活动’,会发生什么情况?
  3. 如果 DMA 通道无法及时处理请求、SCI 是否可以丢弃字节? 我当前为2个独立的 SCI 端口启用了该 RX 缓冲器。
  4. 我将在下面发布尝试通过轮询使 DMA 正常工作的方法。 这是否合理,或者是 DMA 的限制,我在这种情况下不能使用它?

 

最终目标:使用 DMA 将 SCI 接收到的字节复制到循环缓冲区、并通过轮询 DMA 寄存器在没有中断的情况下处理这些字节。

 

因为在您不知道当前设置的数据包的完整大小的情况下,DMA 不能很好地工作。

 

  1. 512字节循环缓冲区、DMA 将字节从 SCI->RD 复制到使用 DMA_HW 请求和 AUTO_INIT 打开、因此我不必重新启动它。
  2. 1个字节元素、每帧1个元素。 SCI 处于单字节模式。 (与多缓冲器相反)
  3. 设置 Porta / PortB BYPASS、以便立即复制1个字节以实现更快的通道仲裁。

 

轮询结构:

 

每个轮询间隔我都会检查以下内容:

 

FTCFLAG、用于查看 DMA 通道是否已处理帧传输请求。

如果是、

    我清除 FTCFLAG。

     我启动一个高优先级1字节 DMA 副本、该副本应启动任何活动通道并强制仲裁以更新工作集。

     我禁用所有中断(错误除外)

    我检查工作集、使缓冲区中当前的字节数递增、这是由于该通道的 CTCOUNT 寄存器中剩余的帧发生了变化。

     我通过检查当前剩余的帧是否>之前剩余的帧来处理缓冲区回绕。 (表示 DMA 已完成并重新启动。 我想我也可以通过检查 BTFLAG 寄存器来获取该值)

     我重新启用所有中断

    

如果否、我退出、直至下一轮询间隔。

 

我可以检查一下缓冲区中的字节数是否超过了缓冲区的大小(在我可以提取一些字节之前、我们已经走得太远并覆盖了缓冲区)。

 

当前波特率为115200、当前轮询率为333hz (轮询间隔为3ms)。 我目前绝对不会使链路饱和。 平均每秒250-700字节。

 

 

我的数据包大小不定,但具有特定的开始/结束字符,因此我有一个单独的过程来检查 DMA 请求复制到的‘字节接收器’缓冲区,然后提取并处理整个消息。 我遇到的问题是、有时 FTCFLAG 已设置、但工作集未更改。 这是因为过早清除 FTCFLAG 吗? 如果我太晚清除它、即使已接收到字节、也可能跳过轮询间隔。 (假设 DMA 请求在高优先级通道之后、但在我清除标志之前得到处理)。

 

我似乎也在丢弃数据包,尽管从理论上讲,这不应该丢弃任何字节。 (发送的每条消息都需要响应,有时我的响应都很晚,例如,超过300毫秒后,这样它们就会触发‘超时’错误,但一组数据包没有响应,表明有两种情况之一。 1.他们没有得到处理,2. 消息响应未排队/发送。 我目前正在调查此问题,如果未处理此问题,则可能是由于缺少字节而导致 CRC 失败,因此 TX 响应将排队进入类似的512缓冲区,该缓冲区使用单独的 DMA 通道发送 TX, 如果一次有太多消息排队、我可能会丢弃响应。)

 

我想 DMA 实际上可能会在轮询请求之间写入字节525、但我提取字节的过程会将该数字减少到低于下一轮询间隔之前的最大值。 我怀疑情况确实如此,但这并不是不可能的。  如果在轮询间隔期间 bufferCount > buffer_MAX_size、并且我通过 CTCOUNT 寄存器中的 FTC 变化递增 bufferCount、则设置了一个断点来触发。 它没有被击中。

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

    您好!

    1和2:是的。 工作控制数据包仅在仲裁通道时更新。 如果您有两个通道并将其配置为循环仲裁、则 DMA 将对通道0进行一些传输、并以循环方式仲裁到通道1。 每次仲裁通道时、其上下文保存在工作控制数据包中。 因此、存储在 WCP 中的源/目的地址和传输计数将与仲裁边界对齐。 假设每个通道每帧有16个元素、并且您使用的是8位传输大小。 通道0的4个元素传输完毕后、DMA 将切换到通道1。 它将把通道0的 WCP 中的传输计数值保存为12、以便稍后切换回通道0时、它知道仍有12个元素需要传输。  

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

    在您的示例中、每帧使用16个元素。 它的工作方式是否相同、每帧只有1个元件?

     

    例如、每帧1个元素、每块512个帧。

     

    每个 SCI DMA 请求复制1个元素(并扩展为1帧)。 如果我触发更高优先级的 DMA 通道、即使该通道没有活动的 DMA 请求、它是否会强制执行工作集更新?

     

    作为下面的示例、我使用的是时间。 这些都不准确、只是试图为我的意思提供一些背景信息。

    在300us 时、SCI 触发通道4的 DMA 请求以复制1个字节

    在325us 时、通道4 DMA 请求完成该请求

    340us 时、我触发更高优先级通道的软件 DMA 请求。

     

    由于仲裁速率为340us、是否会更新 DMA 通道4的工作集? 或者仲裁是否要求它当前处于活动状态? (在处理复制元素/帧的请求的过程中)。

     

    谢谢

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

    很抱歉、我们迟到了回复。 您是否已解决此问题?