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

这篇具有很好参考价值的文章主要介绍了十行代码,就能真正让你理解DMA(CPU的秘书)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

十行代码,就能真正让你理解DMA(CPU的秘书)
除了串口发送数据,还有很多数据转移的应用。比如串口接收数据,它是把串口外设里面的数据转移到内存;以及ADC模数转换,它是把ADC寄存器里面的数据转移到内存里面。
十行代码,就能真正让你理解DMA(CPU的秘书)文章来源地址https://www.toymoban.com/news/detail-480974.html

到了这里,关于十行代码,就能真正让你理解DMA(CPU的秘书)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 掌握Python库的Bokeh,就能让你的交互炫目可视化

    本文分享自华为云社区《Bokeh图形魔法:掌握绘图基础与高级技巧,定制炫目可视化》,作者: 柠檬味拥抱。 Bokeh是一个用于创建交互式可视化图形的强大Python库。它不仅易于使用,而且功能强大,适用于各种数据可视化需求。本文将介绍Bokeh库的绘图可视化基础入门,重点

    2024年03月15日
    浏览(36)
  • 6款必备的办公软件,个个好用到爆,让你电脑成为真正利器

    在现代办公环境中,电脑已经成为我们必不可少的工作工具。而要发挥电脑的最大作用,就需要借助一些优秀的办公软件。下面,就来介绍五款必备的办公软件,它们个个好用到爆,让你的电脑成为真正的利器! 文件快速搜索工具——Everything Everything是Windows系统上一款文件

    2024年02月12日
    浏览(32)
  • 八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具

    本篇文章聊聊如何通过 Docker 和八十行左右的 Python 代码,实现一款类似 Midjourney 官方图片解析功能 Describe 的 Prompt 工具。 让你在玩 Midjourney、Stable Diffusion 这类模型时,不再为生成 Prompt 描述挠头。 本文将提供两个版本的工具,分别支持 CPU 和 GPU 推理使用,如果你有一张大于

    2023年04月14日
    浏览(46)
  • 十行代码编写一个Python小游戏,你准备好了吗?(文末赠书)

    准备好了吗?我们即将开始激动人心的游戏编程之旅。 或许你之前学习过一点编程,但若是你从没接触过游戏编程,那么你仍然会对游戏程序的运行感到不解。游戏程序不像计算一个公式或谜题,得到答案之后程序就结束了,游戏程序一直是处于运行中的,只要你不主动退出

    2024年03月20日
    浏览(40)
  • 真正理解红黑树,真正的(Linux内核里大量用到的数据结构

    作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地... 我们想,一棵二叉树怎么就是最坏情况,那就是它退化为一

    2024年02月16日
    浏览(23)
  • 真正的理解WPF中的TemplatedParent

    童鞋们在WPF中经常看到   TemplatedParent  ,或者经常看到下面的用法: 是不是看的一脸蒙圈? 先看官方文档: 意思是 和这个控件的  模板上的  父亲,如果这个控件不是模板创建的,那么这个值就没用。 是不是还是不懂? 黄老师来给你举个例子,看下面的代码

    2024年02月17日
    浏览(21)
  • 怎么才能真正理解服务器是什么?

    构成互联网世界的基本节点是一个又一个的计算机和网络设备。 服务器是提供特定服务的计算机,你平时用的计算机叫做终端设备。他们在机器上的本质是一样的,但因为承担不同的角色,所以有一些区别: 0、归属与成本 服务器:属于提供服务者,一般是公司等团体组织需

    2024年02月09日
    浏览(25)
  • 真正理解微软Windows程序运行机制——什么是消息

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。而且那个时间学习资料没有那么丰富,网上也

    2024年02月03日
    浏览(24)
  • 真正理解微软Windows程序运行机制——什么是句柄

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。而且那个时间学习资料没有那么丰富,网上也

    2024年02月04日
    浏览(26)
  • 真正理解微软Windows程序运行机制——窗口机制(第三部分)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。而且那个时间学习资料没有那么丰富,网上也

    2024年02月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包