首页 > 其他分享 >关于DMA (一)

关于DMA (一)

时间:2023-06-19 14:46:21浏览次数:34  
标签:DMA 传送 总线 内存 CPU 外设 关于


1. CPU与外设数据传送方式

  • 主要有程序传送方式和中断传送方式。
  • 程序传送方式
    • 在程序控制下进行数据输入/输出操作,分为无条件(无需考虑外设状态,直接IN/OUT指令输出)和查询(在IN/OUT指令前,需要查询设备状态)两种。
  • 中断传送方式
    • 外设向CPU发起请求,CPU暂停正在执行的程序,去传输数据给外设,传输结束后。CPU再继续被暂停的程序。
  • 程序传送方式和中断传送方式的区别
    • 前者为CPU主动发起,轮询外设,效率低。
    • 后者为外设主动发起,等待CPU处理,但是需要进行断点和现场的保护和恢复,浪费CPU时间,适合少量数据的传输。
  • 下图列出了CPU程序传送方式、中断传送方式以及DMA传送方式的CPU使用情况。(图源不知道是哪里,有点糊。)

2. DMA 批量数据传输

  • 下图为DMAC结构图。

2.1 传输方向

  • 存储器到外设
  • 外设到存储器
  • 存储器到存储器

2.2 传输过程

  • (1)请求
    • CPU配置DMA相关寄存器:
      • 控制命令寄存器,配置传输数据的发起方式、数据大小、通道。
      • 初始地址寄存器,DMAC根据该地址寄存器的值,进行寻址传输数据。
    • 之后向I/O接口发出操作命令;外设向DMA控制器发出请求,有单独请求信号线,而不是走AHB总线。
  • (2)响应
    • DMA控制器对 多个DMA请求 判断优先级以及是否屏蔽请求,之后向总线仲裁模块提出总线请求。
    • 当CPU执行完当前任务即可释放总线控制权。DMA控制器获得总线控制权后便开始传输。
  • (3)传输
    • DMA拿到总线控制权后,CPU无法使用总线,所以它挂起或只执行内部操作;DMA控制器直接控制内部存储器与外设之间的数据交互。
  • (4)结束
    • 完成数据传送后,DMA控制器释放总线控制权,并向外设发出结束信号,外设需要结束数据传输工作,并向CPU提出中断请求。
    • CPU执行中断服务程序,检验DMA传输过程是否出错,以及是否要继续使用DMA传送其它数据块。

3. DMA & CPU 内存分配

  • DMA传输需要对内存进行操作,而CPU在DMA传输过程中仍可以继续工作,可能也会对内存进行操作,这就涉及到DMA和CPU怎么分时使用内存。通常有3种传送方式:
    • (1)停止CPU访问内存
      • DMA控制器向仲裁器申请总线控制权时,CPU交出控制权,处于不工作状态或者保持状态。
      • 优点:控制简单;
      • 缺点:考虑到外设传送两个数据之间的间隔一般大于内存的存储周期,例如,外设读出两个数据之间的间隔大概32us,内存的存储周期大概为0.5us,那么内存就有31.5us(63个内存周期)的空闲。
    • (2)周期挪用(较为常用)
      • DMA访问内存和CPU访问内存没有冲突。
        • 例如,CPU正在执行乘法操作,从内存取出数据之后可能还要消耗一些周期,此时DMA挪用一两个内存周期也不会影响CPU的程序执行。
      • DMA访问内存和CPU访问内存有冲突。
        • 需要优先DMA(I/O)访内,因为I/O访问内存有时间要求,这个数据必须在下一个I/O访问请求之前存取/读出完毕。
        • 此时可以在CPU访问内存过程中插入DMA请求,挪用一两个CPU的内存周期,用于DMA的数据存取;延缓了CPU对内存空间的操作。
        • 但是DMA每次挪用需要有申请总线控制权、归还总线控制权的过程,所以每次读取一个字对于内存来说可能只要一个周期,但是对于DMA控制器却要2-5个内存周期。但是好在大部分的外设读写周期都要大于内存存储周期。
    • (3)DMA和CPU交替访问内存
      • 主要适用于CPU工作周期比内存存取周期长的多情况。
        • 例如CPU周期为1.2us,内存存取小于0.6us,这样就可以将一个CPU周期分为C1和C2两个周期,其中C1为DMA访问内存,C2为CPU访问内存。
      • 这种方式不必像(2)中一样需要总线使用权的申请和归还过程,因为总线使用权是C1和C2分时制的。对于总线来说,输入的数据、地址、控制信号等是由C1,C2周期控制的多路选择器的输出。
      • 这种方式CPU不会停止主程序的运行,也不会进入等待状态,效率是三种方式中最高的,但是相应的硬件逻辑也更复杂。

标签:DMA,传送,总线,内存,CPU,外设,关于
From: https://www.cnblogs.com/qianbinbin/p/17491081.html

相关文章

  • 关于flutter框架安卓应用抓包问题,以及解决方法
    参考文档https://bbs.kanxue.com/thread-261941.htm一.从安装的app所在文件夹目录中提出libflutter.socd/data/app/包名/lib/xxx/..../...libflutter.so二.将其拖入ida中进行分析字符串窗口搜索ssl_server按x进入F5看了一下和上面博客说的相似不理解上面说的也......
  • 关于Cloud-磁盘-分区-物理边界的扩展-扩容
    对于一块磁盘,一般来说,是需要进行分区(也有直接对磁盘进行格式化的情况)、然后创建文件系统后,挂载到系统中才能使用 要扩容,这样主要就是分为两种情况1、对于整块磁盘、创建了文件系统的,想对其扩容2、对于分区,创建了文件系统的,想对其扩容 对于整块磁盘文件系统的扩容,方法比较......
  • 关于ASP.NET.CORE中的Failed to read parameter "string param" from the request bod
    先上报错信息Microsoft.AspNetCore.Http.BadHttpRequestException:Failedtoreadparameter"stringparam"fromtherequestbodyasJSON.--->System.Text.Json.JsonException:'s'isaninvalidstartofavalue.Path:$|LineNumber:0|By......
  • 关于数据治理的读书笔记 - 数据治理路线图规划
    数据治理成熟度评估为企业提供了一个数据治理的切入点,通过发现企业数据治理中存在的问题,找到目前和业界领先企业的差距,绘制出符合企业现状和需求的数据治理路线图。路线图是指描述技术变化步骤或技术相关环节之间逻辑关系的简洁的图形、表格、文字等形式。数据治理路线图则是对企业......
  • 关于使用vsmonodebuger对mono中运行的c#程序远程调试
    介绍:Mono是基于.NETFramework的开源开发平台,允许开发人员构建跨平台应用程序,从而提高开发人员的工作效率。Mono的.NET实现基于C#和公共语言基础结构的ECMA标准。简而言之就是可以运行.netframework程序跨平台执行vsmonodebuger:是mono的一个vs调试器插件,我们可以通过这个插件在......
  • 关于前后端JSON解析差异问题与思考
    本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾在一次涉及流程表单的需求发布时,由于表单设计的改动,需要在历史工单中的一个json字段增加一个属性,效果示意如下:[{"key1":"value1"}]->[{"key1":"value1","key2":"value2"}]......
  • 关于前后端JSON解析差异问题与思考
    本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾在一次涉及流程表单的需求发布时,由于表单设计的改动,需要在历史工单中的一个json字段增加一个属性,效果示意如下:[{"key1":"value1"}]->[{"key1":"value1","key2":"value2"}]......
  • 关于TCP与UDP
    一、定义:UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是OSI(OpenSystemInterconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETFRFC768是UDP的正式规范。UDP在IP报文的协议号是17。[摘自百度百科]TCP(Transm......
  • 关于python反射机制中的参数问题处理
    关于python反射机制中的参数问题处理 python的反射机制十分的常用,主要是字符串与模块应用之间的连接方法。核心是将字符串转换成可以调用模块、模块方法的变量。主要包括了以下四个方法:hasattr(obj,name,/)Returnwhethertheobjecthasanattributewi......
  • 关于Linux系统下Lua编程运行环境的部署安装
    这里以操作系统:RedHatEnterpriseLinuxrelease8.7(Ootpa)为例,讲解如下部署Lua编程脚本的运行环境首先对于Lua脚本,需要保证系统中有lua二进制程序文件,即/usr/bin/lua但最小化安装的Linux- RedHatEnterpriseLinuxrelease8.7(Ootpa) 笔者试了一下,没有lua命令了 ......