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 传输结束的时候,从外围设备接收中断信号以确定 情况。

转:FIFO和DMA的更多相关文章

  1. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

  2. 第二章 LM3S USB处理器

    2.1 LM3S处理器简介 Luminary Micr公司Stellaris所提供一系列的微控制器是首款基于Cortex-m3的控制器,它们为对成本尤其敏感的嵌入式微控制器应用方案带来了高性能的32位 ...

  3. Linux中的DRM

    如果在搜索引擎离搜索 DRM 映入眼帘的尽是Digital Rights Managemen,也就是数字版权加密保护技术.这当然不是我们想要的解释.在类unix世界中还有一个DRM即The Direc ...

  4. Linux Framebuffer驱动剖析之一—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...

  5. I2S音频总线学习

    IIS音频总线学习(一)数字音频技术 一.声音的基本概念 声音是通过一定介质传播的连续的波. 图1 声波 重要指标: 振幅:音量的大小 周期:重复出现的时间间隔 频率:指信号每秒钟变化的次数 声音按频 ...

  6. 【Alsa】播放声音和录音详细流程

    linux中,无论是oss还是alsa体系,录音和放音的数据流必须分析清楚.先分析alsa驱动层,然后关联到alsa库层和应用层. 二,链接分析: 1)链路一 usr/src/linux-source ...

  7. mini2440裸机音乐播放器(非常久曾经的笔记)

    [这是好久曾经写的.有点乱,没时间整理.当做记录用的.] 图片粘贴失效.没上传图,想要的直接下载文档吧. 项目目的:通过IIS,触摸屏,LCD模块实现音乐播放器功能(button上一首.下一首.播放. ...

  8. S3C2410中文芯片手册-11.串口

    目录 11 UART Overview Featrues UART Operation Data Transmission Data Reception Auto Flow Control(AFC) ...

  9. Linux内核网络数据包处理流程

    Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...

随机推荐

  1. Android 图标上面添加提醒(一)使用Canvas绘制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发一些如通讯录.社交等应用或者应用添加新功能模块时,会考虑在对应的图标上加上未读信息的数量,或者是新功能提醒的图标,这样不占太大空间还能达 ...

  2. linux 命令c语言代码实现

    自己学习<APUE>时写的linux下一些命令(大概40个左右)实现,仅当学习使用,这些命令包含cat cp echo head ls paste rmdir tail umask who ...

  3. QStandardItemModel角色控制及QTreeView加入不同的右键菜单

    1.概述 QTreeView最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了Qt中使用标准化项目模型QSt ...

  4. linux下杀死进程(kill)的N种方法 【转】

    转自 http://blog.csdn.net/andy572633/article/details/7211546 首先,用ps查看进程,方法如下: $ ps -ef ……smx       182 ...

  5. URLConnection类详解

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html ...

  6. [转帖]FPGA--Vivado

    来源:http://home.eeworld.com.cn/my/space-uid-639749-blogid-267593.html 一般的,在Verilog中最常用的编码方式有二进制编码(Bin ...

  7. 怎样在thinkphp里面执行原生的sql语句

    $Model = new Model(); $sql = "select * from `order`"; $voList = $Model->query($sql); 只是 ...

  8. spring data jpa Specification 例子

    /** * 封装查询条件 * * @param baseQueryDTO * @return */ private Specification<ActivityBase> getSpeci ...

  9. 最优雅的C++跟lua交互.

    我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...

  10. SGU 143.Long Live the Queen(女王万岁)

    时间限制:0.25s 空间限制:4M 题意: 有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连.每个小镇有一个收益x(-1000<=x<=1000). 现在要求,选择一 ...