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:EP + DMA 相关问题

Guru**** 2746815 points

Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues

器件型号: TMS570LC4357-TMS570LC4357 EP
Thread 中讨论的其他器件: TMS570LC4357HALCOGEN

尊敬的 TI 团队

通过 DMA 读取数据并将其写入存储器缓冲区时、我遇到了以下情况:

在调试执行期间、数据在缓冲区中可见、但暂停的数据显示为零。

我最终找到了我引用的论坛帖子、但仍然无法确定如何将缓存类型更改为直接写入模式。 后来,我禁用了缓存,发现数据存在于缓冲区中。

配置如下:

image.png

1.如何将缓存类型更改为直写? 更改后是否会有任何不利影响?

2. ADC 连续转换模式+组存储器阈值中断或周期性触发源 (RTI/ePWM)+DMA 的常见用法是什么?

3、是否需要使用 DMA 收集 10 次数据并对每个通道的数据求平均值?(在单个会话中收集的数据是否足够准确?

4. MibADC1 中是否只有三个阈值中断? (每个通道的阈值中断不可能?μ s)

最后是我的代码,期待着答复,谢谢。

hl_sys_main.c 

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

    嗨、Shuo、

    在调试执行期间、数据在缓冲区中可见、但暂停的数据显示为零。
    4. MibADC1 中是否只有三个阈值中断? (每个通道的阈值中断不可能?)

    否、每通道阈值不可用。 只有组级别阈值可用、我的意思是我们需要为组分配信道、并且可以为相应的组提供阈值。

    --
    此致、
    Jagadish。

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

    您好、Gundavarapu、

    感谢您的答复。

    1. 我将尝试使用您提供的链接来解决缓存一致性问题。

    2. 如果我监测由 RTI 驱动的组 25 个通道上的电压和电流、并每次发送 10 个数据点的 DMA 请求、让 MCU 对所有 25 个通道上的 10 个数据点求平均、那么这种方法是否合理? 我的代码有问题吗? (请参阅 HL_sys_main.c)

    3. 当您提到仅支持组级阈值时、您是否参考了下图中所示的三个阈值中断? 是事件 Group1 和 Group2 的中断? 我想对 Group1 使用 25 个信道、为每个信道设置阈值。 如果值低于或超过该阈值、则应触发操作(例如断电)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6129811  如果我监测由 RTI 驱动的组 25 个通道上的电压和电流、并每次发送 10 个数据点的 DMA 请求、让 MCU 对所有 25 个通道上的 10 个数据点求平均、那么这种方法是否合理? 我的代码有问题吗? (请参阅 HL_sys_main.c)

    是的、这种方法通常是合理的。 但是、请确保:

    该器件具有最多 64 字的内部 FIFO。 所以、也许您可以为您的小组保留 50 个字作为 FIFO。 因此、在两次 RTI 中断之后、FIFO 阈值可能到达正确、这将触发 DMA 传输、因此 DMA 会将这些转换后的 50 个字从 FIFO 传输到 RAM。 可能无法一次性移动 10 个数据点。

    [quote userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6129811  当您提到仅支持组级阈值时、您是否参考了下图中所示的三个阈值中断? 是事件 Group1 和 Group2 的中断? 我想对 Group1 使用 25 个信道、为每个信道设置阈值。 如果值低于或超过该阈值、则应触发操作(例如断电)。

    非幅度阈值中断、这是组阈值中断。 请参阅 TRM 的以下部分:

    --
    此致、
    Jagadish。

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

    您好、Gundavarapu、

    如图所示、可以看到我使用了 13 个信道、每个信道采集了 10 次、然后计算了每个信道的平均值。 这应该在单个 RTI 中断内完成、对吧? 目前、该程序似乎运行正常、结果符合预期。 我不太清楚您的观点、如果我在 25 个信道之后使用、是否会超过 FIFO 大小?

    此外、如果使用 DMA 加平均值计算方法、则无需考虑阈值中断的使用、因此目前我们不会详细讨论该问题。

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

    嗨、Shuo Liu、

    对延迟的回复表示歉意!

    如图所示、您可以看到我使用了 13 个信道、每个信道采集了 10 次、然后计算了每个信道的平均值。 这应该在单个 RTI 中断内完成、对吧? 目前、该程序似乎运行正常、结果符合预期。 我对您的观点有点不清楚—如果我以后使用 25 个信道、是否会超过 FIFO 的大小?

    您的配置似乎正常、没有问题。

    即使有 25 个频道,你也不会得到任何问题。 请继续执行此操作、如果您将来遇到任何问题、请告诉我。

    --
    此致、
    Jagadish。

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

    您好、Gundavarapu、

    非常感谢您的答复。

    1.将高速缓存更改为直写式高速缓存会有什么影响?性能会有显著的损失吗?

    2.是否可以通过在 DMA 中断处理程序中调用_dCacheInvalidate_() 函数来解决该问题? 按范围使数据失效。

    3.连续模式必须触发中断后才能获取数据?

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

    嗨、Shuo、

    [quote userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6171774 将高速缓存更改为直写式高速缓存会有什么影响?性能将会显著下降?
    • 直写高速缓存会强制每个写入操作立即进入主内存、从而消除了写入缓冲的优势
    • 性能下降对于写密集型操作将是最重要的
    • 读取操作不应受到显著影响
    • 对于基于 DMA 的应用程序、直写可通过确保缓存一致性、实际上提高系统可靠性
    [quote userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6171774 是否可以通过在 DMA 中断处理程序中调用_dCacheInvalidate_()函数来解决该问题? 或按范围使数据失效。

    是的、在 DMA 中断处理程序中调用缓存失效函数是有效且常用的解决方案 通过 DMA 传输保持高速缓存一致性。

    基于范围的无效验证更高效 :_dCacheInvalidate_()您应该仅使 DMA 写入数据的特定内存范围无效,而不是使整个缓存失效。 这可以最大程度地降低性能影响。

    [quote userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6171774 连续模式必须先触发中断、然后才能获取数据?

    否、连续 ADC 模式在 DMA 可以采集数据之前不需要触发中断。 ADC 硬件在每次转换完成时自动生成 DMA 请求信号、DMA 控制器独立于 CPU 响应这些硬件触发。 代码中的 BTC 中断仅用于在整个缓冲区已满且可以进行处理时通知 CPU、而不是自行启用 DMA 传输。

    --
    此致、
    Jagadish。

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

    您好、Gundavarapu、

    感谢您的及时回复。

    在这种情况下、最佳解决方案是禁用 DMA 写入数据的特定存储器范围。

    但是、我发现在 hl_sys_core.h 中、只有_dCacheInvalidate_()函数的定义存在、但没有函数可使指定范围内的数据无效。

    我在 sl_TMS570LC4357_Noos 项目中也找不到任何相关定义。 如何禁止 DMA 写入特定存储器范围?

    -----------------------------------------------------------------------------------------------------------------------------------------

    关于我刚才提出的第三个问题、我可能没有清楚地表达。

    我在论坛上发现、不建议同时使用 DMA 和连续模式、因为这可能会导致时序问题。

    在没有任何中断(转换结束中断和阈值中断)的情况下、简单地以固定的间隔从 ADC RAM 中获取数据是否可行? 我个人觉得这种做法是不合理的。

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

    嗨、Shuo、

    [报价 userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6172601

    但是、我发现在 hl_sys_core.h 中、只有_dCacheInvalidate_()函数的定义存在、但没有函数可使指定范围内的数据无效。

    我在 sl_TMS570LC4357_Noos 项目中也找不到任何相关定义。 如何禁止 DMA 写入特定存储器范围?

    [/报价]

    您是对的、HALCoGen 生成的HL_sys_core.h仅提供了_dCacheInvalidate_()使无效的结果 完整 数据缓存。 遗憾的是、 HALCoGen 不提供基于范围的缓存无效的内置函数。

    因此、我们可能需要使用 _dCacheInvalidate_ only、最好使整个缓存无效。

    [报价 userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6172601

    关于我刚才提出的第三个问题、我可能没有清楚地表达。

    我在论坛上发现、不建议同时使用 DMA 和连续模式、因为这可能会导致时序问题。

    在没有任何中断(转换结束中断和阈值中断)的情况下、简单地以固定的间隔从 ADC RAM 中获取数据是否可行? 我个人觉得这种做法是不合理的。

    [/报价]

    是的、您是正确的、这可能会导致时序问题。

    但在 DMA 端、我们可以关闭自动初始化。

    如果我们关闭此 DMA 自动初始化、则下一个块将不会在前一个块传输之后发生自动传输。 我们需要在下面将其称为突出显示的 DMA 硬件触发器。

    如果未调用此 API、则不会发生任何进一步的 DMA 传输、并且不会对存储器进行任何覆盖。

    您可以使用该方法。

    但是、我不知道您的转换结束中断方法在这里如何有用、因为转换结束中断只能确保 ADC 转换完成、但并不意味着 DMA 传输完成。 因此、我认为、也许基于这个中断获取数据不是理想的方法。 但在实践中测试它,如果它对你有用,那么你也可以使用这种方法。

    以下是经测试的代码:
    e2e.ti.com/.../DMA_5F00_Memory_5F00_to_5F00_Memory_5F00_Transfer_5F00_RM57_5F00_Hardware_5F00_Trigger_5F00_AutoInit_5F00_Off.zip

    这里、我使用带有 N2HET1[23](控制器上的 J4)的 DMA 硬件触发。

    --

    此致、
    Jagadish。

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

    您好、Gundavarapu、

    1.我在论坛中看到有人在 FreeRTOS 下使用`_dcacheInvalidateRange_()`和`_dcacheCleanRange_()`函数。 这些功能是否仅在 FreeRTOS 下可用?

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/640825/tms570lc4357-how-to-force-the-cached-data-back-into-sram/2365336?tisearch=e2e-sitesearch&keymatch=_dCacheInvalidateRange_#

    2.禁用 DMA 自动初始化并在中断处理程序中调用`dmaSetChEnable`函数。 这应该是避免时序问题的一种方法。

    但我想问的是:建议只使用连续模式(无中断,无 DMA)、然后以固定的间隔从 ADC 的 RAM 读取转换后的数据吗?我认为这是不合理的。

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

    嗨、Shuo、

    [报价 userid=“651544" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588132/tms570lc4357-ep-mibadc-dma-related-issues/6173616

    1.我在论坛中看到有人在 FreeRTOS 下使用`_dcacheInvalidateRange_()`和`_dcacheCleanRange_()`函数。 这些功能是否仅在 FreeRTOS 下可用?

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/640825/tms570lc4357-how-to-force-the-cached-data-back-into-sram/2365336?tisearch=e2e-sitesearch&keymatch=_dCacheInvalidateRange_#

    [/报价]

    HALCoGen 不提供此例程,我在我的所有项目上都验证了,我在生成的 HALCoGen 上没有看到任何具有此名称的 API。

    因此、我认为这个客户是自己实施的。

    但我想问的是:建议仅使用连续模式(无中断,无 DMA)、然后以固定的间隔从 ADC 的 RAM 读取转换后的数据吗?我认为这是不合理的。

    是的、我认为您可以使用这种方法。 我在实施过程中没有看到任何问题。

    唯一需要记住的是、不能保证数据的一致性。 例如、有时您可能会看到部分更新的数据我意味着缓冲区的一半可能有新转换的数据、缓冲区的另一部分可能有旧的转换数据。

    有时、整个缓冲区可能会被一些新数据覆盖、您可能会丢失 一个完整的转换数据周期。

    这些事情可能会发生,如果你对这些事情是好的,那么在实施这种方法不会有任何问题。

    --
    此致、
    Jagadish。