dma

接口技术第六章——输入输出接口及数据传输控制方式总结

老子叫甜甜 提交于 2019-12-06 04:14:53
正在学习接口技术和计算机组成原理,中间有一些重叠的部分就放在一起了,至于DMA,中断之类的会放在后面讲解 6.1 接口综述 硬件接口通常称为I/O接口,把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口。I/O接口是CPU同外界进行信息交换的中转站 使用接口的原因 速度不匹配 外设外慢 时序不匹配 各个外部设备都有自己的定时控制电路,以自己的速度进行传输,同CPU的时序不匹配 信息格式不匹配,不同的外设存储和处理信息的格式不同 信息类型不匹配,有些是数字电路,有些是模拟电路 CPU与外设之间所传送的数据类型 数据信息 包括模拟量,数字量,开关量,可以输入也可以输出 状态信息 这是I/O端口送给CPU的有关本端口所对应的外设当前状态的信息,供CPU参考分析 控制信息 这是CPU送给I/O设备的控制命令,使相应的外部设备完成特定的操作 在8086/8088中,这三种信息的输入输出基本一致,可以分发不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入输出的数据中设置特征位 接口的功能(背) 执行CPU命令 CPU将对外设的控制命令发到接口电路的命令寄存器中,以便控制外设按要求进行工作 返回外设状态 通过外设寄存器(状态口)完成,包括正常工作状态和故障状态 数据缓冲的功能 (平滑作用)接口电路中的数据寄存器(数据口)对CPU与外设设备之间的数据进行中转

8237A DMA控制器简答

守給你的承諾、 提交于 2019-12-06 03:18:52
(1)、比较中断和DMA两种传输方式的特点。 在中断模式下,外设需与主机传送数据时要请求主机给与中断服务,中断当前主程序的执行,自动转向对应的中断处理程序,控制数据的传输,过程始终是在所执行的指令控制之下。 在DMA模式下,系统中有一个DMA控制器,它是一个可驱动总线的主控部件。当外设与存储器之间需要传送数据时,外设向DMA控制器发出DMA请求,DMA控制器向CPU发出总线请求,取得总线控制权后,DMA控制器按照总线时序控制外设与存储器间的数据传输而不是通过指令来控制数据传输,传输速度大大高于中断方式。 (2)、DMA控制器应具有哪些功能? DMA控制器应有DMA请求输入线,接收I/O设备的DMA请求信号; DMA控制器应有向主机发出总线请求的信号线和接收主机响应的信号线; DMA控制器在取得总线控制权以后应能发出内存地址、I/O读写命令及存储器读写命令控制I/O与存储器间的数据传输过程。 (3)、80286系统一个存储单元是24位物理地址,而8237A在寻址内存空间时,只能给出16位地址码,这一矛盾是如何解决的?有哪些硬件和软件措施? (4)、8237A提供哪几种传送方式? 8237A提供一下几种传送方式: 请求传送方式 单字节传送方式 数据块传送方式 级联传送方式 (5)、8237A只有8位数据线,为什么能完成16位数据的DMA传送? I/O与存储器间在进行DMA传送过程中

[分享]升级MPSoC Linux LTS 版本和Realtime版本

…衆ロ難τιáo~ 提交于 2019-12-05 23:27:41
大部分项目设计需要一个稳定的Linux版本,但是又需要修复内核漏洞。这种情况下,跟随LTS版本升级,是最好的办法。 很多项目也需要改善Linux的实时特性。可以使用Linux Realtime patch实现。 在kernel.org下载 https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz ; https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.52.tar.xz;https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.52-rt34.patch.gz。 在Xilinx网站下载https://github.com/Xilinx/linux-xlnx/archive/xlnx_rebase_v4.14_2018.3.tar.gz。 使用patch,将patch-4.14.52-rt34.patch, 应用到linux-4.14.52,得到linux-4.14.52-rt。 再使用diff,以Linux 4.14为基础,为xlnx_rebase_v4.14_2018.3.tar.gz创建patch。在将得到的patch文件,应用到linux-4

Why am I getting a high address when I use kmalloc with GFP_DMA in Linux?

回眸只為那壹抹淺笑 提交于 2019-12-05 18:28:56
I am writing a device driver for a DMA device in Linux. In Linux Device Drivers, Chapter 15 , it says: For devices with this kind of limitation, memory should be allocated from the DMA zone by adding the GFP_DMA flag to the kmalloc or get_free_pages call. When this flag is present, only memory that can be addressed with 24 bits is allocated. Alternatively, you can use the generic DMA layer (which we discuss shortly) to allocate buffers that work around your device’s limitations I am calling kmalloc like this: physical_pointer0 = kmalloc(number_of_bytes, GFP_DMA); and printing the result like

计算机组成原理之组成_2019-10-29

假如想象 提交于 2019-12-05 07:20:55
内容主要关于计算机总线与IO设备、计算机储存器、计算机的CPU; 计算机的总线  概述   平常我们日常所见的USB,既是通用串行总线(Universal Serial Bus),它提供了提供了对外连接的接口,且不同设备可以通过USB接口进行连接;是一种连接的标准,可以解决不同设备之间的通 信问题,也能够促使外围设备接口的统一。   总线(Bus)也是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传 输数据、数据地址和控制信号。   在不使用总线进行传输的时候,一般采用分散连接的方式,既输入设备同时与存储器、运算器、控制器连接,这样做会使得线路过于复杂。总线可以用来替代原来的基于运算器为主的分散式连接,通过总 线将多个部件连接在一起,使得运算器只需要与总线打交道,实现了存储器为主的计算机并且方便了硬件的扩展。  总线的分类   总线分为片内总线和系统总线。   片内总线    片内总线,既是高集成度芯片内部的信息传输线。如:寄存器与寄存器之间或寄存器与控制器、运算器之间。    系统总线     系统总线分为数据总线、地址总线、控制总线。是CPU、主内存、IO设备、各组件之间的信息传输线。     数据总线,可以双向传输各个部件的数据信息,数据总线的位数(宽度)

STM32_ADC

女生的网名这么多〃 提交于 2019-12-04 22:03:56
裸机--ADC 简介 STM32f103 系列有 3 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。 其中ADC1 和 ADC2 都有 16 个外部通道,ADC3 根据 CPU 引脚的不同通道数也不同,一般都有8 个外部通道。 功能 电压输入范围: ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定. 一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。 电压范围变宽 外部电压转换为0-3.3V. 输入通道 外部通道(最多16道) ADCx_IN0~~ADCx_IN15 内部通道 ADC1 的通道 16 连接到了芯片内部的温度传感器,Vrefint 连接到了通道 17。 ADC2 的模拟通道 16 和 17 连接到了内部的 VSS。 ADC3 的模拟通道 9、14、15、16 和 17 连接到了内部的 VSS。 规则通道 注入通道 触发源 ADC控制写0/1 定时器触发 外部IO触发 转换时间 时钟 ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M, 采样时间 采样周期最小1.5个周期 Tconv = 采样时间 +12.5 个周期。当 ADCLK = 14MHZ (最高)

I/O管理杂记

纵然是瞬间 提交于 2019-12-04 20:59:14
  这是一篇杂记,记录了操作系统层面与I/O管理的零散知识点,用于温习使用。由于I/O管理是一个很大的范畴,后续会不断按照自己的生产需求来补充用的到的知识点。计算机系统是人造系统,没有绝对的对错(相对于自然系统的绝对性),只有特定场景下的优劣。我们在理解一块知识时应当从它提出的背景以及要解决的问题出发,去理解机制而不是纠结于如何具体的实现。即使目的相同,不同的公司或开发者在不同场景下的实现也不尽相同,了解几个例子加深自己的理解、帮助自己构建起知识体系即可(个人观点)。 设备控制器   设备控制器是计算机中的一个实体,其主要职责是 控制一个或多个I/O设 备,以实现I/O设备和计算机之间的数据交换。它是 CPU与I/O设备之间的接口 ,它接收从CPU发来的命令,并去控制I/O设备工作, 以使处理机从繁杂的设备控制事务中解脱出来 。设备控制器是一个 可编址 的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。设备控制器的复杂性因不同设备而异,相差甚大,于是可把设备控制器分成两类:一类是用于控制 字符设备 的控制器,另一类是用于控制 块设备 的控制器。在微型机和小型机中的控制器,常做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机。有些控制器还可以处理两个、四个或八个同类设备。   控制器由

Coherently understand the software-hardware interaction with regard to DMA and buses

做~自己de王妃 提交于 2019-12-04 19:54:15
I've gathered some level of knowledge on several components (including software and hardware) which are involved in general DMA transactions in ARM based boards, but I don't understand how is it all perfectly integrated, I didn't find a full coherent description about this. I'll write down the high level of the knowledge I already have and I hope that someone could fix me where I'm wrong and complete the missing parts so the whole picture would be clear. My description starts with the userspace software and drills down to the hardware components. The misunderstood parts are in italic-bold

STM32L15x——ADC使用DMA数据只接收一次(已解决)

自作多情 提交于 2019-12-04 16:22:36
前提:我用的芯片是STM32L系列,可能对其它STM32系列不完全适用,仅供参考! 一、问题描述 我在使用DMA方式读取单ADC单通道采集的数据时,发现只能正确的采集一次数据,后来的就一直与第一次的相同。 配置DMA时,用于保存转换数据的16位变量的地址和ADC_DR寄存器的地址都没问题,DMA模式是DMA_Mode_Circular(循环模式),存储器地址自增也关闭了,一切我能查到的都配置好了,但是还是不行。 二、发现问题 按理说配置出问题应该先去查手册,但是无奈手册只有英文,我在网上找不到解决方案就只能硬着头皮看手册了,最后把STM32L151xx的参考手册ADC章节关于DMA的部分给翻译了一遍,才找到了问题的解决方案。 手册原文(P286): 翻译过来大体意思: 所以问题就出来,因为我只需要将每一个AD转换的值保存在一个16位的变量中,所以将DMA_BufferSize=1,这就导致我传输一次就结束了,而ADC_CR2的DDS位也没配置,默认是0,即传输完一次后就不会在接受新的DMA请求了。 三、解决问题 了解了原因所在后,解决方法就很简单了,你可以直接在ADC初始化的直接给ADC_CR2的DDS位置1,当然我也在标准库中找到了一个函数: ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); 其实内部也是对DDS位操作的

Allocating a large DMA buffer

你。 提交于 2019-12-04 07:21:58
I want to allocate a large DMA buffer, about 40 MB in size. When I use dma_alloc_coherent() , it fails and what I see is: ------------[ cut here ]------------ WARNING: at mm/page_alloc.c:2106 __alloc_pages_nodemask+0x1dc/0x788() Modules linked in: [<8004799c>] (unwind_backtrace+0x0/0xf8) from [<80078ae4>] (warn_slowpath_common+0x4c/0x64) [<80078ae4>] (warn_slowpath_common+0x4c/0x64) from [<80078b18>] (warn_slowpath_null+0x1c/0x24) [<80078b18>] (warn_slowpath_null+0x1c/0x24) from [<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788) [<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788) from [<8004a880>