FIFO和DMA

2023-05-16

FIFO

  SPI端口增加了FIFO,使得传输数据有了缓冲区间。

   FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个存储器的输入口,另一个口是存储器的输出口。主要有三个方面的作用:1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。更详细的介绍参考FIFO的定义与作


DMA

      DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。PIO模式下硬盘和内存之间的数据传输是由CPU来控制的;而在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率。
       DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。还有一个区别就是,CPU对这两个请求的响应时间不同,对中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。

缓存一致性问题

DMA 会导致缓存一致性问题。想像 中央处理器 带有缓存与外部存储器的情况,DMA 的运作则是去访问外部存储器,当中央处理器访问外部存储器某个地址的时候,暂时先将新的值写入缓存中,但并未将外部存储器的数据更新,若在缓存中的数据尚未更新到外部存储器前发生了 DMA,则 DMA 过程将会读取到未更新的数据。

相同的,如果外部设备写入新的值到外部存储器内,则 中央处理器 若访问缓存时则会访问到尚未更新的数据。

这些问题可以用两种方法来解决:

  1. 高速缓存同调系统(Cache-coherent system):以硬件方法来完成,当外部设备写入存储器时以一个信号来通知缓存控制器某存储器地址的值已经过期或是应该重新更新数据。
  2. 非同调系统(Non-coherent system):以软件方法来完成,操作系统必须确认缓存读取时,DMA 程序已经开始或是禁止 DMA 发生。

第二种的方法会造成 DMA 的系统负担。




说明:1)这里的device是controller,如spi  controller,对应的slave 接在device上

    2)一般device与DMA之间还有FIFO


 一个 DMA 传输的例子  

      这个例子展示了 DMA 传输的触发和执行。在这个例子里,软盘控制器 (FDC) 从软盘读入了一个字节,然后需要 DMA 把这个字节放到内存的 0x00123456 处。整 个过程由 FDC 对 DMA 控制器发出 DRQ2 (对第二个通道发出 DRQ 信号)信号开始。.1.1 一个 DMA 传输的例子

  DMA 控制器会注意到接收到了一个 DRQ2信号。然后控制器会确定第二个 DMA 通道已经被编程而且被标记为 unmasked (开启)。然后控制器也会确定其他的通道是活动的而且有更高的优先权。一旦这些工作完成,DMA 就要求 CPU 把总线放开,以便自己可以使用。DMA 通过总线发出 HRQ 信号直达 CPU。

   依靠处理器,CPU 在空闲的时候就可以执行一些附加的指令。但是最终 CPU 在执行从内部处理器缓存或管道读取内容的命令的时候, 还是要等待。

  既然 DMA “取得了管理权”,那么 DMA 就会激活 -MEMR,-MEMW, -IOR,-IOW 输出信号,来自 DMA 的地址输出也会被设定为 0x3456。这个输出将用来引导将被传输的字节到确定的内存地址。

  DMA 然后让需求 DMA 传输数据的设备知道传输就要开始了。这个开始的信号 就是 -DACK,如果这个设备是软盘控制器, 那么就使用 -DACK2 信号。

  软盘控制器会负责把要传输的字节放到总线数据线上。除非软盘控制器需要更多的时间从总线上获取数据(而且,如果外围设备的确需要更多的时间,这个设备会 使用 READY 信号警告 DMA。),DMA 就会等待一个 DMA 时钟周期,然后去除掉 -MEMW 和 -IOR 信号以便内存可以关闭和保存总线上的字节,然后软盘控制器就知道 那个字节已经被传输。

  因为 DMA 周期一次只传输一个字节,软盘控制器现在就会丢掉 DRQ2 信号, 因此 DMA 就知道这个不再需要了。DMA 也丢掉 -DACK2 信号,以便软盘控制器知道它必须停止往总线上传输数据。

  DMA 会检查任何一个 DMA 通道有没有动静。如果任意通道都没有 DRQ 信号,那 么 DMA 控制器就会第三次发出 -MEMR,-MEMW,-IOR,-IOW 和地址信号。

  最后,DMA 会去掉 HRQ 信号。CPU 看见这个信号后,也会去掉 HOLDA 信号。 然后 CPU 激活 -MEMR,-MEMW,-IOR,-IOW 和地址信息,然后再回去执行命令并访 问内存和外围设备。

  对于一个典型的软盘区段,上述过程会重复 512 次,每次一个字节。每个字节传输的时候,DMA 中的地址寄存器会增加一,显示还有多少字节要传输的数据计数器则会减一。

  当这个计数器变为 0 的时候,DMA 会发出 EOP 信号,意味着 DMA 知道计数 器为 0,没有数据需要传输了,并等待再次被 CPU 召唤执行其他任务。这个事件也 叫作 终端计数 (Terminal Count, or TC)。只有一个 EOP 信号,而且,既然每次只 会有一个 DMA 通道是活动的,那么这个活动的通道就只可能是刚刚完成任务的通道。

  当缓存的传输结束以后,如果一个外围设备需要发出中断信号,就可以试验一 下把 -DACKn 信号和 EOP信号一起发出去。如果有这样的情况发生,就意味着 DMA 在没有 CPU 干预的情况下,不会再给那个设备传送任何的数据了。外围设备就可以发出中断信号来取得处理器的注意。在 PC 架构下,DMA 芯片自己是不能发出中断信号的。只有外围设备以及相应的硬件才负责发送中断信号。因此,就有可能有使用 DMA 而不使用中断的外围设备。

  应该懂得,尽管 CPU 在 DMA 需要的时候,总是把总线释放给 DMA,这个动作在应用程序和操作系统里面是不可见的,只是当 DMA 是活动的时候,CPU 执行指令的时间会有一点点的差别。因此,处理器会不时的探测外围设备的状态,探测 DMA 芯片中的寄存器,或者当 DMA 传输结束的时候,从外围设备接收中断信号以确定 情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FIFO和DMA 的相关文章

  • STM32使用DMA接收串口数据

    目录 01 概述 02 DMA接收 03 中断 04 代码 01 概述 在之前的文章里 STM32串口详解 和 STM32 DMA详解 文章中 xff0c 详细讲解了STM32的串口和DMA外设 xff0c 本篇文章将不在细述串口和DMA的
  • stm32串口DMA方式向上位机连续发送数据

    目录 一 认识DMA1 DMA框图2 什么是DMA xff1f 3 DMA传输方式4 DMA传输参数5 DMA数据传输的四个要素6 DMA的应用场景 二 串口DMA方式向上位机发送数据1 实验要求2 通过STMCube配置项目 1 设置RC
  • 2.14 STM32 串口传输最佳处理方式 FreeRTOS+队列+DMA+IDLE (二)

    紧接着上一篇文章 如何合理处理多个串口接收大量数据 此种方法 很厉害 很NB 首先 利用DMA 可节省大量CUP资源 其次 利用IDLE空闲中断来接收位置个数的数据 最后利用串口DMA环形数据的偏移量 长度 入队 出队处理数据 保证了任务的
  • 一文彻底理解DMA

    DMA Direct Memory Acess 1 什么是DMA 有什么作用 2 DMA传输过程简述 2 1 DMA普通传输过程 2 2 DMA指针递增传输过程 2 3 DMA循环传输过程 2 4 DMA双缓冲区传输过程 3 STM32F4
  • STM32F407的ADC+DMA 的简单使用

    这里以ADC3通道14为例 adc h ifndef adc H define adc H include stm32f4xx conf h ADC GPIO 宏定义 define RHEOSTAT ADC GPIO PORT GPIOF
  • 同步FIFO的verilog实现(2)——高位扩展法

    一 前言 在之前的文章中 我们介绍了同步FIFO的verilog的一种实现方法 计数法 其核心在于 在同步FIFO中 我们可以很容易的使用计数来判断FIFO中还剩下多少可读的数据 从而可以判断空 满 关于计数法实现同步FIFO的详细内容 请
  • 嵌入式基础知识-DMA

    本篇来介绍DMA的一些基础知识 1 DMA简介 DMA Direct Memory Access 中文名为直接内存访问 它是一些计算机总线架构提供的功能 能使数据从附加设备 如磁盘驱动器 直接发送到计算机主板的内存上 对应嵌入式处理器来说
  • 初步认识Ehcache清空缓存的3种策略

    Ehcache是一种广泛使用的开源Java分布式缓存 主要面向通用缓存 Java EE和轻量级容器 它具有内存和磁盘存储 缓存加载器 缓存扩展 缓存异常处理程序 一个gzip缓存servlet过滤器 支持REST和SOAP api等特点 在
  • Xilinx FIFO Generator 需要注意RST复位

    Xilinx FIFO Generator 需要注意RST复位 系列文章推荐 Xilinx FIFO Generator 需要注意RST复位 Xilinx FIFO Generator 需要注意Actual Depth Xilinx FIF
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 无法写入通过 NFS 连接的 FIFO 文件

    我正在尝试写入位于 NFS 安装上的 FIFO 文件 但它会阻塞 可能是什么问题呢 我的 etc export tmp test 10 0 0 0 24 rw no root squash async NFS 服务器和客户端上的 ls tm
  • SQL 先进先出忠诚点

    各位开发人员和分析师 我在 SQL 方面有一些经验 并且已经求助于类似的帖子 然而 这有点小众 预先感谢您的帮助 我有以下数据集 已编辑 道歉 Setup CREATE TABLE CustomerPoints CustomerID INT
  • 为什么在 Linux 中使用 kmalloc 和 GFP_DMA 时会得到高地址?

    我正在 Linux 中为 DMA 设备编写设备驱动程序 在Linux 设备驱动程序 第 15 章 http lwn net images pdf LDD3 ch15 pdf 它说 对于有这种限制的设备 应该分配内存 通过将 GFP DMA
  • Node.js fs.open() 在尝试打开超过 4 个命名管道 (FIFO) 后挂起

    我有一个 node js 进程 需要从不同其他进程提供的多个命名管道中读取数据作为 IPC 方法 我意识到在打开并创建来自四个以上 fifo 的读取流后 fs 似乎不再能够打开 fifo 并只是挂在那里 考虑到可以毫无问题地同时打开数千个文
  • Unix 上具有多个读取器的命名管道 (FIFO)

    我有两个程序 Writer 和 Reader 我有一个从写入器到读取器的 FIFO 因此当我向写入器中的标准输入写入内容时 它会从读取器打印到标准输出 我尝试在打开两个 Reader 的情况下执行此操作 并且仅从两个 Reader 程序之一
  • glBufferSubData什么时候返回? [复制]

    这个问题在这里已经有答案了 我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区 然后立即更改 CPU 上的内存内容 伪代码是这样的 glBindBuffer very large buffer glBufferSubData ve
  • 用 C 语言实现 FIFO 队列

    对于嵌入式应用程序 我尝试使用 ANSI C 实现先进先出 FIFO 结构队列 最直接的方法似乎是通过实现链表 以便每个结构包含指向队列中下一个的指针 因此我将结构本身定义为 typedef enum LED on LED off etc
  • 环形缓冲区和 DMA

    我试图了解从数据包到达网卡到目标应用程序收到数据包之间发生的所有事情 假设 缓冲区足够大 可以容纳整个数据包 我知道情况并非总是如此 但我不想介绍太多技术细节 一种选择是 1 Packet reaches the NIC 2 Interru
  • 在 FIFO 上写入“复杂”结构

    我正在使用 C 语言与客户端服务器进行某种 餐厅 实现 我正在尝试通过 FIFO 发送以下结构 typedef struct int numtable table number to send answer char timestamp 2
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成

随机推荐

  • 开源自己做的4.3寸触摸屏,SWM32单片机+LVGL

    十一假期抽时间把SWM32S做的触摸屏板的综合程序弄了一下 xff0c 板子硬件资源如下 xff1a SWM32S单片机 xff0c LQFP 64封装 xff0c 内置8MB的SDRAM 4 3寸16位RBG接口电容触摸屏 xff0c 8
  • 盘点国产RISC-V内核的单片机

    RISC V就不必多说了 xff0c 它是一个基于精简指令集的开源指令集架构 与主流的主流的架构为x86与ARM架构不同 xff0c 其特点就是完全开源 今天跟大家一起盘点一下国产RISC V内核的单片机 1 GD32VF103系列 兆易创
  • 单片机通过WIFI模块(ESP8266)获取网络时间与天气预报

    前几天发布了开源4 3寸触摸屏的文章 开源4 3寸触摸屏 xff0c 里面有WIFI获取时间和天气预报相关的功能 xff0c 今天就来介绍一下这个功能是怎样实现的 1 底层驱动 首先 xff0c 硬件上 xff0c 单片机通过串口AT指令访
  • 开源贴片机OpenPnp使用体验

    平时做板子比较多 xff0c 一直想整一个贴片机 xff0c 但是据说国产的桌面贴片机用起来都不咋地 xff0c 而且价格也不菲 xff0c 带视觉的将近2W 思来想去选择了OpenPnP xff0c 一方面价格便宜 xff0c 另一方面开
  • 【干货】STM32通过ADC模拟看门狗实现掉电保存

    1 前言 很多时候我们需要将程序中的一些参数 数据等存储在EEPROM或者Flash中 xff0c 达到掉电保存的目的 但有些情况下 xff0c 程序需要频繁的修改这些参数 xff0c 如果每次修改参数都进行一次保存 xff0c 那将大大降
  • 【开源项目】SFUD--通用串口Flash驱动库的移植和使用

    1 简介 SFUD 是一款开源的串行 SPI Flash 通用驱动库 由于现有市面的串行 Flash 种类居多 xff0c 各个 Flash 的规格及命令存在差异 xff0c SFUD 就是为了解决这些 Flash 的差异现状而设计 xff
  • STM32F0系列中断向量映射问题

    最近用Cortex M0内核的STM32F030K6T6做个东西 xff0c 需要做IAP升级 xff0c 发现它的中断向量与M3 M4等内核的单片机不太一样 xff0c 这里分享给大家 IAP升级需要一个BootLoader程序 xff0
  • STM32定时器实现红外接收与解码

    1 NEC协议 红外遥控是一种比较常用的通讯方式 xff0c 目前红外遥控的编码方式中 xff0c 应用比较广泛的是NEC协议 NEC协议的特点如下 xff1a 载波频率为 38KHz 8 位地址和 8位指令长度 地址和命令2次传输 xff
  • SPI读写SD卡速度有多快?

    SD卡是一个嵌入式中非常常用的外设 xff0c 可以用于存储一些大容量的数据 但用单片机读写SD卡速度一般都有限 xff08 对于高速SD卡 xff0c 主要是受限于单片机本身的接口速度 xff09 xff0c 在高速 实时数据存储时可能会
  • SPI方式读写SD卡速度有多快?

    很久没有写公众号了 xff0c 一方面忙 xff0c 另一方面也不知道写些什么内容 xff0c 大家如果有想了解的 xff08 前提是我也懂 xff09 xff0c 可以后台发送给我 今天主要来测试一下SPI读写SD卡的速度 SD卡是一个嵌
  • 火狐浏览器添加脚本(可代替手动做一些操作)

    首先打开火狐浏览器的更多组件 xff0c 在扩展中搜索Greasemonkey 然后点击安装 安装成功后点立即重启 重新打开浏览器后浏览器右上角会有一个猴子的图标 点击下标按钮 xff0c 新建用户脚本 xff0c 新建用户脚本可以随意命名
  • SDIO读写SD卡速度有多快?

    前两天测试了SPI方式读写SD卡的速度 SPI方式读写SD卡速度测试 xff0c 今天来测试一下SDIO方式的读写速度 测试条件 xff1a 单片机 xff1a STM32F407VET6 编译环境 xff1a MDK 5 30 43 HA
  • STM32CubeMx+HAL库实现USB CDC+MSC复合设备

    之前的文章中介绍过STM32的USB应用 xff0c 包括虚拟串口 xff08 CDC xff09 和大容量存储设备 xff08 MSC xff09 今天来介绍USB实现CDC和MSC复合设备的方法 硬件 xff1a STM32F407VE
  • 基于STM32CubeMx的USB CDC+MSC复合设备

    之前的文章中介绍过STM32的USB应用 xff0c 包括虚拟串口 xff08 CDC xff09 和大容量存储设备 xff08 MSC xff09 今天来介绍USB实现CDC和MSC复合设备的方法 硬件 xff1a STM32F407VE
  • go标准库httputil.ReverseProxy简单介绍和使用避坑

    很久没水博客了 xff0c 今天就来水一篇 xff0c 说说go标准库的httputil ReverseProxy httputil ReverseProxy顾名思义 xff0c http的反向代理 xff0c 可以类比nginx的反向代理
  • (二)Ardupilot软件分析及代码架构

    先要搞明白ardupilot是怎么实现飞行控制的 xff1f 然后再看文件 1 建立两个基本坐标系 xff1a 地理坐标系和载体坐标系 xff0c 保证两个基本坐标系的正确转化 一般使用旋转矩阵实现坐标系转换 xff1a 四元数运算 q01
  • STM32F103 实例应用——实现透传转发串口

    一 预期准备 实现机制 xff1a 空闲中断 43 DMA中断接收不定长串口数据 开发工具 xff1a STM32F103芯片 xff0c keil5 xff0c usb转ttl工具 预计实现效果 xff1a 串口1接收数据然后透传给串口2
  • 解决:ORA-06550 字符串长度限制在范围 (1...32767)

    错误信息 ORA 06550 第 1 行 第 782 列 PLS 00215 字符串长度限制在范围 1 32767 解决 本例是配置存储过程job的job action 61 gt 39 Declare FLAG Number 20 FAI
  • gcc、make、makefile、cmake、cmakelists区别

    转自 xff1a http www zhihu com question 36609459 辉常哥 1 gcc是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器
  • FIFO和DMA

    FIFO SPI端口增加了FIFO xff0c 使得传输数据有了缓冲区间 FIFO存储器是一个先入先出的双口缓冲器 xff0c 即第一个进入其内的数据第一个被移出 xff0c 其中一个存储器的输入口 xff0c 另一个口是存储器的输出口 主