dma

Is DMA synchronous in network card drivers?

浪尽此生 提交于 2020-01-03 05:58:09
问题 My understanding is that when a NIC adapter receives new packets, the top half handler uses DMA to copy data from the RX buffer to the main memory. I think this handler should not exit or release the INT pin before the transmission is completed, otherwise new packets would corrupt the old ones. However, DMA is generally considered asynchronous and itself requires the interrupt mechanism to notify the CPU that data transmission is done. Thus my question, is DMA actually synchronous here, or

What is DMA mapping and DMA engine in context of linux kernel?

余生颓废 提交于 2020-01-01 05:11:11
问题 What is DMA mapping and DMA engine in context of linux kernel? When DMA mapping API and DMA engine API can be used in Linux Device Driver? Any real Linux Device Driver example as a reference would be great. 回答1: What is DMA mapping and DMA engine in context of linux kernel? The kernel normally uses virtual address. Functions like kmalloc() , vmalloc() normally return virtual address. It can be stored in void* . Virtual memory system converts these addresses to physical addresses. These

STM32F10XX DMA学习

耗尽温柔 提交于 2019-12-31 17:56:30
DMA(Direct Memory Access)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬件子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道 CPU。 DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。传输过程中, CPU 是闲置的,数据的高速传输不需要用到 CPU,节省了 CPU 的资源来做其他的操作。 在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在存储器与外设直接转移,或是从外设 A 转移到外设 B。在不使用DMA 情况下, 内核通过 DCode 经过总线矩阵协调,使用 AHB 把外设 ADC 采集的数据读取到内核,然后内核 Dcode 再通过总线矩阵协调,把数据存放到内存 SRAM中 。而 DMA 就可以取代这样的工作, 由 DMA 控制器的 DMA 总线与总线矩阵协调,使用 AHB 把外设 ADC 的数据经由 DMA 通道存放到内存 SRAM。 使用 DMA为多通道采集、采样频率高、连续输出数据的 AD 采集提供了更高效的方法。 这里的外设一般是指外设的数据寄存器,比如 ADC、 SPI、 I2C 等外设的数据 寄存器。 仲裁器, 一个 DMA 控制器对应 8 个数据流,数据流包含要传输数据的源地址、目标地址、数据等信息。如果我们需要同时使用同一个 DMA 控制器多个外设请求时

STM32CbueMX之I2C HAL_ERROR 和 DMA 不启动

有些话、适合烂在心里 提交于 2019-12-31 13:44:45
如果是使用STM32CbueMX生成 I2C 的代码,使用 I2C 读写 过程会出现HAL_ERROR。 这个时候一般有两种选择, 方式一:是选择IO模拟I2C; 方式二:是排查代码问题解决硬件I2C。 使用DMA的时候有时候DMA启动失败,往往这是时候我们就方式使用DMA了,转而使用更低效率的方式发接数据。 方式一:问度娘。 方式二: 像这种情况,很多人说ST的I2C有bug,可能由于专利问题。但是我觉得吧,那么多人在用ST的MCU,怎么可能会。 原因就是初始化流程的问题。 首先要想到的是看ST的官方源码是怎么使用硬件I2C的,和STM32CbueMX生成的代码比对一下。 下面是STM32CbueMX生成的I2C初始化代码 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); MX_DMA_Init(); while (1) { } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init

How do data caches route the object in this example?

限于喜欢 提交于 2019-12-31 00:58:10
问题 Consider the diagrammed data cache architecture. (ASCII art follows.) -------------------------------------- | CPU core A | CPU core B | | |------------|------------| Devices | | Cache A1 | Cache B1 | with DMA | |-------------------------| | | Cache 2 | | |------------------------------------| | RAM | -------------------------------------- Suppose that an object is shadowed on a dirty line of Cache A1, an older version of the same object is shadowed on a clean line of Cache 2, and the newest

设备驱动模型-device、driver、bus(2/2)

吃可爱长大的小学妹 提交于 2019-12-30 01:22:42
目录 一. device设备描述 1.1 内核结构 1.1.1 设备 struct device 1.1.2 设备属性 struct device_attribute 1.2 相关操作接口 1.2.1 设备操作接口 1.2.2 设备属性操作接口 二. driver设备驱动描述 2.1 内核结构 2.1.1 struct device_driver驱动数据结构 2.1.2 struct driver_attribute 设备属性 2.2 相关操作接口 2.2.1 驱动操作接口 2.2.2 驱动属性操作接口 三. 设备、驱动配对之bus总线---实例 3.1 device实例 3.2 driver实例 3.3 bus实例 一. device设备描述 1.1 内核结构 1.1.1 设备 struct device struct device { struct device *parent; /*设备私有数据*/ struct device_private *p; struct kobject kobj; /*设备名*/ const char *init_name; /* initial name of the device */ /*设备类型*/ const struct device_type *type; struct mutex mutex; /* mutex to

Linux内核device结构体分析

☆樱花仙子☆ 提交于 2019-12-28 17:51:05
1、前言 Linux内核中的设备驱动模型,是建立在sysfs设备文件系统和kobject上的,由总线(bus)、设备(device)、驱动(driver)和类(class)所组成的关系结构,在底层,Linux系统中的每个设备都有一个device结构体的实例,本文将对Linux内核的device结构体以及相关结构进行简要分析。 2、device结构体 在Linux内核源码中,struct device结构体的定义在include/linux/device.h中,实现的主要方法在drivers/base/core.c文件中,device结构体的定义如下所示: struct device { struct device *parent; struct device_private *p; struct kobject kobj; const char *init_name; /* initial name of the device */ const struct device_type *type; struct mutex mutex; /* mutex to synchronize calls to * its driver. */ struct bus_type *bus; /* type of bus device is on */ struct device_driver

vxworks下gmac调试的总结

こ雲淡風輕ζ 提交于 2019-12-25 05:28:21
1:3280芯片手册详解过程: MAC 控制器支持 DMA 接收和发送,内部在接收和发送方向各有一个 2048 字节的 FIFO作为缓存。由于 FIFO 深度所限,MAC 控制器不支持硬件自动流控机制。 模式和带宽的切换 1:在做 MII 和 RMII 之间的切换前,应该先掉电 2:上电后软件重新配置芯片系统控制模块中MAC 的工作接口模式寄存器,之后再启动 MAC 控制器 3:需要注意的是,在收发功能开启的状态下不能对双工模式或速率进行改变(先关掉Mac收发,这样可以避免出现大量的错包的情况) 1:所有的发送中断和接收中断触发的条件都是dma操作完成(dma完成数据搬运的操作); 2:较早发送和接收中断说明数据帧较大不是一个buffer发送; 芯片的寄存器空间: MAC 模块支持以太网 PHY 的 MII 接口和 RMII 接口。 CSR(Control & Status 寄存器)共占有 8KB 地址空间,分为两段:DMA CSR 和 MAC CSR。 AHB Master 接口为 DMA 模块与系统主机的接口。 APB 接口即 CSR 接口,用于读写访问 DMA CSR 和 MAC CSR。 DMA 模块有独立的发送和接收引擎,进行系统内存与 MAC 间的数据搬运,将 CPU 的 干预最小化,只在帧发送或接收结束以及其他一些条件(如发生错误)下中断 CPU。 DMA

异步和多线程有什么区别

余生颓废 提交于 2019-12-24 10:51:55
一、异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法。异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自顾自的处理它自己的事儿,不用干等着这个耗时操作返回。.Net中的这种异步编程模型,就简化了多线程编程,我们甚至都不用去关心Thread类,就可以做一个异步操作出来。 二、随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想探讨一下如何使用并发来最大化程序的性能。    多线程和异步操作的异同   多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。    异步操作的本质   所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直 接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开

PCI总线 DMA burst 基本概念

拥有回忆 提交于 2019-12-24 06:39:35
转载地址: http://blog.csdn.net/sunjiajiang/article/details/7945057 DMA和burst不是一个概念。 DMA传送不经过CPU的控制,假如硬盘的数据不能经过DMA控制器读到内存,那么每完成一次将硬盘的数据读出来,再存放到内存的操作,都要通过CPU运行几条读写指令来完成,这时CPU就做不了别的事了,如果有DMA控制器,则这个过程不需要CPU的参与,只需要占用总线就可以了。CPU还可以去完成别的运算。 Burst操作还是要通过CPU的参与的,与单独的一次读写操作相比,burst只需要提供一个其实地址就行了,以后的地址依次加1,而非burst操作每次都要给出地址,以及需要中间的一些应答、等待状态等等。如果是对地址连续的读取,burst效率高得多,但如果地址是跳跃的,则无法采用burst操作 一般芯片的dma有基本功能。 1、普通的内存、外设间互传数据,一次性的。 PCI设备DMA控制器,设置好后DMA 控制器的寄存器,PCI设备就会通过PCI总线向其他设备发送信号。 2、支持链表的,美其名曰“scatter”,内核有struct scatter可以参考。 说一下注意点: dma有burst、burst size、transfer的概念: burst: dma实际上是一次一次的申请总线,把要传的数据总量分成一个一个小的数据块