DMA简单总结

news/2024/11/23 3:46:50/

文章目录

    • 一、基础概念
      • 1.1 DMA---Direct Memory Access 直接存储器访问,目的减少CPU资源占用
    • 二、典型DMA硬件模型
      • 2.1 基本硬件特性---通道数、源/目标类型,地址与累加方式,数据位宽,搬移长度,循环模式,中断
      • 2.2 提升硬件利用率的链表模式(部分芯片支持)
    • 三、典型DMA软件驱动方案
      • 内存+DMA搬移(待补充)
      • CRC+DMA模式(待补充)
      • 串口+DMA模式(待补充)
      • I2C+DMA模式(待补充)
      • DMA软件方案总结(待补充)
    • 四、DMA注意事项(待补充)
      • DMA与Cache一致性(待补充)

一、基础概念

1.1 DMA—Direct Memory Access 直接存储器访问,目的减少CPU资源占用

DMA是用于在外设与存储器之间以及存储器与存储器之间提供高速数据传 输。可以在无需任何CPU操作的情况下通过DMA快速移动数据。目的是节省的 CPU 资源,可供其它操作使用。CPU资源用于重复性的内存搬移 或者 从低速外设接口查询获取非连续数据 利用率是不高的。
举例某块STM32的DMA数据链路:
在这里插入图片描述

二、典型DMA硬件模型

2.1 基本硬件特性—通道数、源/目标类型,地址与累加方式,数据位宽,搬移长度,循环模式,中断

我们拿到模块带DMA控制器的芯片如SOC之后,通常需要DMA硬件模型特性如下:
1、有几个DMA通道:决定了可以同时传输数据的数量。如A通道搬移串口数据同时,B通道搬移内存数据;
2、源/目标支持类型:不同通道支持的源类型和目标类型是有差异的,典型外设有SPI、UART、I2C、ADC、CRC、等,因此要做好规划,举例某款STM32芯片DMA类型支持如下:
在这里插入图片描述
3、地址与累加方式:源和目标在设置地址的同时,也需要设置地址指针偏移方式,比如内存搬移时 就需要递增,而一些外设比如Uart、CRC控制器等在访问时都是访问的逻辑FIFO寄存器地址,往往不会变化一直都是同一个地址。

4、访问数据宽度:通常由于不同外设有数据长度访问限制,DMA需要支持独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA 自动 封装/解封必要的传输数据来优化带宽。
5、搬移长度:启动搬移后搬移数据长度,举例如 支持1~65536字节设置,根据实际需求进行设置,如果长度超过最大长度,就需要软件多次配置启动搬移;
6、循环模式:当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。
7、中断支持:DMA搬移完之后,经常需要通过中断上报事件给CPU,通知做后续行为,DMA控制器通常都支持中断上报(如 传输完成中断、半传输中断、传输错误等)。当然不用中断也可以通过状态寄存器访问硬件当前搬移地址状态和是否搬移完成的判断;

2.2 提升硬件利用率的链表模式(部分芯片支持)

由于DMA单次搬移有长度限制举例64KByte,如果要搬移1MByte的数据,通常是下面两种方式:
1)非中断的循环查询迭代策略: 先配置第一个64K搬移,然后在轮询调度中不停的查看DMA是否搬移完成,如果搬移完成就配置下一个64K并使能搬移,如此反复。逻辑利用率是最低的,当逻辑搬移完成 要等到下一次 轮询查看到空闲,才开始配置下一次。
2)完成中断迭代策略 相比循环查询方式,这种方式利用每个64K的搬移完成 DMA中断事件,配置启动下一块搬移。逻辑利用率有提高(中断更及时),但是仍然不是100%,从中断唤醒到下次配置之间逻辑仍然是空闲的。

有没有能让硬件DMA利用率到100%的方式呢?部分芯片支持链表模式可以做到。思路如下:
3)、链表模式:此种模式下硬件生效的不是直接寄存器配置,而是一个链表首地址,这个地址指向的内存里面一个固定大小的区域,可以看做一个DMA节点,节点区域包含了 当次搬移 包含的 起始地址、结束地址、搬移长度、数据位宽、是否屏蔽中断等 以及 下一个节点地址(如果配置0就没有下一个节点)。这样就可以把比如1M地址范围,拆分为一个一个节点串成链表,把最后一个节点完成中断打开,前面节点无需使能中断。当逻辑工作起来后,每完成一个节点后自动查找载入下一个节点,到最后一个完成时上报完成中断。
在这里插入图片描述

三、典型DMA软件驱动方案

了解完硬件模型,再看一下软件抽象的方案。DMA本身通常不会被业务模块直接访问,作为小系统能力的一部分。单纯的DMA驱动模块,调用者往往 是 内存模块(提供非CPU的内存搬移),串口模块(提供DMA模式传递数据)、CRC模块(提供非CPU的CRC计算)。因此如果是业务模块开发者通常接触较少;

内存+DMA搬移(待补充)

CRC+DMA模式(待补充)

串口+DMA模式(待补充)

I2C+DMA模式(待补充)

DMA软件方案总结(待补充)

四、DMA注意事项(待补充)

DMA与Cache一致性(待补充)


http://www.ppmy.cn/news/1114361.html

相关文章

工商银行潍坊分行党建RPA机器人项目解析

01 案例背景:银行业掀起引入RPA加速实现数字化转型的浪潮 近年来,金融科技的蓬勃发展极大促进了银行的业务创新,新技术、新业态层出不穷。随着银行业务和科技的融合逐步落实,银行业务正朝着线上化、智能化转变。科技赋能的转型范…

CentOS LVM缩容与扩容步骤

为VM打快照;备份home数据;# yum install xfsdump -y [root@testCentos7 home]# xfsdump -f /dev/home.dump /home xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control ===================…

Golang开发--计时器(Timer)和定时器(Ticker)

计时器(Timer) 在 Go 中,可以使用 time 包提供的计时器(Timer)来执行定时任务。计时器允许你在指定的时间间隔后执行某个操作。 time.Timer结构表示一个计时器,它会在指定的时间段后触发单次操作。 创建计…

【PyTorch 攻略 (4/7)】张量和梯度函数

一、说明 W在训练神经网络时,最常用的算法是反向传播。在该算法中,参数(模型权重)根据损失函数相对于给定参数的梯度进行调整。损失函数计算神经网络产生的预期输出和实际输出之间的差异。 目标是获得尽可能接近零的损失函…

Python-利用小波变换预测股票

一、简介 股票上涨和下跌,创造出像海浪一样难以预测的模式和走势。然而,就像科学家通过了解下面的水流来预测波浪的运动一样,我们也可以使用类似的工具破译股票市场的一些模式。 通过利用小波变换的力量,我们深入表面,…

大事件项目 api_server

Headline 大事件后台 API 项目, API 接口文档请参考 https://www.showdoc.cc/escook?page_id3707158761 215217 1. 初始化 1.1 创建项目 1. 新建 api_server 文件夹作为项目根目录,并在项目根目录中运行如下的命令,初始化包管理配置…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友,请查看 CocosCreator3.8研究笔记(十七)CocosCreator UI组件(一)。 今天我们主要介绍CocosCreator 常用容器组件:Layout …

【LeetCode每日一题合集】2023.9.11-2023.9.17(⭐反悔贪心拓扑排序Floyd)

文章目录 630. 课程表 III解法——反悔贪心⭐⭐⭐⭐⭐ 1462. 课程表 IV⭐解法1——拓扑排序预处理解法2——Floyd算法判断是否存在路径 2596. 检查骑士巡视方案(方向模拟)1222. 可以攻击国王的皇后(方向模拟)LCP 50. 宝石补给&…