十行代码,就能真正让你理解DMA(CPU的秘书)

news2024/9/25 23:15:55

下面的代码是单片机串口发送数据的程序.

char a=0xAA;//定义变量a,值为0xAA;
TXREG = a;//把数据由内存转移到串口外设;

那我们定义的变量a的值存储在哪里了呢?可以看下单片机的逻辑框图。
在这里插入图片描述
变量其实都是存在一个叫SRAM的存储器中,它是单片机的内存。存储变量的这个步骤,是由单片机的内核通过总线来操作完成。
第二行代码:它是把内存里的数据发送到串口的数据寄存器当中。当串口的数据寄存器接收到数据之后,它就会由串口外设自动的把数据发送出去,它也是需要由内核操作的。
在这里插入图片描述
但如果是发送一个字节的数据,一瞬间就能完成;如果是发送1万个0xAA,大约需要10s,对于单片机而言,将导致CPU极其宝贵的资源全都消耗再在数据转移上。
为了解决转移数据占用CPU资源这个痛点,工程师们设计了一种叫DMA的模块(Direct Memory Acess 直接内存访问),它的主要作用就是转移数据,比如由内存向串口外设转移数据,或者外设向内存转移数据,且不需要内核的参与,这样内核就可以腾出手来操作其它的事情,比如控制I/O口或者响应中断(如下图)。(即CPU负责和内存交互,而DMA负责内存向低速设备的复制)
在这里插入图片描述
以下面的常规程序而言,它需要先发送一万个串口数据,发送数据就得需要10s,然后才可以让LED闪烁。发送串口数据和LED灯闪烁没有办法同时进行。

for (i=0;i<10000;i++)
	{
		TXREG = 0xAA;//让串口发送0xAA;
	}
		LED  = 1;  //点亮LED;
		Delay(5); //延时5s
		LED = 0;
		Delay(5); //延时5s

但如果我们应用DMA后,它就能一边发送串口数据,一边让LED灯闪烁。

      //串口发送                                             //LED闪烁
for (i=0;i<10000;i++)                                  LED  = 1;  //点亮LED;    
	{                                                  Delay(5); //延时5s
		TXREG = 0xAA;//让串口发送0xAA;                  LED = 0;
	}                                                  Delay(5); //延时5s		

那DMA是如何实现这个效果的呢?可以看下采用了DMA之后的程序

for(i=0;i<10000;i++)
 {
 	SendData[i] = 0xAA;  
 }
 DMA_PeriAddr = 0xFFFF; //设置DMA要传输的目标寄存器的地址,此例程为SRAM数据转移到串口外设,例程中串口外设数据寄存器的地址为0xFFFF;
 DMA_SramAddr = 0x0000;//设置SRAM内存源地址,也就是我们要转移的第一个数据的内存地址
 DMA_Direction = DMA-Peri;//指明数据转移的方向,及从DMA到串口外设
 DMA_DataSize = 10000;//设置传输数据的大小
 DMA_Sram+ = ON;//设置内存地址自增,如果为OFF,则会一直发送第一个数据
 DMA_Peri+ = OFF;//让串口外设地址不增;因为这些数据都是转移到串口,所以这些数据都发往同一个地址
 LED_shanruo(10);

上述程序中数组里的数据就是我们要发送的串口数据,并被存储在SRAM里,而且它们被存储的地址是连续的(如下图)
在这里插入图片描述
该程序在最开始阶段先配置好DMA初始化程序,然后就开始通过DMA发送数据,只有配置DMA时需要内核参与,配置完之后就不需要内核再参与了。这时候,DMA负责数据转移的操作,与此同时,内核就可以腾出手来控制LED闪烁。

在这里插入图片描述
除了串口发送数据,还有很多数据转移的应用。比如串口接收数据,它是把串口外设里面的数据转移到内存;以及ADC模数转换,它是把ADC寄存器里面的数据转移到内存里面。
在这里插入图片描述

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

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

相关文章

Playwright 和 Selenium 的区别是什么?

前言 最近有不少同学问到 Playwright 和 Selenium 的区别是什么&#xff1f;有同学可能之前学过 selenium 了&#xff0c;再学一个 playwright 感觉有些多余&#xff0c;可能之前有项目已经是 selenium 写的了&#xff0c;换成 playwright 需要时间成本&#xff0c;并且可能有…

【支付系统】核心支付流程

支付在产品中常见的用处为购买和充值.这两种功能操作大相径庭,其中购买相对充值多了很多步骤,它需要锁商品或者库存,还需要超时未支付取消订单等操作.在这篇文章中主要探讨支付部分,属于购买和充值公共部分. 下面是绘制的简易支付时序图 以上时序图并非完整,其实核心步骤就是, …

商城购买会员打折满减优惠券商品

文章目录 前言一、代码结构二、UML图三、代码实现3.1.domain3.2.enums3.3.strategy3.4.service3.5.config 四、单元测试五、模式应用六、问题及优化思路6.1.问题6.2.优化 总结 前言 使用策略模式、工厂方法模式、单例模式实现一些购买策略&#xff0c;需求&#xff1a;商城商品…

服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】

完整源码资料 地址直达&#xff1a;http://t.csdn.cn/RWsGw 前言 这是大二时候写的第一个Java项目&#xff0c;框架基本上都没有用到、而且用到的技术很老很老。只简单使用了一个Mybatis简化数据库的操作。前端框架用的还是Layui&#xff0c;贼难用。闲的无聊&#xff0c;对这…

缺少成本票怎么解决?首选自然人代开,方便又快捷!

《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 成本票缺失导致的严重结果就是&#xff0c;缺少成本入账&#xff0c;导致利润虚高&#xff0c;企业所得税变高了&#xff0c;那么现有的解决方式很多&#xff0c;只是一些方法过…

图形学实验(完整文件见上传)

CRect rect; this->GetClientRect(rect); pDC->Ellipse(rect); // DDALineView.cpp : implementation of the CDDALineView class // #include “stdafx.h” #include “DDALine.h” #include “DDALineDoc.h” #include “DDALineView.h” #ifdef _DEBUG #define new…

Qt扫盲-QEvent 理论总结

QEvent 理论总结 一、概述二、事件类型1. Qt 已定义类型2. 开放用户定义类型 三、注册事件 一、概述 Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生窗口系统事件&#xff0c;将它们转换为QEvents&#xff0c;并将转换后的事件发送给QObjects。 一般来说&…

Multimodal fusion via cortical network inspired losses(第一次优质论文分享)

Multimodal fusion via cortical network inspired losses 论文介绍1. 论文研究的任务是什么&#xff1f;2. 论文关注/拟解决的问题是什么&#xff1f;3. 论文提出什么方法如何解决这个问题&#xff1f;4. 如何设计实验 来证明 所提方法确实解决了 拟解决的问题&#xff1f; 论…

Ada Tutorial(2)SPARK Examiner + SPARK Prover

文章目录 代码 Task1.adb代码 task3.adbtask4.adb 在Ada和SPARK中&#xff0c;SPARK_Mode是一个编译指示&#xff0c;它表示随后的代码将使用SPARK语言规则进行编译和分析。 在with SPARK_Mode > On的影响下&#xff0c;编译器会在编译过程中应用SPARK语言规则&#xff0c;它…

基于“声音”的量子计算机 | Science速递

光子盒研究院 现在&#xff0c;一个基于声音的量子计算机关键构件已被首次被证明是有效的。 构建量子计算机的一种流行方式是将信息编码到光粒子的量子状态中&#xff0c;然后将它们送过镜子和透镜等“迷宫”般的设备阵列来操纵这些信息。量子力学定律指出&#xff0c;量子粒子…

关于B/S结构系统的会话session机制

用户打开浏览器&#xff0c;进行一系列操作&#xff0c;然后最终将浏览器关闭&#xff0c;这整个过程叫做一次会话&#xff0c;会话对象叫session 用户在浏览器上点击了一次超链接或按钮等&#xff0c;称为一次请求&#xff0c;java对象是request session机制属于B/S结构的一部…

项目 引入 uView

只分享干货&#xff01; 第一点&#xff1a; npm install uview-ui//或yarn add uview-ui 第二点 import Vue from vue; import uView from uview-ui;Vue.use(uView);//或// main.js import uView from /node_modules/uview-ui Vue.use(uView) 第三点 import /node_module…

RK3568开发板 buildroot配置文件

在上一期技术分享中我们学会了如何在buildroot里选中我们自己想要的软件&#xff0c;如vsftpd、openssh等&#xff0c;那么有些客户可能会有疑问&#xff0c;安装完软件后需要配置相应的环境&#xff0c;应该怎么样默认的配置在系统中呢&#xff1f;其实这里的话已经为大家考虑…

python kafka 指定消费者名字

#!/usr/bin/env python # codingutf-8 """ kafka的消费者不是线程安全的&#xff0c;不能多线程启用 kafka不像其他的MQ&#xff0c;消费完数据&#xff0c;直接丢掉&#xff0c;而是会默认存储7天&#xff0c;存储7天后自动清除&#xff0c;故而可以从…

AI虚拟数字人在医学领域的四大应用场景

AI虚拟数字人技术是一种基于计算机图形学和人工智能技术的新型应用&#xff0c;可以模拟人类的外貌、语言、行为等特征&#xff0c;实现与人类的交互。在医疗领域中&#xff0c;AI虚拟数字人技术也有着广泛的应用前景。以下是几个可能的应用场景&#xff1a; 1.医学教育 AI虚拟…

java poi生成excel折线图、柱状图、饼图、动态列表

实现效果 测试类 public class ChartTest {// 开始行public static int chartRowStart 3;// 结束行public static int chartRowEnd 20;public static ChartPosition chartPosition;public static void main(String[] args) throws IOException {// 填充数据XSSFWorkbook work…

30个Python代码,10分钟get常用技巧!

关注“Python专栏”&#xff0c;搜索暗号【面试大全】立即领取面试题简历模板。 学 Python 怎样才最快&#xff0c;当然是实战各种小项目&#xff0c;只有自己去想与写&#xff0c;才记得住规则。本文是 30 个极简任务&#xff0c;初学者可以尝试着自己实现&#xff1b;本文同样…

DVWA-XSS (Stored)

跨站点脚本 &#xff08;XSS&#xff09;”攻击是一种注入问题&#xff0c;其中恶意脚本被注入到原本良性和受信任的网站上。 当攻击者使用 Web 应用程序发送恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;时&#xff0c;就会发生 XSS 攻击&#xff0c; 给其他最终…

腾讯云数据库mysql报错sql_mode=only_full_group_by的解决方法

原因:mysql5.6和5.7兼容问题 解决方法: sql_mode“ONLY_FULL_GROUP_BY” 把这个去掉

如何优雅的自动修改node_modules 中的依赖包内容?

使用 patch-package 自动修改 项目中node_modules中内容 背景简介&#xff1a;我们在使用第三方依赖包时如果遇到了 bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个 issue 或者 PR&#xff0c;然后等待作者的…