DMA基本工作原理总结概述(一)——DMA系统架构

本文详细探讨了DMA的工作原理,包括其FIFO与直接模式,单次与突发传输,以及寻址模式。讲解了基于ARM Cortex M3的SOCDMA系统架构,涉及两个DMA的分工与作用,以及DMA与CPU在总线竞争和优先级管理上的机制。还讨论了DMA数据配置和应用区别,以及为何使用两个DMA。最后,总结了DMA的关键技术元素和设计考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. DMA的工作原理:

DMA是一种内存访问技术;
可以独立于CPU, 直接读、写系统存储器、外设等
在这里插入图片描述

二. 工作、传输模式:

1. 工作模式:FIFO模式与直接模式

FIFO模式下,可以将要传输的多个数据(或字节)累计存储在FIFO缓冲器中,然后在FIFO缓冲器中设置存储阈值,当到达阈值时,FIFO会自动把所有存储的数据一次性的发送到目标地址;

直接模式下,DMA直接进行数据从源地址到目的地址的传输,对于外设的传输,因为外设内部一般也有FIFO,所以传输的数据可以被直接存储在外设的FIFO中。

2. 传输模式:单次传输与突发传输

单次传输模式下,一次操作(软件)只能传输一次(一次可以理解为一个节拍,如一个字节)

突发传输模式下,一次操作可以传输多次,如4次,8次,16次

三. 寻址模式:

a. 增量寻址:发送完数据后,继续发送下一个地址的数据,配合突出传输模式

b. 非增量寻址:发送完数据后,如果想要继续发送数据,需要更具软件配置的发送下一个数据的地址,再进行数据的传输。

四. DMA的双面性特点:

对于CPU,DMA是外设

对于外设,DMA是控制器

五. 使用DMA的原因:

a. 把比较固定的任务让DMA来做,可以减轻CPU负担,提高系统的效率

b. DMA具有一般CPU没有的高效操作,提高系统的吞吐率

六. 基于ARM Cortex M3的SOC DMA系统架构

系统有两个DMA;

每个DMA有两个端口,作为Master,对外设,Mem控制。同时作为Slave,CPU可以通过BUS对DMA控制,

其中一个DMA 2,有两个端口均连接至BUS MATRIX上,DMA1 仅有一个端口连接至BUS MATRIX;

对于两个DMA,均可以连接至AHB-APB Bridge

DMA0,端口并没有连接至AHB/APB上,而且由BUS Matrix 连接至存储器中,并且有一路端口专用于AHB-APB 2上。

七. 思考的问题

a. DMA与CPU如何竞争总线?

	i. 两路DMA, CPU军师总线矩阵的master,
	ii. DMA与CPU同时访问一个slave时,BUS Matrix会仲裁器对请求进行仲裁,决定优先级访问顺序。
	iii. DMA与CPU同时访问不同slave时,可以同时工作

b. 为什么使用2个DMA,分别起什么作用?

	i. 对于一个DMA来说,通道数是有限的;
	ii. 两路DMA,可以连接更多的外设DMA请求源
	iii. 两路DMA,在内存,外设的访问空间上做了一定的区分,可以同时工作,提高了系统效率(分别服务不同的外设)

c. 同样是DMA,DMA1与DMA2的应用的区别?

	i. DMA2的master端口可以访问总线矩阵中所有的slave(存储器、AHB1、AHB2、APB1、APB2)
	ii. DMA1的端口1只连接了存储器属性的slave,端口2直接连接了APB1上
	iii. DMA2可以实现存储器、AHB1、AHB2、APB1、APB2之间数据的相互传输
	iv. DMA1只能实现存储器、APB1之间的相互传输(不经过总线的仲裁,大大提高了访问速度、减轻总线矩阵的负担)

d. DMA1为什么只有一个master连接至BUS矩阵中?

	i. 同一个DMA会有多个master接口,master的功能不同,所映射的地址范围不同
	ii. master接口绕开总线矩阵的仲裁,而直接连接到外设的AHB2APB桥,加快对外设的访问速度
	iii. 减少连接到总线矩阵的master接口数量,降低矩阵的复杂度,有利于提高系统效率

八. 一般结构:

a. DMA请求

i. 如果外设想要通过DMA出书数据,必须先向DMA控制器发送DMA请求,DMA收到请求后,由控制器给CPU请求信号,要求占用总线,收到占用总线的授权后,DMA向外设发送应答信号,当外设应答后,DMA收到应答信号后,就会启动DMA传输,指导传输完毕。

ii. DMA有DMA1和DMA2两个控制器,DMA1有两个控制器,DMA1有7个通道,DMA2有5个通道

iii. 不同DMA控制器的通道有不同的外设请求

b. 通道

i. DMA可以有多个通道,例如在上面的架构中,总共有7+5 = 12个通道。

ii. 每个通道对应不同外设的DMA请求,虽然每个通道可以接收多个外设请求,但是同一时间只能接收一个,不能同时接收多个请求

c. 仲裁器

i. 当有多个DMA请求时,则需要仲裁器进行优先级管理。

ii. 仲裁器管理DMA请求分为2个阶段:
1) 第一个阶段由软件完成:可以在寄存器中设计优先级的等级(根据硬件的设计)
2) 第二个阶段由硬件完成:如果两个以上的DMA通道的请求设置的优先级一样,则优先级取决于通道编号

iii. 仲裁器优先级
1) 固定优先级顺序:优先级在架构中就已经确定好了,或者,由软件配置
2) 轮转算法优先级:优先级不断轮转
3) 随机算法优先级:使用随机数

九. DMA数据配置——传输方向

a. 从外设到存储器

b. 存储器到外设

c.存储器到存储器

### 操作系统中的DMA工作原理及实现 #### DMA基本概念 DMA(Direct Memory Access,直接内存访问)是种高效的数据传输机制,在操作系统中被广泛应用于提高数据交换的速度和效率。它允许外部设备绕过CPU直接与系统内存交互[^3]。 #### 二、DMA的工作流程 DMA的操作可以分为三个主要阶段: 1. **配置阶段** 在此阶段,DMA控制器会初始化必要的参数,例如源地址、目标地址以及要传输的数据长度。这些设置通常由驱动程序完成,并通过特定寄存器写入到DMA控制器中[^1]。 2. **数据传输阶段** 当切准备就绪后,DMA控制器接管总线控制权,负责将数据从外设读取至内存或者反之。在此过程中,CPU几乎不参与任何实际操作,从而释放其资源用于其他任务执行。 3. **中断通知阶段** 完成预定数量的数据块转移之后,DMA模块向处理器发送个中断信号以报告状态更新情况。这种行为可以通过启用相应的中断标志位来触发[^2]。 #### 三、DMA在操作系统层面的具体应用 为了更好地管理硬件级别的DMA活动,现代操作系统提供了抽象层面上的支持服务。以下是几个典型场景及其对应的解决方案概述: - **驱动开发接口设计** 设备驱动编写者需遵循平台定义的标准API规范去调用底层设施所提供的功能集。比如Linux Kernel内部实现了丰富的子系统框架供开发者利用构建定制化逻辑链路。 - **多核环境下的同步协调策略** 对于支持SMP(Symmetric Multiprocessing)架构的产品而言,如何保障跨NUMA节点间资源共享的致性成为大挑战。因此引入诸如 barriers 或 memory fences 这样的工具箱帮助维护全局视角下正确的顺序关系。 - **错误恢复机制建设** 考虑到可能出现的各种异常状况(如电源掉电、网络断连等),有必要预先规划好应急措施以便快速恢复正常运转秩序。这可能涉及到定期轮询健康指标或是监听特殊事件的发生时刻点等等。 ```c // 示例代码展示如何启动次简单的DMA事务 void start_dma_transfer(uintptr_t src_addr, uintptr_t dst_addr, size_t length){ dma_set_source_address(src_addr); // 设置源地址 dma_set_destination_address(dst_addr); // 设置目的地址 dma_configure_length(length); // 配置传输长度 dma_enable_interrupt(); // 启动中断请求 dma_start(); // 开始DMA传输 } ``` #### 四、总结说明 综上所述,借助于精心设计好的软件栈配合高效的硬件单元共同作用之下,才能真正意义上发挥出DMA技术的优势所在——极大程度减少延迟时间的同时提升吞吐量表现水平^[]^。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆渡沧桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值