dma

How will circular DMA periph to memory behave at the end of the transfer in STM32?

江枫思渺然 提交于 2021-02-07 04:14:30
问题 I wanted to ask, how will behave DMA SPI rx in STM32 in following situation. I have a specified (for example) 96 Bytes array called A which is intended to store the data received from the SPI. I turn on my circular SPI DMA which operates on each Byte, is configured to 96 Byte. Is it possible, when DMA will fill my 96 Bytes array, the Transfer Complete interrupt will went off, to quickly copy the 96 Byte array to another - B, before circular DMA will start writing to A(and destroy the data

How will circular DMA periph to memory behave at the end of the transfer in STM32?

ⅰ亾dé卋堺 提交于 2021-02-07 04:08:23
问题 I wanted to ask, how will behave DMA SPI rx in STM32 in following situation. I have a specified (for example) 96 Bytes array called A which is intended to store the data received from the SPI. I turn on my circular SPI DMA which operates on each Byte, is configured to 96 Byte. Is it possible, when DMA will fill my 96 Bytes array, the Transfer Complete interrupt will went off, to quickly copy the 96 Byte array to another - B, before circular DMA will start writing to A(and destroy the data

Linux 内核DMA机制

£可爱£侵袭症+ 提交于 2021-01-03 07:33:01
1 2 DMA控制器硬件结构 2.1 DMA通道使用的地址 2.2 DMA操作函数 2.3 DMA映射 2.3.1 (1)建立一致 DMA 映射 2.3.2 (2)建立流式 DMA 映射 2.3.3 (3)分散/集中映射 2.4 DMA池 2.5 一个简单的使用DMA 例子 DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 在第一种情况下,调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。 (2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。 (3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。 第二种情形是在 DMA 被异步使用时发生的。以数据采集设备为例: (1)硬件发出中断来通知新的数据已经到达。 (2)中断处理程序分配一个DMA缓冲区。 (3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。 (4)处理程序利用DMA分发新的数据,唤醒任何相关进程。 网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中

Linux之DMA API -- 通用设备的动态DMA映射

筅森魡賤 提交于 2020-12-31 11:06:11
通用设备的动态DMA映射 by JHJ(jianghuijun211@gmail.com) 本文描述DMA API。更详细的介绍请参看Documentation/DMA-API-HOWTO.txt。 API分为两部分,第一部分描述API,第二部分描述可以支持非一致性内存机器的扩展API。你应该使用第一部分所描述的API,除非你知道你的驱动必须要支持非一致性平台。 第一部分 DMA API 为了可以引用DMA API,你必须 #include <linux/dma-mapping.h> 1-1 使用大块DMA一致性缓冲区(dma-coherent buffers) void * dma_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) 一致性内存:设备对一块内存进行写操作,处理器可以立即进行读操作,而无需担心处理器高速缓存(cache)的影响。同样的,处理器对一块内存进行些操作,设备可以立即进行读操作。(在告诉设备读内存时,你可能需要确定刷新处理器的写缓存。) 此函数申请一段大小为size字节的一致性内存,返回两个参数。一个是dma_handle,它可以用作这段内存的物理地址。 另一个是指向被分配内存的指针(处理器的虚拟地址)。 注意:由于在某些平台上

How does Linux kernel flush_write_buffers() work on x86?

我的梦境 提交于 2020-06-27 10:57:47
问题 The following code is from include/asm-i386/io.h , and it is invoked from dma_map_single() . My understanding is that flush_write_buffers() is supposed to flush CPU memory cache before mapping the memory for DMA. But how does this assembly code flush CPU cache? static inline void flush_write_buffers(void) { __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory"); } 回答1: The Intel Pentium Pro processors had a bug wherein a store to a memory location of type UC may be reordered with

How DMA Controller handles the Input devices like say Serial port

烂漫一生 提交于 2020-06-17 12:58:18
问题 So, what I have learned so far is that CPU programs the source address, dest address, word count and the direction to the DMA controller whenever it needs to transfer the data from say a harddrive. But in this example, the hard drive is just a dumb device, so it makes sense because harddrive can never initiate a data transfer. But, what if we have connected the serial port where in certain instances we are going to get 8 bits of data. I know the DMA controller is used for large memory

STM32串口如何代码实现更高效的接收消息

半世苍凉 提交于 2020-04-09 20:23:41
这段时间一直在研究多旋翼飞行器,以及其它的事情,博客好外没更新,再不坚持怕真荒废了哦。 在上篇简单实现MAVLink协议的解析,并演示按照设计好的命令执行对应的事件处理,以及又加入 CRC校验,实现更稳定的通信,但在上文结束时也提到当对一个包进行解析及对应 事件 处理时,是不能接收新的数据,直到事件处理完成,Msg_Rev.Get 状态设置为 RECEIVING 后方能再接收新的数据。这时,当事件处理需要一定时间,而又有新的数据不断发送过来时,很容易造成数据丢失现象。 如何提高串口通信效率,并避免丢包现象了? 为提高效率,首先想到采用DMA方式,然而考虑下发现,接收的数据包是不固定的;并且即使采用DMA,若MAVLink接收缓存仍设计成只接收一条消息大小,丢包问题仍然还是会有滴。 这样就想 有没方法软件来实现,就相 到如果开辟一个缓存空间,不断接收的数据都放到那儿,而包的解析处理函数可从这里面依次取出一定数据,来作处理。这样只要设计比较合理,因软件阻塞造成的丢包现象就容易解决了。那么要设计一个怎样的缓存呢 ? 其实很容易想到队列(先进先出的特性),而为了更有效且合理的利用空间,又就会想到环形队列这种数据结构 。 首先是其数据结构设计,以及插入删除操作,不多说,如下代码: #define MAX_QUEUE_LEN (4096) // 4K #define RW_OK 0