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.

[参考译文] TM4C1290NCPDT:TM4C1290上的 DMA 性能问题

Guru**** 2553260 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/766724/tm4c1290ncpdt-dma-performance-questions-on-tm4c1290

器件型号:TM4C1290NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

我正在做一些设计可行性工作。  我正在尝试了解 TM4C1290中 UDMA 的性能。  我的主要问题是、我是否有足够的 DMA 性能来跟上从外设端口寄存器进行的异步数据采集的步伐而不丢失任何数据。  因此,我非常想在下一个数据样本到达之前确定通过 DMA 进行数据采集所需的时间。

中央设计是从外设端口寄存器进行读取并传输到循环 RAM 缓冲器进行后处理。  虽然一些采样脉冲之间的时间很短、但平均速率是可以对数据缓冲区进行后台处理的。
我无法使用乒乓、因为我需要通过添加另一个 ISR (用于支持乒乓)来避免干扰现有复杂的中断结构。
因此,我计划使用散聚模式,每次从数据端口传输到缓冲区时,都有一个‘任务’。  我将有一个 N 项循环缓冲器、其中包含一个 N+1任务的并行列表。  每个任务将专用于将数据传输到数据缓冲区中的相应位置。  

列表中的最后一个任务(N+1)将重写主控制结构体的控制字段,以便使缓冲区是循环的。  为了方便起见、任务只写入32位控制字段。  我认为、无需在主控制结构体中重写源和指定字段、因为在任务列表运行时它们不会被更改。

问:对这个整体设计有什么意见?

如果您能回答以下问题、我对我的绩效限制的分析将会大大增强。  请在您的回答中参考问题编号。
谢谢!!

散 聚未用场的成本-使用散聚时,似乎有浪费将任务列表中任务的‘未用’场转移到副控制结构体。  换言之,我不得不转移任务的所有4个字(浪费一个读和一个写总线周期),即使只有前3个字是‘live’。  这基于图9-3存储器散聚、设置和配置[DS-TM4C1290NCDT-15863.2743、2014年6月18日]。  在通道控制表的右列中、示例将控制字段列为 items = 12。  实际上有3个任务、每个任务4个字= 12个字。  问题: DMA 控制器是否足够智能、可以跳过第4个(未使用)字段的传输?

 DMA 空闲周期-在散聚 DMA 传输期间、DMA 控制器是否插入了任何总线空闲周期?  不同的问题:是否每个可用的总线周期用于将数据传输到(或从) DMA 控制器和传输的区域(或基于 RAM 的控制结构/任务列表)?  应答时、忽略 CPU 占用的所有总线周期。  

 3.striped RAM -在给定以下假设的情况下、DMA 能否与 CPU 以全速同时运行?  换言之、在以下情况下、DMA 是否会因与 CPU 的总线争用而减慢?  假定:

答: 散聚 DMA 模式用于将数据从外设传输到 RAM 缓冲器。

b. DMA 使用的所有 RAM 都位于 RAM 的条带区部分的专用部分(如上季度)、包括:

一. 主要控制结构。

二  副控制结构体。

三  任务列表。

四.  目标 RAM 缓冲器。

c. 在 DMA 运行时,CPU 永远不会访问 DMA 条带区中的任何 RAM。

d. 忽略 CPU 和 DMA 之间访问外设的任何潜在偶尔争用。

外 设总线-访问外设时、DMA 是否必须等待 CPU 有一个空闲总线周期?  不同的问题:只要 CPU 不同时访问外设、访问外设时 DMA 是否不会延迟?  问题的关键在于:是否有一个与主闪存存储器总线分离(并与之并行)的外设总线?

5. 读取源和目的字段的频率-在 DMA 传输期间、从 RAM 控制结构读取源和目的字段的频率是多少?  我认为答案可能是以下之一。  哪一个?  (或者、还有其他答案吗?)

a: 在 DMA 传输启动期间、这些字段被读取一次。  在丢失通道仲裁并随后重新获得通道仲裁后、不会重新加载这些字段。  换言之、DMA 控制器在重新获得仲裁后会在内部记住这些字段以恢复信道。

b. 在 DMA 传输启动期间、这些字段被读取一次。  在恢复因失去通道仲裁而中断的传输后、这些字段将再次被读取。  换句话说、如果通道失去仲裁、DMA 控制器将会忘记这些字段。

c. 在 DMA 传输启动期间读取这些字段一次。  每个通道仲裁后、这些字段将被再次读取。  即使当前通道未丢失仲裁、也会重新加载。

d. 源字段在从传输的存储器区域的每个读取周期之前被重新读取。  在每个到被传输内存区域的写入周期之前、目的字段被重新读取。  换句话说、在数据传输之间、源和目的不在 DMA 控制器内部维护。

控制 字段的写入频率-在 DMA 传输期间、控制字段被写回 RAM 控制结构体的频率是多少?  我认为答案可能是以下之一。  哪一个?  (或者、还有其他答案吗?)

a: 只有当信道在一次总线传输后失去仲裁时、控制字段才会被写入。

b: 控制字段在猝发传输中传输的数据的每个存储器写周期后写入。  在包含 N 个项目的"降压"传输期间、控制字段将写入 N 次。

控制 字段的读取频率–在 DMA 传输期间、从 RAM 控制结构体读取控制字段的频率是多少?  我认为答案可能是以下之一。  哪一个?  (或者、还有其他答案吗?)

a. 在 DMA 传输启动期间、控制字段被读取一次。  即使在丢失并随后重新获得通道仲裁之后、控制字段也不会再次被读取。  换言之、DMA 控制器在重新获得仲裁后内部将记住该字段以恢复通道。

b. 在 DMA 传输启动期间、控制字段被读取一次。  恢复因失去通道仲裁而中断的传输后,通道的控制字段将再次被读取。

c. 在 DMA 传输启动期间、控制字段被读取一次。  在每次通道仲裁后、即使仲裁没有丢失、控制字段也会被再次读取。

 场景:在散聚模式下、在副控制结构体中运行一个任务、并准备好将下一个任务加载到副控制结构体中。  主控制结构体在下一个任务从任务列表到副控制结构体的 DMA 之前是否重新载入 DMA 控制器?  或者、主控制结构体在运行副控制结构体时是否在 DMA 控制器内部记忆?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    让您知道我已经收到并阅读了您的帖子。 星期一回到办公室时、我需要研究答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、我需要做一些研究、我想在回答您之前咨询我的一位同事。  

    [引用 user="Dave Kellog88"]对此整体设计有何意见?

    您未清楚将读取的"外设端口寄存器"。 散聚模式触发单次请求。 它在 UART、I2C 或 SPI 接收寄存器上不起作用、因为您需要对收到的每个字节发出单独的请求。 GPIO 端口不会产生 uDMA 请求。  唯一可以工作的外设是 EPI。 即使这样、我也不鼓励使用  Gate-Scatter 创建循环缓冲区的 DMA 周期开销很大。 此外、EPI 端口会使 uDMA 机器停止、如果使用其他 uDMA 通道、这可能会很重要。

    您也没有提到最大突发大小。 如果突发大小小于或等于1024个元素、则可以使用乒乓模式并在突发之间轮询 UDMA。  如果 您当前的中断例程不允许在接收到1024个项目后重新配置 UDMA、则应认真 重新考虑 是否可以将中断例程中的某些操作移至 主循环。   

    [报价用户="Dave Kellog88"] DMA 控制器是否足够智能,可以跳过第4个(未使用的)字段的传输?

    [引用 USER="Dave Kellog88"]在散聚 DMA 传输过程中,DMA 控制器是否插入了任何总线空闲周期?

    很抱歉,我不知道也找不到绝对答案。

    [引用 user="Dave Kellogg88"]条带化 RAM -在给定以下假设的情况下、DMA 能否与 CPU 以全速同时运行?  [/报价]

    RAM 配置为4路交错。 它不会被分成存储器空间。 这意味着 UDMA 将从四个组中的每个组加载对任务列表中一个字的读取。 由于与 CPU 的 RAM 总线争用、UDMA 将会暂停。 (CPU 获得优先级。)

    [引用用户="Dave Kellog88"]是否有一个与主闪存总线分开(并与之同时使用)的外设总线?

    是的。

    [引用 USER="Dave Kellog88"]在 DMA 传输过程中,从 RAM 控制结构读取源字段和目标字段的频率如何?

    答案 B:

    Dave Kellog88 说:
    b.  在 DMA 传输启动期间、这些字段被读取一次。  在恢复因失去通道仲裁而中断的传输后、这些字段将再次被读取。  换句话说、如果通道失去仲裁、DMA 控制器将会忘记这些字段。

    [引用 USER="Dave Kellog88"]在 DMA 传输过程中,控制字段多久写回 RAM 控制结构体?

    回答 A:[报价用户="Dave Kellogg88"]只有当信道在失败传输后失去仲裁时,控制字段才会被写入。

    [引用 user="Dave Kellog88"]在 DMA 传输期间,从 RAM 控制结构读取控制字段的频率如何?

    答案 B:[引用用户="Dave Kellog88">在 DMA 传输启动期间、控制字段将被读取一次。  恢复因失去通道仲裁而中断的传输后,将再次读取通道的控制字段。[/引用]

    [引用 user="Dave Kellogg88">在散聚模式下,在备用控制结构体中运行一个任务,并准备好将下一个任务加载到备用控制结构体中。  主控制结构体在下一个任务从任务列表到副控制结构体的 DMA 之前是否重新载入 DMA 控制器?  [/报价]

    否、除非通道失去仲裁、否则在执行备用结构体时会记住主结构体。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:
    感谢您的详细回答–这对您有很大帮助! 但是、它还引发了一些问题:

    关于外设的使用:我打算在端口 M GPIO 上使用散聚模式、期望我可以配置每个位以在上升沿和下降沿触发中断。 我(显然是错误的)期望是、当端口 M 的单个公共 IRQ 由8位上的任何边沿组合置位时、可用于启动 UDMA 请求。

    我根据 TM4C1290NCDT 数据表中的表9-1部分了解情况。 在该表中,通道#14显示为支持端口 M。因此,我仍然感到困惑。 此外、表9-2显示了 GPIO 可以为突发请求生成触发事件。 在第1.3.6.7节“可编程 GPIO”中,它提到每个端口“可用于启动 ADC 采样序列或 UDMA 传输”。

    那么、散聚模式是否有一些特殊的东西阻止它与 GPIO 一起使用? GPIO 端口是否只能用于某些其他 DMA 模式? 如果是、是哪一个?

    我可以通过相同的引脚将信号路由到通用定时器2中、而不是将信号作为端口 M GPIO 传入。 然后、我可以将计时器配置为在边沿更改后发出 UDMA 请求。

    定时器是否支持散聚 DMA? 您没有提到那类外设。

    ++++++++++
    为了帮助我澄清我对“4路交错”对 SRAM 的意义的新理解,请确认我的观点如下。 (感谢您耐心地招待我!!)

    以下是否正确:4路交错本质上是一种将速度较慢的 RAM 与速度较快的 CPU 相匹配的机制?

    在表1-1中,SRAM 被称为“256 KB 单周期系统 SRAM”。 我应该如何解释术语“单周期”?

    地址2000.0000-2000.0003是第一个交错组中的4字节访问、2000.0004-2000.0007访问第二个交错组中的4字节、2000.0008-2000.000B 是第三个交错组中、2000.000C-2000.000F 是第四个交错组中。 然后、每次以2000.0010、16字节的速率重复执行所有操作。 这些访问中的每一个都可以在前面的访问之后8.33nsec 发生、对吧?

    但是、CPU 能否访问一个2000.0000-2000.0003的4字节字、然后访问另一个2000.0010-2000.0013的字、无延迟?

    在数据表的第8.2.1节 SRAM 中、有一条交错说明。 它说,一个写后加上一个读"在同一组中"会导致"单个时钟周期的停顿"。 这里使用的时钟周期是120 MHz 时的 CPU 周期(即、8.33 nsec)、因此失速时间是一个 CPU 周期= 8.33 nsec、对吧?

    本说明的第二段介绍了具有同步访问功能的多个主器件。 因此、如果我足够幸运的是、UDMA 和 CPU 能够同时读取单独的内存组、那么操作确实是并行的、对吧?

    但是、如果 UDMA 尝试访问与 CPU 相同的存储区、那么 UDMA 会延迟8.33 ns、对吧?

    ++++++++
    再次感谢您的帮助-我对此表示感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dave、

    首先、让我纠正一些问题。 GPIO 端口可以生成 UDMA 请求。 您可以将所有8个 GPIO 端口 M 引脚配置为在上升沿或下降沿生成 UDMA 请求。  这可能不适合并行端口通信。 首先、如果您要传输相同的字节两次、则不会更改引脚、也不会发出 DMA 请求。 第二个问题是两个引脚"同时"发生变化。 如果这种改变与一个内部时钟边沿同时发生、即使两个边沿时序上的微小差异也有可能引起两个 UDMA 请求、从而导致两次读取。

    如果这两个问题都不会影响您、让我们来讨论散聚模式。 在此模式下、单个 UDMA 请求将导致执行整个"任务列表"、而不仅仅是一次读取。 如果您希望在每次线路发生变化时读取8位 GPIO 端口、则应使用仲裁大小为1的乒乓模式。 然后、每个 UDMA 请求都会导致一次对 GPIO 端口的读取、该端口将存储在缓冲器中。 此类读取中有多达1024次后、您会收到中断、备用通道最多可控制另外1024次读取。 这样、您就可以在必须为 UDMA 中断提供服务并复位主通道之前读取1024字节的时间。

    [引用 USER="Dave Kellog88"]这种4路交错本质上是一种将速度较慢的 RAM 与速度较快的 CPU 相匹配的机制吗? [/报价]

    不可以、这是一种避免单总线主控长时间阻止到一组 RAM 的访问的机制。

    [报价用户="Dave Kellog88"]我应该如何解释术语“单周期”?

    这意味着 RAM 是在单周期内读取或写入的。 低至8.3nS。 但是、M4 CPU 使用单级写入缓冲 器、因此写入发生时延迟一个周期。

    [引用用户="Dave Kellogg88"]Address 2000.0000-2000.0003是第一个交错组中的4字节访问、2000.0004-2000.0007访问第二个交错组中的4字节、2000.0008-2000.000B 位于第三个交错组中、2000.000C-2000.000F 位于第四个交错组中。 然后、每次以2000.0010、16字节的速率重复执行所有操作。 每次访问都可以在上述访问之后8.33nsec 发生、对吧?

    没错。

    [引用 USER="Dave Kellogg88"]但是,CPU 能否访问一个2000.0000-2000.0003的4字节字,然后立即访问另一个2000.0010-2000.0013的字?

    如果两次访问都被读取、是。 但是、如果第一个是写入、第二个是读取、由于写入被写入缓冲器延迟一个周期、而下一个读取来自同一个组、那么该读取将延迟一个周期。

    [引用 user="Dave Kellogg88">在第8.2.1 SRAM 部分的数据表中,有一条交错说明。 它说,一个写后加上一个读"在同一组中"会导致"单个时钟周期的停顿"。 这里使用的时钟周期是120 MHz 时的 CPU 周期(即8.33 nsec)、因此失速是针对一个 CPU 周期= 8.33 nsec、对吧?

    是的

    [引用 user="Dave Kellog88"]注释的第二段介绍了具有同步访问的多个主站。 因此、如果我足够幸运的是、UDMA 和 CPU 能够同时读取单独的内存组、那么操作确实是并行的、对吧?

    但是、如果 UDMA 尝试访问与 CPU 相同的存储区、则 UDMA 会延迟8.33 ns、对吧?[/报价]

    对两者都是。

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

    尊敬的 Bob:

    我还有一些与使用 DMA 相关的问题。

    首先、感谢您提醒我乒乓模式。  这似乎是比散聚更好的解决方案。

    尊敬的 Bob:

    我还有一些与使用 DMA 相关的问题。

    首先、感谢您提醒我乒乓模式。  这似乎是比散聚更好的解决方案。

    1. 我知道 CPU 使用总线将阻止 DMA 的使用。 我尝试(大致)量化这种情况的发生量、因此我可以获得 DMA 的延迟和吞吐率的近似值。  我认为这不是确定性的。  对吧?

    2. 图8-1“内部存储器方框图”似乎表明 DMA 仅为访问 RAM 和外设而与 CPU 争用。 (我假设我从未配置 DMA 以引用闪存。)  对吧?

    具体 而言、由于 CPU 对闪存、ROM 或 EEPROM 的访问、DMA 永远不会被延迟。 对吧?

     4、不同之处是、DMA 只能由 CPU 同时访问 RAM 或外设来阻止。 对吧?

    5. 您之前已经回答过,但我想确认:当 CPU 访问外设时,访问 RAM 时 DMA 不会被延迟。  对吧?

    6. 对不在自然字边界上的 RAM 进行32位存取是否会有任何 CPU 时序损失? 即、如果 CPU 访问 RAM 中介于两个交错 RAM 组之间的32位字(或16位半字)、这是否需要1个周期?

    7. 在图8-1中,有两个小块,每个小块标记为“SPB”(靠近 Cortex M4块)。 这些是什么?  (我在 PDF 中搜索“SPB”,没有其它命中。)

    8. 是否有任何应用手册或类似材料可帮助我了解 TM4C129的内部总线结构?

     

    再次感谢您的帮助、

    Dave Kellogg

    我知道 CPU 对总线的使用将阻止 DMA 的使用。  我尝试(大致)量化这种情况的发生量、因此我可以获得 DMA 的延迟和吞吐率的近似值。  我认为这不是确定性的。  对吧?

    图8-1“内部存储器方框图”似乎表明 DMA 仅为访问 RAM 和外设而与 CPU 争用。  (我假设我从未配置 DMA 以引用闪存。)  对吧?

    具体而言、由于 CPU 对闪存、ROM 或 EEPROM 的访问、DMA 永远不会被延迟。  对吧?

    不同的是、DMA 只能由 CPU 同时访问 RAM 或外设来阻止。  对吧?

    您之前回答过、但我想确认: 当 CPU 访问外设时、访问 RAM 时 DMA 不会被延迟。  对吧?

    对于不位于自然字边界上的对 RAM 的32位存取、是否存在任何 CPU 时序损失?  即、如果 CPU 访问 RAM 中介于两个交错 RAM 组之间的32位字(或16位半字)、这是否需要1个周期?

    在图8-1中,有两个小块,每个小块标记为“SPB”(靠近 Cortex M4块)。  这些是什么?  (我在 PDF 中搜索“SPB”,没有其它命中。)

    是否有任何应用手册或类似材料可帮助我了解 TM4C129的内部总线结构?  

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

    [引用 user="Dave Kellogg88"]1.  我知道 CPU 对总线的使用将阻止 DMA 的使用。 我尝试(大致)量化这种情况的发生量、因此我可以获得 DMA 的延迟和吞吐率的近似值。  我认为这不是确定性的。  对吗?[/报价]

    是的、我同意。

    [引用用户="Dave Kellogg88"]

    2. 图8-1“内部存储器方框图”似乎表明 DMA 仅为访问 RAM 和外设而与 CPU 争用。 (我假设我从未配置 DMA 以引用闪存。)  对吧?

    具体 而言、由于 CPU 对闪存、ROM 或 EEPROM 的访问、DMA 永远不会被延迟。 对吧?

     4、不同之处是、DMA 只能由 CPU 同时访问 RAM 或外设来阻止。 对吧?

    [/报价]

    对、对、对。

    [引用用户="Dave Kellogg88"]6.  对于不位于自然字边界上的对 RAM 的32位存取、是否存在任何 CPU 时序损失? 即、如果 CPU 访问 RAM 中介于两个交错 RAM 组之间的32位字(或16位半字)、这是否需要1个周期?[/引用]

    是的、内部总线为32位宽。 跨越该32位边界的任何未对齐访问都将转换为两次访问。

    [引用 user="Dave Kellog88">在图8-1中,有两个小块,每个都标有“SPB”(靠近 Cortex M4块)。  这些是什么?  (我在 PDF 中搜索“SPB”,没有其它命中。)

    它只是显示了与系统外设总线的连接

    [引用 user="Dave Kellogg88">是否有任何应用手册或类似材料可帮助我了解 TM4C129的内部总线结构?  [/报价]

    我不能认为是一个好的参考。 ARM Cortex M4技术参考手册中包含大量信息、但信息几乎太多。

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

    Bob、您好!

    如前所述、我想在多个输入位到端口 M GPIO 引脚的任何上升沿或下降沿上生成 DMA 请求。  使用 AbrSize = 1的 DMA Ping-Pong,对于检测到的每个边沿,我将把端口数据寄存器的单个副本传输到 DMA 缓冲区中。  我不想在 DMA 启动时中断 CPU。  我也不想在 DMA 完成时中断 CPU。  

    1. 我认为必须进行以下配置。  是这样吗?  是否有任何缺失或不有序的情况?
    a. 通过设置 RCGCGPIO 的位11来启用端口 M 的计时。

    对于端口 M 上的每个位位置:
    b. 将 GPIODEN 中的位写为1可启用数字功能。
    c. 将 GPIODIR 中的位写入0以选择输入方向。
    d. 将 GPIOAFSEL 中的位写入0以视为 I/O 位。
    e. 将 GPIOIS 中的位写入0以选择边沿触发中断。
    f. 将 GPIOIBE 中的位写入1以选择上升沿和下降沿上的中断。
    g. 使用 IBE 后忽略 GPIOIEV。
    h. 忽略 GPIOPCTL、因为不使用替代复用功能。
    i. 将 GPIODMACTL 中的位写入1以启用 DMA (根据第10.3.2.3节)。
    J. 将 GPIOIM 中的位写入1以启用中断(根据第10.3.2.3节)。


    2. 如何避免中断 CPU?  具体而言、第10.3.2.3节"引导设置 GPIOIM 中的位"让我感到困惑。  在某种程度上、是否需要中断来生成 dma_req 信号?  

    如果 我使用边沿触发中断(而不是 DMA)、我知道我必须在 DPIOICR 中写入位来清除中断。  由于我正在使用乒乓 DMA、如何清除边沿中断?

    在 TM4C1290的数据表 中、第9.2.8.2节触发外设中、第二段讨论了两个以上等待请求中具有潜在 dma_req 损耗的重叠 DMA 请求。  因此、我是否可以将 dma_req 视为一个简单的脉冲?  因此、不需要清除或确认请求?  如果忙、DMA 控制器是否可以缓冲一个(而不是两个)未处理的请求?

    5. 几个问题周期之前,我了解外设散聚 DMA (PSG)是不可取的,因为它不能处理来自外设的传输,例如由 GPIO 端口上的边沿发起的传输。  但是,在第9.2.6.6节“外设散聚”中,它指出 UDMA 将等待外设的后续请求,然后再继续。  
    尽管我喜欢乒乓 DMA 的设计、但它比 PSG 更好、 我可以看到、如果在从端口 M 传输每个字节后必须完成中断清除、则可能需要 PSG 与存储器散聚功能组合。 乒乓 DMA 为什么不适合我的用例?

    这个 问题更多地是关于检测端口 M 上一个边沿的相对计时、数据寄存器的后续读取以及一个立即的第二个边沿。  我浏览了第26章–电气特性、没有看到任何帮助。  基本问题是:“边沿检测是否由系统时钟计时?”  即、直到下 一个时钟周期、才会检测到端口上的边沿变化。  对吗?   那么、每个边沿的检测被延迟多达一个系统时钟周期?  读取端口数据寄存器时、总线和原始端口引脚之间是否存在锁存、以便在读取端口时在周期中发生变化的位 不会产生歧义?

    7.在之前的问答响应中,您提到过跨越交错 RAM 页之间32位边界的任何未对齐访问都会导致额外的总线周期。  我假设 CPU 的访问和 DMA 的访问都是如此、对吧?

    再次感谢您的所有帮助。

    Dave Kellogg

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

    很抱歉耽误你的时间、但我认为一个示例可能对你更有帮助。 工作需要一段时间(中断次数太多)。

    我附加了一个包含两个 Code Composer 项目的.zip 文件。 两者均在 EK-TM4C1294XL Launchpad 上运行。 第一个项目8BitPortMOut 只需将无限数量的8位值递增写入 GPIO 端口 M。第二个项目8BitPortMann 使用 UDMA 来捕获端口 M 上不断变化的值。两个 Launchpad 的 M 端口通过8根导线和一根接地线进行连接。

    /cfs-file/__key/communityserver-discussions-components-files/908/8BitPortM.zip

    查看第一张逻辑分析仪图片、您可以看到第一个 EVM 大约每110ns 输出一个值。 另请注意、对于相同的计数、有时在一个信号上的转换和另一个信号的转换之间存在几纳秒的延迟。 在我的测试用例中、我从未看到过额外的捕获、或错过了捕获。 不同的值相差太远、以至于都可以捕捉到所有数据、并且边沿相距足够近、以至于不会为单个计数生成多个 DMA 读取。

    我的示例使用了具有两个1024字节缓冲区的 UDMA 的乒乓模式。 我在每个缓冲区被填满后获得一个中断。 如果在填充第二个缓冲区之前没有重置 DMA 传输、我将会错过一些计数。 在我的例程中、主循环不执行任何操作、因此几乎可以立即处理中断。 我切换了一个额外的引脚、以显示我何时处于中断例程中。 中断之间的时间为110.5uS。

    中断例程的长度为2.34uS。

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

    [引用 user="Dave Kellogg88"]1.  我认为我必须进行以下配置。  是这样吗?  任何缺失或失序的内容?[/报价]

    不执行直接寄存器写入。 请参阅上述文章中的示例并使用 TivaWare 函数调用。

    [引用 user="Dave Kellogg88"]2.  如何避免中断 CPU?  具体而言、第10.3.2.3节"引导设置 GPIOIM 中的位"让我感到困惑。  在某种程度上、是否需要中断来生成 dma_req 信号?[/quot]

    在乒乓模式下、如果要捕获超过2048个样本、则需要中断。 我只启用了 GPIOIM 中的 DMA 中断屏蔽位。

    [引用 USER="Dave Kellogg88"] 如果我使用边沿触发中断(而不是 DMA),我知道我必须在 DPIOICR 中写入位来清除中断。  由于我正在使用乒乓 DMA、如何清除边沿中断?[/QUERP]

    您只需清除位8、即 DMA 中断请求位。 请参阅上面发布的项目中的示例。

    [引用 USER="Dave Kellogg88"] 在 TM4C1290的数据表 9.2.8.2触发外设部分中,第二段讨论了两个以上等待请求中 DMA 请求重叠,可能会丢失 DMA_req。  因此、我是否可以将 dma_req 视为一个简单的脉冲?  因此、不需要清除或确认请求?  如果忙、DMA 控制器能否缓冲一个(但不是两个)未处理的请求?[/报价]

    对于 GPIO 端口 M、当任何使能的引脚边沿发生时、只会产生一个请求。 因此、如果在值再次变化之前无法读取 GPIO 数据端口、则会丢失一个值。 如果两行更改以创建新值、并且两次更改之间的时间足够长、您将读取两个值。

    [引用用户="Dave Kellogg88"]6.  这个问题更多地涉及到端口 M 上一个边沿检测的相对时序、数据寄存器的后续读取、和一个紧接着的第二个边沿。  我浏览了第26章–电气特性、没有看到任何帮助。  基本问题是:“边沿检测是否由系统时钟计时?”  即、直到下 一个时钟周期、才会检测到端口上的边沿变化。  对吗?   那么、每个边沿的检测被延迟多达一个系统时钟周期?  读取端口数据寄存器时、总线和原始端口引脚之间是否存在锁存、以便在读取端口时在周期中发生变化的位 不会产生歧义?[/引用]

    对于边沿检测和端口读取、这些引脚与系统时钟同步。 为了获得有效读数、引脚不应在读取周期内发生变化。 所有引脚值都将解析为1或0、但 在读取输入引脚时其电压移动至 Vil 且小于 VIH 的输入引脚可能会解析为任一状态。

    [引用 USER="Dave Kellog88"]在之前的问答响应中,您提到过跨越交错 RAM 页之间32位边界的任何未对齐访问都会导致额外的总线周期。  我假设 CPU 访问和 DMA 访问都是如此、对吧?[/引述]

    DMA 不支持未对齐访问。 要传输的数据必须根据数据大小(8、16或32位)在存储器中对齐。