[Burst]理解下DMA/NorFlash/DDR下的Burst是个什么概念

本文详细解释了突发传输(Burst)的概念及其与直接内存访问(DMA)的关系,并对比了burst操作与普通读写操作的区别。此外,还介绍了DMA控制器如何提高数据传输效率,减轻CPU负担,以及在芯片设计中如何配置burst、burstsize和transfersize等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://bbs.eetop.cn/thread-12436-1-1.html

Burst: 突发传输

DMA传送不经过CPU的控制,假如硬盘的数据不能经过DMA控制器读到内存,那么每完成一次将硬盘的数据读出来,再存放到内存的操作,都要通过CPU运行几条读写指令来完成,这时CPU就做不了别的事了,如果有DMA控制器,则这个过程不需要CPU的参与,只需要占用总线就可以了,CPU还可以去完成别的运算。

Burst操作还是要通过CPU的参与的,与单独的一次读写操作相比,burst只需要提供两个起始地址就行了,以后的地址依次加1,而非burst操作每次都要给出地址,以及需要中间的一些应答、等待状态等等。如果是对地址连续的读取,burst效率高得多,但如果地址是跳跃的,则无法采用burst操作

一般芯片的dma有基本功能。

  1. 普通的内存、外设间互传数据,一次性的。
  2. 支持链表的,美其名曰“scatter”,内核有struct scatter可以参考。

说一下注意点:

dma有burst、burst size、transfer的概念:

  • burst

dma实际上是一次一次的申请总线,把要传的数据总量分成一个一个小的数据块。比如要传64个字节,那么dma内部可能分为2次,一次传64/2=32个字节,这个2(a)次呢,就叫做burst。这个burst是可以设置的。这32个字节又可以分为32位 *8或者16位*16来传输。

  • transfer size

就是数据宽度,比如8位、32位,一般跟外设的FIFO相同。

  • burst size

就是一次传几个 transfer size.

配置数据宽度为32位。一次传8个32位=32个字节。

那么如果总长度为128字节,那么实际dma设置的长度为 128/32 = 4.

转载于:https://www.cnblogs.com/aaronLinux/p/9403705.html

### DDR3内存的Burst工作原理与定义 DDR3(Double Data Rate 3)内存是一种广泛应用于计算机系统中的动态随机存取存储器(DRAM),其核心特性之一是**Burst**(突发传输)机制。Burst是指在一次内存访问中,连续读取或写入多个数据单元的操作。这种机制旨在通过减少地址设置和命令发送的开销来提高数据传输效率。 #### Burst的定义 在DDR3内存中,Burst通常指的是在一个给定的地址范围内,连续地进行多个数据单元的读取或写入操作。每个Burst操作都由一个起始地址和一个预定义的Burst长度组成。Burst长度决定了每次突发操作中传输的数据单元数量。对于DDR3内存而言,常见的Burst长度为8个数据单元(BL=8)[^2]。 #### Burst的工作原理 1. **地址与命令发送**:首先,控制器向内存发送一个包含起始地址的读或写命令。这个地址指定了Burst操作的起点。 2. **数据传输**:一旦接收到命令,内存开始从指定的地址开始传输数据。在DDR3中,由于采用了双沿触发技术,数据可以在时钟信号的上升沿和下降沿都被采样,从而实现了更高的数据传输速率。 3. **自动地址递增**:在Burst操作期间,内存内部会自动递增地址,以指向下一个要传输的数据单元。这意味着不需要为每个数据单元单独发送地址,大大减少了地址总线的占用时间[^1]。 4. **数据完整性检查**:在整个Burst过程中,内存控制器可能会执行一些错误检测机制,例如奇偶校验或更复杂的ECC(Error Correction Code)校验,以确保数据的正确性。 5. **结束条件**:当达到预设的Burst长度后,本次Burst操作结束。如果需要继续传输更多数据,则需要发起新的Burst操作。 #### Burst的优势 - **提高带宽利用率**:通过一次性传输多个数据单元,减少了地址和命令的发送次数,从而提高了内存带宽的利用率。 - **降低功耗**:由于减少了地址和命令的发送次数,相应的功耗也会有所降低。 - **简化控制逻辑**:Burst操作简化了内存控制器的设计,因为它不需要频繁地处理地址和命令的切换。 #### Burst的应用场景 Burst操作特别适用于那些需要大量连续数据传输的应用场景,如视频处理、图像处理和大规模数据库查询等。在这种情况下,Burst能够显著提升系统的整体性能。 ```c // 示例代码:模拟DDR3内存的Burst读操作 #include <stdio.h> #include <stdlib.h> #define BURST_LENGTH 8 void ddr3_burst_read(int *memory, int start_address, int *output) { for (int i = 0; i < BURST_LENGTH; i++) { output[i] = memory[start_address + i]; } } int main() { // 假设有一个大小为1024的内存数组 int memory[1024]; for (int i = 0; i < 1024; i++) { memory[i] = i; // 初始化内存内容 } int output[BURST_LENGTH]; int start_address = 100; ddr3_burst_read(memory, start_address, output); // 打印读取的结果 for (int i = 0; i < BURST_LENGTH; i++) { printf("Data at address %d: %d\n", start_address + i, output[i]); } return 0; } ``` 上述代码示例展示了如何模拟DDR3内存的Burst读操作。在这个例子中,`ddr3_burst_read`函数接收一个内存数组、起始地址和输出缓冲区,并将从起始地址开始的8个数据单元复制到输出缓冲区中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值