硬汉嵌入式论坛

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

[DMA] STM32H7的MDMA,DMA2D和DMA性能测试出来了,DMA2D和MDMA有一拼,DMA1和2的性能太挫

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-6-13 16:56:46 | 显示全部楼层 |阅读模式
说明:
每个都测试了四种情况
(1)64位带宽的AXI SRAM内部做64KB数据传输。
(2)32位带宽的D2域SRAM1内部64KB数据传输。
(3)AXI SRAM向SDRAM传输64KB的数据传输。
(4)32位带宽的SDRAM内部做64KB数据传输。

MDMA:
在D1域,支持64位带宽的DMA数据传输。

DMA2D
在D1域,主要用图形2D加速。

DMA1和DMA2
在D2域,支持32位带宽的DMA数据传输。

V7-038_MDMA,DMA2D和通用DMA性能比较.rar (2.75MB)


image.png

可以看到DMA1的性能跟其它两个不是一个级别的,适合搞搞低速的外设。

DMA2D和MDMA互有高低。


评分

参与人数 1金币 +10 收起 理由
龙之谷 + 10 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-13 17:37:22 | 显示全部楼层
下面是MDMA的测试代码部分:
已经开启最大性能了



  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: MDMA_SpeedTest
  4. *        功能说明: MDMA性能测试
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MDMA_IRQHandler(void)
  10. {
  11.         HAL_MDMA_IRQHandler(&MDMA_Handle);
  12. }
  13. static void MDMA_TransferCompleteCallback(MDMA_HandleTypeDef *hmdma)
  14. {
  15.         TransferCompleteDetected = 1;
  16. }
  17. void MDMA_SpeedTest(void)
  18. {
  19.         /* MDMA配置 **********************************************************************/
  20.         __HAL_RCC_MDMA_CLK_ENABLE();  

  21.         MDMA_Handle.Instance = MDMA_Channel0;  

  22.         MDMA_Handle.Init.Request              = MDMA_REQUEST_SW;         /* 软件触发 */
  23.         MDMA_Handle.Init.TransferTriggerMode  = MDMA_BLOCK_TRANSFER;     /* 块传输 */
  24.         MDMA_Handle.Init.Priority             = MDMA_PRIORITY_HIGH;      /* 优先级高*/
  25.         MDMA_Handle.Init.Endianness           = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端 */
  26.         MDMA_Handle.Init.SourceInc            = MDMA_SRC_INC_DOUBLEWORD;         /* 源地址自增,双字,即8字节 */
  27.         MDMA_Handle.Init.DestinationInc       = MDMA_DEST_INC_DOUBLEWORD;        /* 目的地址自增,双字,即8字节 */
  28.         MDMA_Handle.Init.SourceDataSize       = MDMA_SRC_DATASIZE_DOUBLEWORD;    /* 源地址数据宽度双字,即8字节 */
  29.         MDMA_Handle.Init.DestDataSize         = MDMA_DEST_DATASIZE_DOUBLEWORD;   /* 目的地址数据宽度双字,即8字节 */
  30.         MDMA_Handle.Init.DataAlignment        = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */                    
  31.         MDMA_Handle.Init.SourceBurst          = MDMA_SOURCE_BURST_128BEATS;      /* 源数据突发传输,128次 */
  32.         MDMA_Handle.Init.DestBurst            = MDMA_DEST_BURST_128BEATS;        /* 源数据突发传输,128次 */
  33.         
  34.         MDMA_Handle.Init.BufferTransferLength = 128;    /* 每次传输128个字节 */

  35.         MDMA_Handle.Init.SourceBlockAddressOffset  = 0; /* 用于block传输,地址偏移0 */
  36.         MDMA_Handle.Init.DestBlockAddressOffset    = 0; /* 用于block传输,地址偏移0 */

  37.         /* 初始化MDMA */
  38.         if(HAL_MDMA_Init(&MDMA_Handle) != HAL_OK)
  39.         {
  40.                  Error_Handler(__FILE__, __LINE__);
  41.         }

  42.         /* 设置传输完成回调和中断及其优先级配置 */
  43.         HAL_MDMA_RegisterCallback(&MDMA_Handle, HAL_MDMA_XFER_CPLT_CB_ID, MDMA_TransferCompleteCallback);
  44.         HAL_NVIC_SetPriority(MDMA_IRQn, 0, 0);
  45.         HAL_NVIC_EnableIRQ(MDMA_IRQn);  

  46.     /* AXI SRAM的64KB数据传输测试 ***********************************************/
  47.         TransferCompleteDetected = 0;
  48.         HAL_MDMA_Start_IT(&MDMA_Handle,
  49.                                       (uint32_t)0x24000000,
  50.                                       (uint32_t)(0x24000000 + 64*1024),
  51.                                       64*1024,
  52.                                       1);


  53.         start = DWT_CYCCNT;
  54.         while(TransferCompleteDetected == 0) {}
  55.         end = DWT_CYCCNT;
  56.         cnt = end - start;

  57.         //64*1024/(cnt/400/1000/1000)/1024/1024 = 64*1000*1000*400/1024/cnt = 25000000/cnt
  58.         printf("MDMA---AXI SRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  59.                
  60.     /* D2域SRAM1的64KB数据传输测试 ***********************************************/
  61.         TransferCompleteDetected = 0;
  62.         HAL_MDMA_Start_IT(&MDMA_Handle,
  63.                                       (uint32_t)0x30000000,
  64.                                       (uint32_t)(0x30000000 + 64*1024),
  65.                                       64*1024,
  66.                                       1);

  67.         start = DWT_CYCCNT;
  68.         while(TransferCompleteDetected == 0) {}
  69.         end = DWT_CYCCNT;
  70.         cnt = end - start;

  71.         printf("MDMA---D2域SRAM1内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  72.                
  73.         /* AXI SRAM向SDRAM的64KB数据传输测试 ***********************************************/
  74.         TransferCompleteDetected = 0;
  75.         HAL_MDMA_Start_IT(&MDMA_Handle,
  76.                                       (uint32_t)0x24000000,
  77.                                       (uint32_t)0xC0000000,
  78.                                       64*1024,
  79.                                       1);

  80.         start = DWT_CYCCNT;
  81.         while(TransferCompleteDetected == 0) {}
  82.         end = DWT_CYCCNT;
  83.         cnt = end - start;

  84.         printf("MDMA---AXI SRAM传输64KB数据到SDRAM耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  85.                
  86.         /* SDRAM的64KB数据传输测试 ***********************************************/
  87.         TransferCompleteDetected = 0;
  88.         HAL_MDMA_Start_IT(&MDMA_Handle,
  89.                                       (uint32_t)0xC0000000,
  90.                                       (uint32_t)(0xC0000000 + 64*1024),
  91.                                       64*1024,
  92.                                       1);


  93.         start = DWT_CYCCNT;
  94.         while(TransferCompleteDetected == 0) {}
  95.         end = DWT_CYCCNT;
  96.         cnt = end - start;

  97.         printf("MDMA---SDRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  98. }
复制代码



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-13 17:38:17 | 显示全部楼层
下面是DMA2D的性能测试部分:

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: DMA2D_SpeedTest
  4. *        功能说明: DMA2D性能测试
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void DMA2D_SpeedTest(void)
  10. {
  11.         __HAL_RCC_DMA2D_CLK_ENABLE();  
  12.        
  13.         /* DMA2D采用存储器到存储器模式, 这种模式是前景层作为DMA2D输入 */  
  14.         DMA2D->CR      = 0x00000000UL;
  15.         DMA2D->FGOR    = 0;
  16.         DMA2D->OOR     = 0;
  17.        
  18.         /* 前景层和输出区域都采用的RGB565颜色格式 */
  19.         DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
  20.         DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_ARGB8888;
  21.        
  22.         DMA2D->NLR     = (uint32_t)(64 << 16) | (uint16_t)256;

  23.        
  24.     /* AXI SRAM的64KB数据传输测试 ***********************************************/
  25.         DMA2D->FGMAR = (uint32_t)0x24000000;
  26.         DMA2D->OMAR  = (uint32_t)(0x24000000 + 64*1024);
  27.         DMA2D->CR   |= DMA2D_CR_START;   
  28.        
  29.         start = DWT_CYCCNT;
  30.         /* 等待DMA2D传输完成 */
  31.         while (DMA2D->CR & DMA2D_CR_START) {}
  32.         end = DWT_CYCCNT;
  33.         cnt = end - start;
  34.        
  35.         printf("DMA2D---AXI SRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  36.                
  37.     /* D2域SRAM1的64KB数据传输测试 ***********************************************/
  38.         DMA2D->FGMAR = (uint32_t)0x30000000;
  39.         DMA2D->OMAR  = (uint32_t)(0x30000000 + 64*1024);
  40.         DMA2D->CR   |= DMA2D_CR_START;  
  41.        
  42.         start = DWT_CYCCNT;
  43.         /* 等待DMA2D传输完成 */
  44.         while (DMA2D->CR & DMA2D_CR_START) {}
  45.         end = DWT_CYCCNT;
  46.         cnt = end - start;
  47.                
  48.         printf("DMA2D---D2域SRAM1内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  49.                
  50.         /* AXI SRAM向SDRAM的64KB数据传输测试 ***********************************************/
  51.         DMA2D->FGMAR = (uint32_t)0x24000000;
  52.         DMA2D->OMAR  = (uint32_t)0xC0000000;
  53.         DMA2D->CR   |= DMA2D_CR_START;  
  54.        
  55.         start = DWT_CYCCNT;
  56.         /* 等待DMA2D传输完成 */
  57.         while (DMA2D->CR & DMA2D_CR_START) {}
  58.         end = DWT_CYCCNT;
  59.         cnt = end - start;
  60.                
  61.         printf("DMA2D---AXI SRAM传输64KB数据到SDRAM耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);       

  62.         /* SDRAM的64KB数据传输测试 ***********************************************/
  63.         DMA2D->FGMAR = (uint32_t)0xC0000000;
  64.         DMA2D->OMAR  = (uint32_t)(0xC0000000 + 64*1024);
  65.         DMA2D->CR   |= DMA2D_CR_START;
  66.        
  67.         start = DWT_CYCCNT;
  68.         /* 等待DMA2D传输完成 */
  69.         while (DMA2D->CR & DMA2D_CR_START) {}
  70.         end = DWT_CYCCNT;
  71.         cnt = end - start;       
  72.                
  73.         printf("DMA2D---SDRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);       
  74. }
复制代码





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-13 17:40:44 | 显示全部楼层
下面是DMA1的测试:


  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: DMA1_SpeedTest
  4. *        功能说明: DMA1性能测试
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void DMA1_Stream1_IRQHandler(void)
  10. {
  11.     HAL_DMA_IRQHandler(&DMA_Handle);
  12. }
  13. static void DMA_TransferCompleteCallback(DMA_HandleTypeDef *hdma)
  14. {
  15.         TransferCompleteDetected = 1;
  16. }
  17. void DMA1_SpeedTest(void)
  18. {
  19.         __HAL_RCC_DMA1_CLK_ENABLE();

  20.         DMA_Handle.Instance                 = DMA1_Stream1;
  21.         DMA_Handle.Init.Request             = DMA_REQUEST_MEM2MEM;  
  22.         DMA_Handle.Init.Direction           = DMA_MEMORY_TO_MEMORY;
  23.         DMA_Handle.Init.PeriphInc           = DMA_PINC_ENABLE;
  24.         DMA_Handle.Init.MemInc              = DMA_MINC_ENABLE;
  25.         DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  26.         DMA_Handle.Init.MemDataAlignment    = DMA_PDATAALIGN_WORD;
  27.         DMA_Handle.Init.Mode                = DMA_NORMAL;
  28.         DMA_Handle.Init.Priority            = DMA_PRIORITY_VERY_HIGH;
  29.         DMA_Handle.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
  30.         DMA_Handle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  31.         DMA_Handle.Init.MemBurst            = DMA_MBURST_INC4;     /*WORD方式,仅支持4次突发 */
  32.         DMA_Handle.Init.PeriphBurst         = DMA_PBURST_INC4;      /*WORD方式,仅支持4次突发 */
  33.         DMA_Handle.XferCpltCallback         = DMA_TransferCompleteCallback;

  34.         HAL_DMA_Init(&DMA_Handle);

  35.         HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
  36.         HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  37.        
  38.          /* AXI SRAM的64KB数据传输测试 ***********************************************/
  39.         TransferCompleteDetected = 0;
  40.         HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)0x24000000, (uint32_t)(0x24000000 + 64*1024), 64*256);

  41.         start = DWT_CYCCNT;
  42.         while(TransferCompleteDetected == 0) {}
  43.         end = DWT_CYCCNT;
  44.         cnt = end - start;

  45.         //64*1024/(cnt/400/1000/1000)/1024/1024 = 64*1000*1000*400/1024/cnt = 25000000/cnt
  46.         printf("DMA1---AXI SRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  47.                
  48.         /* D2域SRAM1的64KB数据传输测试 ***********************************************/
  49.         TransferCompleteDetected = 0;
  50.         HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)0x30000000, (uint32_t)(0x30000000 + 64*1024), 64*256);

  51.         start = DWT_CYCCNT;
  52.         while(TransferCompleteDetected == 0) {}
  53.         end = DWT_CYCCNT;
  54.         cnt = end - start;

  55.         printf("DMA1---D2域SRAM1内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  56.                
  57.                
  58.         /* AXI SRAM向SDRAM的64KB数据传输测试 ***********************************************/
  59.         TransferCompleteDetected = 0;
  60.         HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)0x24000000, (uint32_t)0xC0000000, 64*256);

  61.         start = DWT_CYCCNT;
  62.         while(TransferCompleteDetected == 0) {}
  63.         end = DWT_CYCCNT;
  64.         cnt = end - start;

  65.         printf("DMA1---AXI SRAM传输64KB数据到SDRAM耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  66.                
  67.         /* SDRAM的64KB数据传输测试 ***********************************************/
  68.         TransferCompleteDetected = 0;
  69.         HAL_DMA_Start_IT(&DMA_Handle, (uint32_t)0xC0000000, (uint32_t)0xC0000000, 64*256);       

  70.         start = DWT_CYCCNT;
  71.         while(TransferCompleteDetected == 0) {}
  72.         end = DWT_CYCCNT;
  73.         cnt = end - start;

  74.         printf("DMA1---SDRAM内部互传64KB数据耗时 =  %dus %dMB/S\r\n", cnt/400, 25000000/cnt);
  75. }
复制代码



回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-6-13 20:07:49 | 显示全部楼层
eric2013 发表于 2019-6-13 17:40
下面是DMA1的测试:

测试的这么详细啊,牛逼呀,辛苦辛苦了
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2019-6-13 21:08:24 | 显示全部楼层
其实还有一种情况:AXI SRAM向D2域的SRAM传输64KB数据,这种情况的性能可能比现在四种都高,当然MDMA_CxTCR的BWM bit最好置1,或许可以提高性能。希望大佬有时间测试下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-14 08:55:15 | 显示全部楼层
小志 发表于 2019-6-13 21:08
其实还有一种情况:AXI SRAM向D2域的SRAM传输64KB数据,这种情况的性能可能比现在四种都高,当然MDMA_CxTCR ...

好的,我这就测试下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-14 10:25:52 | 显示全部楼层
小志 发表于 2019-6-13 21:08
其实还有一种情况:AXI SRAM向D2域的SRAM传输64KB数据,这种情况的性能可能比现在四种都高,当然MDMA_CxTCR ...

测试了,AXI SRAM向D2的SRAM1发送,速度是536MB/S,没有AXI SRAM内部互传快。

MDMA_CxTCR的BWM bit我是这么修改的,测试没变化
QQ截图20190614102512.jpg
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-6-14 11:35:23 | 显示全部楼层
貌似猜中了
回复

使用道具 举报

61

主题

62

回帖

245

积分

高级会员

积分
245
发表于 2020-7-14 20:46:45 | 显示全部楼层
eric2013 发表于 2019-6-13 17:40
下面是DMA1的测试:

想问下: DMA2D好像只能访问D1域的AXI SRAM,访问D2域的SRAMx内存好像不行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-7-14 21:28:19 | 显示全部楼层
vzhaodan 发表于 2020-7-14 20:46
想问下: DMA2D好像只能访问D1域的AXI SRAM,访问D2域的SRAMx内存好像不行。

从你近期咨询的问题来看,你非常有必要看看我们的教程,跑跑我们的例子。

http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1


QQ截图20200714213005.jpg
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-7-14 22:09:01 | 显示全部楼层
硬汉大哥,老给力了!
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-4-1 10:37:33 | 显示全部楼层
感谢硬汉的分享,我在您的性能测试程序基础上稍作了改动,想测试一下MDMA把数据从DTCM搬运到AXI SRAM的实验,MDMA的配置如图所示 image.png ,在执行后出现了报错:HAL ERROR CODE是HAL_MDMA_ERROR_READ_XFER ----Read Transfer error,定位了2天没发现原因,想请您帮忙分析一(PS,如果把MDMA操作的源地址和目的地址对调一下,出现的是HAL_MDMA_ERROR_WRITE_XFER---Write Transfer error)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-4-2 00:04:52 | 显示全部楼层
heng_20220328 发表于 2022-4-1 10:37
感谢硬汉的分享,我在您的性能测试程序基础上稍作了改动,想测试一下MDMA把数据从DTCM搬运到AXI SRAM的实验 ...

这几个都修改为word就可以了。
image.png
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2022-4-2 13:06:47 | 显示全部楼层
eric2013 发表于 2022-4-2 00:04
这几个都修改为word就可以了。

感谢硬汉的回复,我基于这种设置得到的数据:DTCM --> AXI SRAM 传输的速度是285.3MB/S,AXI SRAM --> DTCM 传输的速度是32383.43MB/S,后者的速度比前者快了好多,感觉好奇怪
回复

使用道具 举报

2

主题

25

回帖

31

积分

新手上路

积分
31
发表于 2022-4-20 13:23:26 | 显示全部楼层
heng_20220328 发表于 2022-4-1 10:37
感谢硬汉的分享,我在您的性能测试程序基础上稍作了改动,想测试一下MDMA把数据从DTCM搬运到AXI SRAM的实验 ...

你这字体是啥啊,感觉还怪好看的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 16:15 , Processed in 0.348490 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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