嵌入式杂谈——什么是DMA?有什么用?

news2025/1/18 7:04:04

什么是DMA?——直接内存访问技术详解

在嵌入式系统和计算机体系结构中,DMA(Direct Memory Access,直接内存访问) 是一种重要的数据传输技术。它允许外设(如UART、SPI、ADC等)直接与内存进行数据交换,而无需CPU的干预。DMA技术可以显著提高系统的效率和性能,尤其是在需要高速数据传输的场景中。本文将详细解释DMA的工作原理、优势、应用场景以及如何使用DMA。

2. DMA的工作原理

2.1 DMA的基本组成

  • DMA控制器:负责管理数据传输的硬件模块。

  • 源地址:数据来源的地址(如外设的数据寄存器)。

  • 目标地址:数据存储的目标地址(如内存中的缓冲区)。

  • 传输长度:需要传输的数据量。

  • 传输模式:DMA支持多种传输模式,如单次传输、循环传输等。

2.2 DMA的工作流程

  1. 初始化

    • CPU配置DMA控制器,设置源地址、目标地址、传输长度和传输模式。

    • 启动DMA传输。

  2. 数据传输

    • DMA控制器从源地址读取数据,并将数据写入目标地址。

    • 每次传输完成后,DMA控制器更新地址指针和传输计数器。

  3. 传输完成

    • 当传输计数器归零时,DMA控制器发出传输完成信号(通常是一个中断)。

    • CPU可以处理传输完成后的任务(如数据处理或下一次传输的初始化)。

3. DMA的优势

3.1 提高系统性能

  • 减少CPU占用:CPU无需参与数据传输,可以专注于其他任务。

  • 提高数据传输速度:DMA控制器通常比CPU更快地完成数据搬运。

3.2 降低功耗

  • 由于CPU无需频繁参与数据传输,系统的功耗可以显著降低。

3.3 支持大数据量传输

  • DMA非常适合处理大数据量的传输任务,如音频、视频数据的传输。


4. DMA的应用场景

4.1 外设与内存的数据交换

  • UART通信:DMA可以用于接收和发送大量串口数据。

  • SPI/I2C通信:DMA可以加速传感器数据的读取和写入。

  • ADC采样:DMA可以将ADC的采样数据直接存储到内存中。

4.2 内存到内存的数据传输

  • DMA可以用于在内存的不同区域之间快速复制数据,如图像处理中的缓冲区拷贝。

4.3 高速数据传输

  • 音频处理:DMA可以用于音频数据的实时传输和处理。

  • 视频处理:DMA可以加速视频帧的传输和显示。


5. DMA的配置与使用(以STM32为例)

5.1 DMA的配置步骤

  1. 选择DMA通道:根据外设选择对应的DMA通道。

  2. 设置源地址和目标地址

    • 源地址:外设的数据寄存器地址。

    • 目标地址:内存中的缓冲区地址。

  3. 配置传输方向

    • 外设到内存(如UART接收)。

    • 内存到外设(如UART发送)。

    • 内存到内存(数据拷贝)。

  4. 设置传输长度:指定需要传输的数据量。

  5. 选择传输模式

    • 单次传输:传输完成后停止。

    • 循环传输:传输完成后自动重新开始。

  6. 启用DMA中断:配置传输完成中断,以便在传输完成后通知CPU。

5.2 示例代码(STM32 HAL库)

以下是一个使用DMA进行UART接收的示例代码:

// 定义接收缓冲区
uint8_t rx_buffer[100];

// 配置DMA
void DMA_UART_Config(void) {
    // 使能DMA时钟
    __HAL_RCC_DMA1_CLK_ENABLE();

    // 配置DMA
    hdma_usart_rx.Instance = DMA1_Channel5; // DMA通道
    hdma_usart_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; // 传输方向:外设到内存
    hdma_usart_rx.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址不递增
    hdma_usart_rx.Init.MemInc = DMA_MINC_ENABLE; // 内存地址递增
    hdma_usart_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐:字节
    hdma_usart_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 内存数据对齐:字节
    hdma_usart_rx.Init.Mode = DMA_NORMAL; // 传输模式:单次传输
    hdma_usart_rx.Init.Priority = DMA_PRIORITY_HIGH; // 优先级:高
    HAL_DMA_Init(&hdma_usart_rx);

    // 关联DMA到UART
    __HAL_LINKDMA(&huart1, hdmarx, hdma_usart_rx);

    // 启动DMA传输
    HAL_UART_Receive_DMA(&huart1, rx_buffer, 100);
}

// DMA传输完成中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        // 处理接收到的数据
    }
}

6. DMA的局限性

  1. 硬件资源有限

    • DMA通道的数量有限,可能无法满足所有外设的需求。

  2. 配置复杂

    • DMA的配置相对复杂,需要仔细设置源地址、目标地址、传输长度等参数。

  3. 调试难度较高

    • 由于DMA是硬件实现的,调试时可能难以追踪数据传输的过程。

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

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

相关文章

UI自动化测试:异常截图和page_source

自动化测试过程中,是否遇到过脚本执行中途出错却不知道原因的情况?测试人员面临的不仅是问题的复现,还有对错误的快速定位和分析。而异常截图与页面源码(Page Source)的结合,正是解决这一难题的利器。 在实…

OSI七层协议——分层网络协议

OSI七层协议,顾名思义,分为七层,实际上七层是不存在的,是人为的进行划分,让人更好的理解 七层协议包括,物理层(我),数据链路层(据),网络层(网),传输层(传输),会话层(会),表示层(表),应用层(用)(记忆口诀->我会用表…

浅谈计算机网络04 | 现代网络需求与技术支撑

现代网络需求与技术支撑 一、网络和因特网流量的类型剖析1.1 弹性流量的自适应特征1.2 非弹性流量的刚性特征1.3 实时流量特性 二、特定领域的网络需求解析2.1 大数据环境下的网络需求分析2.2 云计算环境下的网络需求分析2.3 移动数据环境下的网络需求分析 三、QoS和QoE&#x…

微服务架构下的负载均衡:Spring Cloud如何实现高效流量分配

在Spring Cloud中,实现服务的负载均衡,主要是为了让多个服务实例能够均匀分担请求压力,就像把一堆东西分给几个人拿,确保大家都不太累。 假设你开了一个网店,有很多顾客会同时来买东西(这就是并发请求&…

L3自动驾驶开始落地,AI交通时代离我们有多远?

2025年,自动驾驶领域迎来了一个重要的里程碑——L3级别自动驾驶技术的逐步落地。据《中国汽车报》报道,多家汽车制造商已获得L3级自动驾驶的量产资质,这意味着车辆能够在特定条件下完全接管驾驶任务,而驾驶员可以在车内进行其他活…

动手学大数据-2常见的查询优化器

目录 什么是查询优化器 查询优化器分类 Top-downOptimizer Bottom-upOptimizer RBO-关系代数 RBO-优化原则 RBO-列裁剪 RBO-谓词下推 RBO-传递闭包 RBO-RuntimeFilter 小结 CBO(Cost-basedOptimizer) 概念 CBO-统计信息 CBO-统计信息…

ctfshow复现2024ciscn第一场web

2024ciscn第一场 本章内容均在ctfshow复现 图片若显示失败请参考我的blog👇 ddl08.github.io sanic python污染 源码 from sanic import Sanic from sanic.response import text, html from sanic_session import Session import pydash # pydash5.1.2 ​ ​…

Java快速入门之数组、方法

一、数组 1、数组的概念: 数组指的是一种容器,可以用来存储同种数据类型的多个值,但是数组容器在存储数据的时候,需要结合隐式转换考虑。 例如: 定义了一个int类型的数组,那么boolean、double类型的数据是…

STM32 FreeRTOS任务通知

目录 任务通知的简介 任务通知相关API函数介绍 任务通知的简介 任务通知是 FreeRTOS 中一种用于任务间通信的机制,它允许一个任务向其他任务发送简单的通知或信号,以实现任务间的同步和协作。任务通知通常用于替代二值信号量或事件标志组,提…

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

前端实习第二个月小结

时间飞快,第一次实习已经过去两个多月,作一些简单的总结和分享。 注:文章整体会比较轻松,提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务,技术栈:前端re…

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中,阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力,确保直播间高并发时的流畅体验,降低了我们的运营成本,简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力,实现了数…

flutter的web页面

有几个服务器 有几个后台 直接通过web端进去虽然说很方便,但… 于是把web页面镶嵌到应用里面去, 这样就换了个方式打开web页面了 比如这里有有个列表 这里是写死了,活的列表可以通过io去获取 import package:flutter/material.dart; imp…

【Rust自学】13.1. 闭包 Pt.1:什么是闭包、如何使用闭包

13.1.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中,我们会讨论 Rust 的一…

安装 fairseq 失败

git clone https://github.com/pytorch/fairseq cd fairseq pip install --editable ./ 出现错误 解决方法: pip install pip24.0 参考:https://github.com/SociallyIneptWeeb/AICoverGen/issues/133 gcc 和 g 需要 9.0以上,怎么安装可以…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境,但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢,因为容器和宿主机共享网络了,宿主机…

AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发

AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发,指的是首先进行数据分析,比如统计学分析、机器学习模型的构建等,然后将分析的流程开发成数据分析类的工具,或者将数据分…

Web 浏览器轻松访问和管理 SSH 与 Telnet 服务

前几天也分享了一篇类似的文章,但是有朋友反馈不太安全,如果有个输入密码后访问最好,然后我就找了一下发现了这个更加优秀的项目, sshwifty是一个开源项目,它允许用户通过浏览器进行 SSH 和 Telnet 操作。这个项目提供…

Python制作简易PDF查看工具PDFViewerV1.0

PDFViewer PDF浏览工具,Python自制PDF查看工具,可实现基本翻页浏览功能,其它功能在进一步开发完善当中,如果有想一起开发的朋友,可以留言。本软件完全免费,自由使用。 软件界面简洁,有菜单栏、…

Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与…