赞
踩
有关DMAC编程时适用的限制信息,有四个考虑因素:
突发传输(Burst Transfer)是DMA传输中常用的一种模式,它允许DMA控制器在单个传输请求中连续地从一个地址读取多个数据项(或向一个地址写入多个数据项),而不需要CPU的干预。然而,如果这些数据项的地址不是按照特定的对齐方式(如按字节、字或双字对齐)连续排列的,那么这种传输就被称为“未对齐的突发传输”。
固定且未对齐的突发传输可能会导致几个问题:
解决方案:
请注意,以上内容是基于一般DMA传输原理的解释,并未特指某个特定的DMA控制器或系统。在实际应用中,还需要根据具体的硬件和软件环境进行调整和优化。
主要涉及在数据传输或处理过程中,由于不同系统或设备可能采用不同的字节序(Endianness),即大端(Big-Endian)或小端(Little-Endian),而可能导致的限制或问题。
当数据需要在不同字节序的系统之间传输或共享时,就需要进行Endian swap,以确保数据的正确解释。
虽然Endian swap本身是一个相对简单的操作(即反转字节的顺序),但在实际应用中,可能会受到以下限制:
Endian swap size restrictions 主要涉及性能、存储空间、数据类型与对齐、以及网络协议与标准等方面的限制。在设计和实现系统时,需要仔细考虑这些因素,并采取相应的措施来确保数据的正确传输和处理。
在DMA周期中更新通道控制寄存器(如CCRn,即Channel Control Register n,源地址寄存器SARn,和目标地址寄存器DARn)需要谨慎操作,因为这些寄存器的某些字段在DMA传输过程中如果被修改,可能会导致数据传输出错或数据丢失。以下是关于在DMA周期中更新这些寄存器时需要注意的关键点,特别是针对影响目标地址和源地址的更新。
在DMAC执行DMALD和DMAST指令序列之前,CCRn寄存器、SARn寄存器和DARn寄存器中的值软件程序控制DMAC在将数据从源地址传输到目标地址时执行的数据字节通道操作。这些寄存器可以在DMA周期内更新,但如果某些寄存器字段发生了变化,DMAC可能会丢弃数据。
如果使用DMAMOV
指令来更新DARn(Destination Address Register n)或CCRn(Channel Control Register n)寄存器,并且这些更新影响了目标地址的某些关键字段,那么可能会导致目标数据流的不连续性。以下是几种可能导致数据流不连续性的更新情况,以及当不连续性发生时,DMA控制器(DMAC)的行为:
dst_inc
位被更改(这通常控制目标地址在每次传输后是否递增),那么DMA传输的目标地址序列将被打乱,导致不连续性。dst_inc
设置为0时,表示目标地址是固定的,此时dst_burst_size
字段定义了在一次突发传输中传输的数据量。如果在这个模式下更改dst_burst_size
,那么DMA控制器可能无法按照预期的方式完成突发传输,导致数据不连续。当目标数据流出现不连续性时,DMA控制器(DMAC)将执行以下操作:
DMARMB
(DMA Read Memory Barrier)和DMAWMB
(DMA Write Memory Barrier)指令的效果。因此,在DMA传输期间更新影响目标地址的寄存器时,需要特别小心以避免数据不连续性的发生。如果必须更新这些寄存器,建议在DMA传输的适当阶段(如传输完成或暂停时)进行,并确保更新后的配置能够正确地支持后续的数据传输。
在DMA)传输过程中,如果使用DMAMOV
指令来更新SARn或CCRn寄存器,并且这些更新影响了源地址的某些关键字段,那么可能会导致源数据流的不连续性。以下是几种可能导致数据流不连续性的更新情况,以及当不连续性发生时,DMA控制器(DMAC)的行为:
src_inc
位被更改(这通常控制源地址在每次传输后是否递增),那么DMA传输的源地址序列将被打乱,导致不连续性。src_burst_size
字段定义了在一次突发传输中从源地址读取的数据量。如果更改这个字段,那么DMA控制器可能无法按照原始计划完成突发传输,导致源数据流的不连续性。当源数据流出现不连续性时,DMA控制器(DMAC)将执行以下操作:
DMARMB
(DMA Read Memory Barrier)指令的效果。这是为了确保所有在地址更新之前开始的数据读取都能够正常完成。因此,在DMA传输期间更新影响源地址的寄存器时,需要谨慎操作以避免数据不连续性的发生。如果必须更新这些寄存器,建议在DMA传输的适当阶段(如当前突发传输完成后)进行,并确保更新后的配置能够支持后续的数据传输。同时,需要注意检查DMA控制器的文档或手册,以了解具体硬件在处理地址更新时的行为细节。
在DMA系统中,DMA通道程序共享MFIFO数据存储资源。这意味着多个并发运行的DMA通道程序必须确保它们的资源需求不超过MFIFO配置的容量。如果超出了这个限制,DMAC可能会锁定并触发看门狗中断或异常。为了确保MFIFO资源被正确使用,DMAC实现了一个称为“加载锁”(load-lock)的机制。
加载锁要么被一个通道所拥有,要么处于空闲状态。拥有加载锁的通道可以成功执行DMALD(DMA Load)指令。如果一个通道没有拥有加载锁,那么它在执行DMALD指令时会暂停,直到它获得加载锁的所有权。
DMA通道程序的MFIFO资源使用以MFIFO条目为单位进行测量,并随着程序的进行而增加或减少。DMA通道程序的MFIFO资源需求通过静态需求和动态需求来描述,这两者都受到加载锁机制的影响。
Arm定义了静态需求为通道在执行以下任一操作之前当前正在使用的最大MFIFO条目数:
静态需求是DMA通道程序在不需要等待外部事件或程序完成时,可能同时占用的MFIFO条目的最大数量。这有助于设计者确保在并发运行多个DMA通道程序时,系统有足够的MFIFO资源来避免资源冲突和溢出。
在解释Arm定义的动态需求时,有一些细节需要澄清和修正。首先,动态需求并不是简单地定义为静态需求与通道程序执行过程中任何时间使用的最大MFIFO条目数之间的差值。实际上,动态需求更多地与程序执行过程中MFIFO资源使用的动态变化相关,但它通常不是通过直接减去静态需求来计算的。
不过,为了讨论和理解的目的,我们可以这样理解:动态需求反映了在程序执行过程中,除了静态需求之外,额外需要的MFIFO资源量。这通常取决于程序的具体逻辑和数据访问模式。
然而,Arm并没有直接给出一个关于如何计算动态需求的明确公式,因为这是一个相对复杂且依赖于具体实现的概念。但我们可以从总体上理解如何评估和管理MFIFO资源的需求。
要计算一组通道程序的总MFIFO需求,确实需要将所有通道程序的最大可能MFIFO使用量(这可以视为一个结合了静态和动态需求的综合指标)相加。这通常意味着你需要考虑每个程序在任何时候可能达到的最大MFIFO使用量,而不是仅仅基于静态需求。
为了避免DMAC锁定,你需要确保所有并发运行的通道程序的总MFIFO需求不超过DMAC的最大MFIFO深度。这个最大深度是DMAC能够支持的MFIFO条目的最大数量,以字(word)为单位,每个字通常是64位(尽管这取决于具体的硬件实现)。
虽然Arm没有直接定义如何计算动态需求,但了解MFIFO资源的总需求(包括静态和动态方面)对于确保DMAC的稳定运行至关重要。通过合理规划和优化,可以避免DMAC锁定和其他与资源使用相关的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。