首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DMA传输比CPU传输花费更多的时间

DMA传输比CPU传输花费更多的时间
EN

Stack Overflow用户
提问于 2019-05-14 04:14:17
回答 3查看 1.6K关注 0票数 5

我们的任务旨在演示使用DMA复制大量数据的好处,而不是依赖处理器直接处理复制。处理器是ST发现板上的STM32F407。

为了测量复制时间,在复制过程中必须打开GPIO引脚,复制后必须关闭。

代码看起来很有功能,但目前它显示的是2.15ms完成的CPU和4.5ms的DMA,这与预期的情况正好相反。我不确定是否仅仅没有足够的数据来提高DMA的速度来抵消设置它的开销吗?

我尝试过使用CPU复制数组的元素,也使用memcpy函数,这似乎产生了非常相似的时间。

函数代码如下所示:

代码语言:javascript
运行
复制
DMASpeed(void)
{
    #define elementNum 32000
    int *ptr = NULL;
    ptr = (int*)malloc(elementNum * sizeof(int));
    int *ptr2 = NULL;
    ptr2 = (int*)malloc(elementNum * sizeof(int));
    for (int i = 0; i < elementNum; i++)
    {
        ptr[i] = 4;
    }
    LD5_GPIO_Port->BSRR = (uint32_t)LD5_Pin << 16U;
    LD6_GPIO_Port->BSRR = (uint32_t)LD6_Pin << 16U;
    // Initial value
    // printf("BEFORE: dst = '%s'\n", dst);

    // Transfer
    printf("Initiate DMA Transfer...\n");
    HAL_DMA_Start(&hdma_memtomem_dma2_stream0, (int)ptr, (int)ptr2, (elementNum * sizeof(int)));
    LD5_GPIO_Port->BSRR = LD5_Pin;
    printf("DMA Transfer initiated.\n");


    // Poll for DMA completion
    printf("Poll for DMA completion.\n");
    HAL_DMA_PollForTransfer(&hdma_memtomem_dma2_stream0,
        HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
    LD5_GPIO_Port->BSRR = (uint32_t)LD5_Pin << 16U;
    printf("DMA complete.\n");

    // Print result
    // printf("AFTER: dst = '%s'\n", dst);
    free(ptr);
    free(ptr2);

    ptr = (int*)malloc(elementNum * sizeof(int));
    ptr2 = (int*)malloc(elementNum * sizeof(int));
    for (int i = 0; i < elementNum; i++)
    {
        ptr[i] = i;
    }

    printf("Initiate CPU Transfer...\n");
    LD6_GPIO_Port->BSRR = LD6_Pin;
    //  for (int i = 0; i<512; i++)
    //  {
    //  ptr2[i] = ptr[i];
    //  }
    memcpy(ptr2, ptr, (elementNum * sizeof(int)));
    printf("CPU Transfer Complete.\n");
    LD6_GPIO_Port->BSRR = (uint32_t)LD6_Pin << 16U;

    free(ptr);
    free(ptr2);
}

预先感谢您的帮助

EN

回答 3

Stack Overflow用户

发布于 2019-05-14 05:37:49

你试图证明一些不真实的东西。DMA内存到内存的传输总是比直接CPU慢。DMA不打算比CPU更快。它在后台提供不需要CPU活动的传输w。核心始终优先于DMA。

MEM到MEM传输将是总是比CPU慢。

还有另一个问题。许多STM设备具有DMA无法访问的内存区域(例如CCMRAM)。

票数 10
EN

Stack Overflow用户

发布于 2019-05-14 04:22:33

在下面的代码段中删除printf

代码语言:javascript
运行
复制
LD5_GPIO_Port->BSRR = LD5_Pin;
printf("DMA Transfer initiated.\n");  // <--Remove this


// Poll for DMA completion
printf("Poll for DMA completion.\n"); // <--Remove this

您打开引脚,然后打印大文本,它是加在您的总时间计算。

移除所有的printf或至少不要在针键之间打印任何东西。

编辑

准确地说,您正在打印50字符( DMA传输)和23字符( CPU传输)。

票数 5
EN

Stack Overflow用户

发布于 2020-10-28 10:02:41

对于那些人,谁谷歌的“如何加快DMA内存到内存的传输?”这里有一个建议:强制编译器分配所有HAL代码,与DMA传输到RAM有关,最好是只与Core耦合的RAM。您的编译器将生成函数代码,这些代码将在启动时复制到特定的RAM中,然后所有这些函数都将从RAM中调用并因此而加快速度。然而,“手工”复制也是如此。在这种情况下,建议将下列文件/函数分配给RAM:

  • stm32whatever_hal_dma.c
  • DMAN_StreamM_IRQHandler(),其中N和M分别是用于传输的DMA和流的数字。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56122923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档