关于DMA的笔记

news2025/2/22 17:53:15

DMA(Direct Memory Access, 直接储存器访问),是部分总线架构提供的功能,DMA传输功能能将数据从一个地址空间复制到另一个地址空间,实现从附加设备/外设与储存器或储存器与储存器之间的高速传输。

我们结合案例解释DMA的功能:在我们的设备中,CPU是运算和控制和核心,有强大的运算、储/转存数据、控制程序转移等功能。CPU在运行过程中需要处理大量的任务,在这些任务的优先级中,不同的任务有着不同的优先级,有的重要的任务需要调用CPU“亲自”参与,有的则不一定需要调用CPU的计算,比如数据的复制和储存(尤其是大量数据的复制存储,比如将数据从外设A转存到外设B),那我们在分配任务的时候会让CPU去执行更重要的任务,让DMA去执行原来由CPU执行的数据复制、转存,来提高系统的运行效率。

总结下来,DMA就是接管CPU过负责的数据复制储存的任务,减少CPU的低效率消耗,来提高系统的整体效率。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。

DMA可以实现外设(W)到内存(N)、W2W、N2N、N2W的数据存储。而DMA传输的4个关键数据是:1、数据源地址;2、数据传输的目标地址;3、数据量大小;4、数据传输的模式。
当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

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

DMA的主要特征:

1、在同一个DMA模块上,可以通过软件编程设置多个请求间的优先权(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(优先级数字越小优先级越高,请求0优先于请求1,依此类推);

2、DMA使内存既可被CPU访问,也可被快速外设直接访问。闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;

3、需要在内存中开辟一个专用的缓冲区,以及时提供和接收数据。在DMA数据传送开始前和结束后,CPU以中断方式对其进行预处理和后处理;

4、支持循环的缓冲器管理;

5、可编程的数据传输数目:最大为65535;

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

对于大容量的STM32芯片有2个DMA控制器 两个DMA控制器,DMA1有7个通道,DMA2有5个通道。

开始DMA时,以内存—串口为例。首先串口向CPU发送请求,告诉DMA,把数据从内存搬到发送数据寄存器中。这个请求由其中的一方来产生(发送方),通道为传输数据的管道。

关于数据对齐的问题:在DMA传输中,通常要求发送方和接收方的数据长度要一致(数据对齐),但有些时候我们又会使用到不一致的情况(比如8位数据发送到定时器16位CCR寄存器),此时对于DMA对齐的数据,直接操作没有问题。而当DMA数据不对齐,比如8位传到16位时,如 DMA读到的8位数据为B0,实际写入的会是00B0,高8位用0补齐。当16位转8位数据时,如DMA读到B1B0,在写入时会把高8位丢弃,只写入B0位。这跟C语言的强制类型转换一致,会对数据进行扩写和裁剪。

通过之前的对于定时器通道重映射的了解,我们知道,对于某个单一定时器的某一通道,它在同一时间只能重映射到一个外设上,不能同时调用多个外设。对于DMA也是一样的,当有多个DMA请求一起来,就需要仲裁器来仲裁,到底哪个DMA请求先执行。

 在软件编译阶段,使用者会编写设备的优先级,其中共有如上图中的4个优先级。在程序运行中,DMA仲裁器先会比较软件上的优先级,决定执行顺序。如果有多个程序处于相同的优先级,则通过编号进行执行顺序的排序,一般数字编号偏小的通道拥有更高的优先级。其中需要注意的是,在大多数产品中DMA1的优先级往往比DMA2拥有更高的优先级。

接下来展示DMA1/2的部分优先级框图。

DMA1的通道图:

 DMA1的优先级框图:

DMA2的通道图:

  DMA2的优先级框图:

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

DMA1不支持内存到内存,但支持内存到外设,外设到内存,DMA2支持内存到内存,也支持外设到内存,内存到外设。每个通道都相当于一个IO口,每个通道都有一段代码在里面,这个代码实现是不一样的,DMA1的通道就不支持内存到内存的工作模式,而DMA2的通道代码是支持内存到内存的,同时它是接在总线矩阵上的(BUS Matrix)。

对于总线矩阵:DMA的工作是比较单一的,它每次访问总线都需要仲裁器来申请总线控制权,如果从内存到外设,首先先申请内存的总线控制权,然后在拿到数据在申请外围设备的总线控制权,这里切换就很耗时,所以推出了BUS Matrix,由DMA仲裁先获取外围的控制权,然后通过交联矩阵总线去取SRAM的数据,取到以后在发给外围,这样就不需要仲裁切换,运行较快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTPS 加密协议

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录HTTPS"加密" 是什么HTTPS 的工作过程引入证书HTTPS http 安全层 (SSL) SSL 用来加密的协议,也叫 TLS …

类型转换——C++

1. C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化, C语言中总共有两种形式的类型转换:隐式类型转换…

刘二大人《Pytorch深度学习实践》第十讲卷积神经网络(基础篇)

文章目录卷积神经网络基础卷积层池化层课上代码GPU版本代码卷积神经网络基础 全连接的网络将图片的的本身二维空间结构进行了破坏,而这些空间结构是有用的,因此,要定义新的操作图像的计算节点,因此引入了卷积神经网络,…

JavaWeb开发 —— 请求响应

目录 一、概述 二、请求 1. postman工具 2. 简单参数 3. 实体参数 4. 数组集合参数 5. 日期参数 6. JSON参数 7. 路径参数 三、响应 1. ResponseBody 2. 统一响应结果 3. 案例 一、概述 通过之前对 JavaWeb开发 —— Web入门 的学习,我们开发…

失眠一月码出527页文档,详解SpringCloud微服务和分布式系统实践

所谓的分布式系统,就是一组计算机为了共同完成业务功能通过网络协作的多节点系统。分布式系统本身也有一系列需要解决的问题,包括多个计算机节点的路由选择、各个服务实例的管理、节点监控、节点之间的协作和数据一致性等,当然还有网络故障、…

lamp 架构的搭建

php 解释动态页面 php来连接数据库 mysql 页面信息和端口信息 存放数据 apache 前端web服务器,展现页面 源码编译安装这三个服务 配置下载apache: systemctl stop firewalld 关闭安全机制,防火墙 可以一条命令:systemctl is-enabled firewalld 和 s…

【推荐系统】model 落地(样本/特征/预测服务)

兜率宫小道童的个人空间-兜率宫小道童个人主页-哔哩哔哩视频(如下是该视频课系列的笔记) 1-深度学习在搜索、广告、推荐系统中的应用-业务问题建模_哔哩哔哩_bilibili 其他章节 目录 二、深度学习落地 模型训练服务流程 1-样本生成-标签拼接 1-样本…

OJ练习第73题——解数独

解数独 力扣链接:37. 解数独 题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一…

MySQL-中间件mycat(二)

目录 🍁部署主从复制 🍁mycat读写分离 🍂修改配置文件 🍂设置balance与writeType 🍂设置switchType与slaveThreshold 🍂启动程序 🍂验证读写分离 🍁垂直拆分-分库 🍂实现…

【从零开始学Skynet】基础篇(九):调试控制台服务

Skynet自带了一个调试控制台服务debug_console,启动它之后,可以查看节点的内部状态。 1、启用调试控制台 (1)在skynet/examples目录下新建main_console.lua文件,代码如下所示: local skynet require &quo…

【Python_Scrapy学习笔记(二)】创建Scrapy爬虫项目

创建Scrapy爬虫项目 前言 本文主要介绍如何创建并运行 Scrapy 爬虫项目。 正文 1、创建 Scrapy 框架 Scrapy 框架提供了 scrapy 命令用来建立 Scrapy 工程,在终端 terminal 中输入以下命令: scrapy startproject 自定义的项目名称创建好爬虫项目文件…

2023年超实用的27个VSCode插件推荐

Visual Studio Code,或者称作VS Code,是一个广为人知且评价很高的代码编辑器,它有许多特性和扩展功能,以增强开发体验。使用VS Code的主要好处之一是它的灵活性,允许开发人员根据自己的特定需求进行自定义。此外&#…

02-app漏洞发现

漏洞发现-APP应用之漏洞探针类型利用修复 一、思维导图: 思路说明: apk反编译提取URL或抓包获取url,进行web应用测试,如不存在或走其他协议的情况下,需采用网络接口抓包进行数据获取,转至其他协议安全测试…

【jvm系列-05】精通运行时数据区共享区域---方法区

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

Redis 6.0的多线程是如何工作的

来了解下 6.0 版本中新出的多线程特性。 1、多线程处理网络IO,单线程执行命令 Redis 一直被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF 重写),但是&…

freeswitch带媒体压力测试方案

概述 原本的计划是使用sipp完成带媒体压力测试,但是实际测试过程中发现sipp的媒体处理功能有问题(也有可能是我使用的姿势不对)。 sipp在带媒体的情况下(600路并发开始),出现大量的不响应和响应延迟&…

请求响应-响应

前面已经说了我们重点关注的就是XXXcontroller类 进行请求接收 和响应 接收参数那些我们在请求部分讲过了 现在我们来处理响应部分 响应 设置响应数据 可以发现其实我们之前都是设置过的 比如那个Hello World 浏览器都接收到了且在浏览器上进行了输出 这里的是返回值作为这个…

Direct3D 12——纹理——纹理

纹理不同于缓冲区资源,因为缓冲区资源仅存储数据数组,而纹理却可以具有多个mipmap层级(后 文有介绍),GPU会基于这个层级进行相应的特殊操作,例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式…

7 个最好的 Word 转 PDF 转换器

如果您使用 Word 文件,您可能在某个时候遇到过将 Word 文件转换为 PDF 的紧迫问题。PDF 文件有很多优点。它们通常更紧凑,无论您在哪里打开它们看起来都一样。PDF 还允许您共享文档,而不必冒有人更改内容的风险。那么如何将 Word 文档转换为 …

小白学网络安全要学些什么?

一.网络安全学些什么呢? 虽然网上已经有非常多的学习路线了,但是仍然有很多零基础的小白还是不懂网络安全到底应该要怎么去学习,我也经常会在后台收到这样的问题“我想学网络安全,需要先学编程语言吗?”、“学渗透就业…