硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4051|回复: 24
收起左侧

[DMA] 【深入探讨】DMA到底能不能起到加速程序执行的作用,DMA死等操作是否合理,多个DMA数据流同时刷是否处理过来

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-11-26 01:54:50 | 显示全部楼层 |阅读模式
我们这里主要以STM32平台为例进行说明。

一、DMA到底能不能起到加速的作用

初学的时候,很容易存在这样的认识,DMA直接从一个外设到另一个外设的数据传输,少了CPU的参与,直接硬件传输,应该可以做到更快。

我们这里用实验数据说话,争取有理有据,下面是STM32H7的DMA2D,DMA1,DMA2,MDMA和CPU复制粘贴的性能测试:
1、可以看到DMA1/DMA2的性能跟其它不是一个级别的,适合搞搞低速的外设。
2、DMA2D,MDMA和CPU复制粘贴的性能差不多。
3、CPU操作ITCM的数据粘贴性能最强的。



那么DMA到底能不能起到加速的作用?
1、如果相比CPU的复制粘贴来说,基本没什么加速作用。
2、如果从程序执行效果来看,可以起到明显加速效果,特别是MDMA和DMA2D,因为DMA刷新期间,CPU可以腾出手来干别的事情,这个才是DMA做的最大作用。
3、另外像DMA2D做它的本职工作,比如颜色格式转换等操作,有明显加速作用,这个比CPU要快。还有像H7的SDMMC带的IDMA和以太网带的DMA,这些是外设专属DMA,不需要CPU参与,从程序的执行效果上也能起到加速作用。

2、DMA死等操作是否合理

这个问题也谈的非常多,这里从DMA的两个方向讨论:

1、一类是直接在DMA中断里面处理消息,像H7自带的ADC,DAC,串口等。

这类应用我们可以直接在中断里面处理消息或者搞个双缓冲。

这种应用在RTOS下和裸机下使用都比较简单,这类应用不需要死等。

裸机下:
适合直接在中断里面处理,搞个外置标志效果不是很理想,不方便性能最大化。

RTOS下:
可以中断里面处理,也可以发送信号量等消息,通知任务里面处理,性能可以最大化。

2、还有一类就是图形加速DMA2D,QSPI Flash DMA,SDIO DMA等

这类DMA应用,我们一般都需要配合GUI,FAT文件系统等一起使用。

这种情况下,要分裸机和RTOS两种做分析,这类应用使用死等(可以加超时溢出)比较方便。

裸机情况下:
如果不做死等,而做个中断,做个变量标识什么的做等待,应用层代码基本没有办法写了,比如一个简单的GUI桌面背景部分重绘,需要进入DMA2D加速接口函数等待中断标志完成,应用层代码实现非常麻烦。

RTOS下:
这种情况下,在RTOS下里才能发挥威力,以GUI为例,我们都是直接将其丢到最低优先级任务里面跑。文件系统类的QSPI Flash,SD卡,eMMC,NAND等,也可以直接丢到低优先级任务,或者其他稍高优先级任务,完全不影响其他高优先级任务运行。
其实这也是使用RTOS相比裸机的一个重要优势。
3、多个DMA数据流同时刷是否处理过来:

先来看下通用DMA框图 :

F1系列


F4系列



H7系列


基本上都是一个多路选择器(优先级仲裁)选通那一路外设使用DMA,即同一个DMA,同一时刻只能处理1个DMA请求。

尽管如此,DMA的带宽处理多个简单的外设像DAC, ADC,  串口,I2C,SPI之类的还是无压力的,通用DMA1, DMA2的性能基本在60-70MB/S,同时处理8路串口DMA不定长收发还是无压力的。

但是一些时间控制类的应用很容易爆DMA性能极限,比如DAC1, DAC2,ADC1,ADC2,ADC3都开DMA,都开定时器触发,如果触发速度开的太高,很容易出现采集的波形异常,或者停止工作的问题。

这种情况,可以考虑分配DMA1和DMA2都开启,分别处理一些DMA请求。




评分

参与人数 1金币 +1 收起 理由
emwin + 1 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-26 02:37:28 | 显示全部楼层
更新完毕。
回复

使用道具 举报

2

主题

61

回帖

67

积分

初级会员

积分
67
发表于 2021-11-26 07:52:13 | 显示全部楼层
我们都开始上班了,硬汉哥是不是才开始休息啊
回复

使用道具 举报

2

主题

61

回帖

67

积分

初级会员

积分
67
发表于 2021-11-26 07:54:07 | 显示全部楼层
测试 都是开了 CACHE的吗 ?
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-11-26 08:38:50 | 显示全部楼层
不能加速,绕过CPU,DMA让外设工作在了满速。
http://www.armbbs.cn/forum.php?m ... d=102152&extra=
这个是我测试SPI+DMA 操作W25Q64的结果。
SPI1时钟45MHz,使用DMA操作可以达到这个速度但不能超过这个速度。
而不适用DMA,每发送一个数据CPU需要一直查询寄存器获取状态,然后操作读写
浪费了大量时间。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-26 09:23:06 | 显示全部楼层
heluo1985 发表于 2021-11-26 07:54
测试 都是开了 CACHE的吗 ?

这个有例子:V7-038_MDMA,DMA2D和通用DMA性能比较
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-26 09:31:41 | 显示全部楼层
旮旯旭 发表于 2021-11-26 08:38
不能加速,绕过CPU,DMA让外设工作在了满速。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=102152 ...

谢谢分享。

查询的多字节方式也有个加速方法,之前FlashFS文件系统的底层搞的。媲美DMA的多字节批量读取。

加快SPI连续读写速度的配置方式
http://www.armbbs.cn/forum.php?mod=viewthread&tid=91095
回复

使用道具 举报

3

主题

52

回帖

61

积分

初级会员

积分
61
发表于 2021-11-26 10:01:12 | 显示全部楼层
精华 实在是太棒的资料了
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2021-11-26 11:01:45 | 显示全部楼层
总线矩阵的框图补上,效果更好。
代码不规范,亲人两行泪!
回复

使用道具 举报

5

主题

164

回帖

179

积分

初级会员

积分
179
发表于 2021-11-26 11:18:30 | 显示全部楼层
我来说说我的理解,stm32的dma需要等待上一个请求的数据量全部传完了才会响应下一个请求,响应新请求的时候又会根据优先级来响应
如果请求的数据量太大,高优先级请求太频繁,然后dma速度又不够的话就会导致较低优先级的其他通道无法及时响应甚至被阻塞
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-26 11:49:10 | 显示全部楼层
DX3906 发表于 2021-11-26 11:18
我来说说我的理解,stm32的dma需要等待上一个请求的数据量全部传完了才会响应下一个请求,响应新请求的 ...

是这样的,就跟RTOS多任务一样,高优先级任务一直霸占,低优先级持续得不到执行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-26 12:03:04 | 显示全部楼层
missfox 发表于 2021-11-26 11:01
总线矩阵的框图补上,效果更好。

是的,加上更好,方便对比查看
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2021-11-27 09:36:12 | 显示全部楼层
mark。正在使用dma。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2021-11-27 10:45:21 | 显示全部楼层
DX3906 发表于 2021-11-26 11:18
我来说说我的理解,stm32的dma需要等待上一个请求的数据量全部传完了才会响应下一个请求,响应新请求的 ...

经过测试,芯片stm32H743
(1)DMA1的不同数据流,确实是高优先级的数据流需要传输完成全部数据后,才会传输低优先级数据流。
(2)DMA1和2,数据是交替发送的。
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2021-11-27 11:24:06 | 显示全部楼层
eric2013 发表于 2021-11-26 12:03
是的,加上更好,方便对比查看

V7-038_MDMA,DMA2D和通用DMA性能比较

里面没有CPU的测试,我自己简单测试了
代码不规范,亲人两行泪!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-27 11:37:12 | 显示全部楼层
what 发表于 2021-11-27 10:45
经过测试,芯片stm32H743
(1)DMA1的不同数据流,确实是高优先级的数据流需要传输完成全部数据后,才会 ...
确实是高优先级的数据流需要传输完成全部数据后


这个解释为一次DMA请求的数据全部传输完毕更好。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-11-27 11:37:23 | 显示全部楼层
missfox 发表于 2021-11-27 11:24
V7-038_MDMA,DMA2D和通用DMA性能比较

里面没有CPU的测试,我自己简单测试了

对,可以加上。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2021-12-4 20:41:49 | 显示全部楼层
DX3906 发表于 2021-11-26 11:18
我来说说我的理解,stm32的dma需要等待上一个请求的数据量全部传完了才会响应下一个请求,响应新请求的 ...

对于串口也是这样吗?一个DMA对应多个串口,先等其中一个串口完全传输完毕后才会响应另外一个串口的接收吗?
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2021-12-4 20:42:46 | 显示全部楼层
what 发表于 2021-11-27 10:45
经过测试,芯片stm32H743
(1)DMA1的不同数据流,确实是高优先级的数据流需要传输完成全部数据后,才会 ...

请问测试的案例可以分析下吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-12-6 14:41:23 | 显示全部楼层
weboser 发表于 2021-12-4 20:42
请问测试的案例可以分析下吗?

下载例子:V7-038_MDMA,DMA2D和通用DMA性能比较 测就行。
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2021-12-8 11:30:16 | 显示全部楼层
DMA低优先级在进行传输时,如果有高优先级的请求,那么高优先级会抢占低优先级还是等低优先级传输完成后再进行?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-12-9 09:23:29 | 显示全部楼层
fswyt 发表于 2021-12-8 11:30
DMA低优先级在进行传输时,如果有高优先级的请求,那么高优先级会抢占低优先级还是等低优先级传输完成后再 ...

传输完成后。
回复

使用道具 举报

5

主题

164

回帖

179

积分

初级会员

积分
179
发表于 2021-12-28 14:55:11 | 显示全部楼层
weboser 发表于 2021-12-4 20:41
对于串口也是这样吗?一个DMA对应多个串口,先等其中一个串口完全传输完毕后才会响应另外一个串口的接收 ...

应该也不一定,看具体怎么用吧,可以手动结束传输的
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-2-17 12:04:08 | 显示全部楼层
eric2013 发表于 2021-11-27 11:37
这个解释为一次DMA请求的数据全部传输完毕更好。

硬汉老师,针对这里再追问一下。案例是,DMA1同时传输到两路串口Stream1 -> USART1,Stream2 -> USART2,优先级Stream1 > Stream2。“一次DMA请求的数据全部传输完毕”是指DMA1_CNDTR1寄存器为0,还是指DMA已经搬运一个数据到USART_TDR, DMA_CNDTR1 不为0但 USART1 -> TXE 非空,此时DMA1结束本次传输直到USART1->TXE为空,再次发起外设请求。
暂时没想到验证思路,希望能指教一下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-2-18 01:38:20 | 显示全部楼层
Aliang 发表于 2023-2-17 12:04
硬汉老师,针对这里再追问一下。案例是,DMA1同时传输到两路串口Stream1 -> USART1,Stream2 -> USART2, ...

正常的执行思路应该是只要DMA没有UART数据传输,有空闲,就会执行低优先级的DMA传输。

后面你实际测试下,正常的DMA就应该这么执行。一个最简单的案例就是我制作的三个adc+三个定时器通道触发+三个DMA流传输做的快速交替采样。

所以回到你的这个问题,只要你的其中一个高优先级的DMA传输有空闲,另一个低优先级DMA请求就会得到执行。这样才能DMA带宽最大话
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 07:52 , Processed in 0.236778 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表