当前位置: 首页 > ai >正文

DW_DMAC简介

基本概念:

DMA:全称direct memory access,即直接存储器访问。dma可以在中央处理器CPU不参与的情况下,实现外设和内存之间的数据直接传输,从而提高数据传输效率

0

外设与计算机内存之间的数据传输,一般可通过程序查询方式和中断方式进行

  1. 在程序查询方式时,CPU要反复测试外设状态,在外设未准备好的情况下,CPU就处于等待状态,直到外设准备好,才进行数据传送
  2. 中断方式下,每实现一次数据传送,CPU都要进入中断处理程序、保护断点、保护现场、恢复现场、返回主程序的操作

这两种方式都是在CPU的控制下,通过CPU执行指令来完成的。数据传送方向为外设->CPU->内存。这两种方式没传送一字节都需要耗用较长时间

使用CPU搬运外设数据的缺点:

  • CPU的工作速度与外设的工作速度相差很大,降低系统的效率
  • CPU操作一次总线只能进行一次存取
  • 搬运数据时需要先把数据放在寄存器,然后再从寄存器搬到另一个地址
  • 外设数据类型繁多,CPU无法直接存取,需要进行格式转换

使用DMA搬运数据的效果:

  • 多通道同时可以传输,提高搬运效率
  • 基于burst类型传输,操作一次总线可进行多个数据的读写
  • 搬运外设数据时,数据可先存放在通道内部的fifo,再转发
  • 可以根据外设的数据格式设置后进行读写搬运数据

DMA概念介绍:

1、源外设:DMA搬运数据的起点,读取数据的地方

2、目的外设:DMA搬运数据的终点,写入数据的地方

3、通道channel:DMA多个通道,每个通道配置后都可以进行数据的搬运。可理解为传输数据的管道

4、master接口:作为master访问读写数据的接口,一般使用AXI接口

5、slave接口:CPU读写配置DMA的接口,一般使用AHB或者APB

6、硬件握手:外设与DMA交互时的握手信号,例如dma_req、dma_single、dma_last等信号

7、流控:决定DMA传输中,传输的数据量、传输结束的控制信号等

数据流向简介:

下图展示的是源外设到目的外设的数据流向:

0

1、CPU通过APB/AHB总线将DMA具体的配置进行配置,上图选择channel0,通过AHB配置传输的源地址、目的地址、传输的数据量等

2、源外设,发送DMA握手信号之后,DMA才会启动传输,在此之前会等待硬件握手信号

传输层次

针对非内存外设的DMA传输层次结构:

0

DMA传输中,分为block为传输,对应的就是Block Transfer level,DMA Transaction Level的Burst Transaction指的是外设配置的channel CTL寄存器中的msize,会根据msize的设置进行burst/signal传输;AMBA Transfer Level相当于AXI总线传输层次上面的,这个跟arlen/awlen的设置相关。如果想自己设置可通过channel CTL寄存器中的awlen/arlen设置,如果没设置或者设置异常则会由dma随机设置。

针对内存外设的DMA传输层次结构:

0

传输类型:

DMA的作用就是实现数据的直接传输,主要涉及四种情况的数据传输。四种传输情况如下:

1、外设到内存

2、内存到外设

3、外设到外设

4、内存到内存

上面四种传输情况,可根据具体的使用情况分为两种流控方式:DMA流控、外设流控

DMA硬件握手信号:

1、dma_req:外设burst请求信号

2、dma_singal:外设single请求信号

3、dma_last:外设流控时信号有效,指示此次传输为最后一次burst/single传输

4、dma_ack:dma回应外设信号

5、dma_finish:dma传输完成信号

0

当DMA流控的时候,dma_last信号是会被忽略的,会根据block_ts传输完成之后,就会给外设发出dma_finish信号,表示传输完成

当外设流控的时候,当外设传输最后一块数据时,就发送dma_last信号给到DMA,DMA收到dma_last信号就知道传输的是最后一块数据,传输完成之后发送dma_finish信号给到外设,表示传输完成

0

DMA传输类型:

DMA single block:

contiguous:连续地址访问的方式,按照地址递增的方式传输数据

DMA multi blocks传输:

shadow register:阴影寄存器方式,block传输之前会将信息重新从寄存器中读取再进行传输

auto-reload:自动重载方式,每一个block传输开始前重新加载初始传输信息,重新传输

lllp:链表方式进行multi-block类型传输时,下一个block传输的信息会存储在链表指向的地址中

对DMA不同传输方式的理解:

1、contiguouts进行源地址、目的地址递增的数据传输,最常见的就是读写memory的方式

2、atuo-reload是传输完成之后又会回到起始状态,加载的数据量、源地址和目的地址都不变

3、shadow和llp都需要将传输block信息配置好,区别是llp要分配一块内存,但可以构造较多的即将传输的block信息,shadow不会用到系统内存,但只能提前构造下一块传输的block信息

4、llp模块可以静态创建一块链表,也可以动态扩展

http://www.xdnf.cn/news/7366.html

相关文章:

  • 嵌入式学习笔记 D22:栈与队列
  • 编排优先——Go 语言开发 AI 智能体的设计与实现
  • 专为MoE设计的“超级工厂”,来了
  • 跨境业务服务器架构设计与CN2线路深度调优
  • Spring Boot 接口定义指南:构建高效的RESTful API
  • 【第二届帕鲁杯】第二届帕鲁杯畸行的爱完整wp
  • RSP-BSP-1
  • 生成式人工智能认证(GAI认证)在企业中的认可度怎样?
  • 基于 STM32 的自动温度巡检小车控制系统设计与实现
  • 第五天的尝试
  • 经典算法复习——快速模幂
  • 51单片机点亮一个LED介绍
  • C++ 函数对象、仿函数与 Lambda 表达式详解
  • 12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】
  • 深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈
  • 嵌入式学习笔记 - STM32独立看门狗IWDG与窗口看门狗WWDG的区别
  • HTTPS实验室——TLS/TLCP一站式解决方案
  • C语言——深入理解指针(一)
  • rosbag使用记录
  • 搭建一个永久免费的博客
  • Java设计模式之组合模式:从入门到精通(保姆级教程)
  • Java 泛型详解
  • 黄仁勋Computex演讲:将于三季度推出下一代GB300系统,个人AI计算机DGX Spark已全面投产
  • 进程和线程有什么区别?多线程有什么优缺点?线程的创建方式有哪些?如何简单的使用线程?用户线程和守护线程有什么区别?start 和 run 方法有什么区别?
  • go 与面向对象编程(OOP)
  • 设置IDEA打开新项目使用JDK17
  • 【OpenCV基础2】图像运算、水印、加密、摄像头
  • 信号量基础入门:并发控制的核心概念
  • BGP选路
  • 常用ECSQL整理