【问题标题】:In what memory region of the DDR is the FreeRTOS heap placed (Zynq 700 device)?FreeRTOS 堆放置在 DDR 的哪个内存区域(Zynq 700 器件)?
【发布时间】:2019-11-23 09:29:01
【问题描述】:

我正在努力理解 FreeRTOS 中的内存管理概念,如果有人能证实我对事物的理解,我将不胜感激

我有一个 Zynq 7000 设备,我在 SoC 的 FPGA 端实现了一些自定义逻辑和 AXI DMA 控制器。该逻辑本质上会生成一些数据样本,然后将其写入 DDR 存储器。在处理器方面,我设置了 FreeRTOS (v10),它必须将数据写入 DDR 并对此进行一些处理。

现在,使用 AXI DMA 意味着我必须在 DDR 中为可写入样本的 DMA 控制器指定一些内存区域。在我的裸机应用程序中,这相对容易,因为我基本上可以在 DDR 中指定系统未保留的任何区域(我可以从内存映射中看到)。关于 FreeRTOS,这并不容易,因为很明显,FreeRTOS 已经为它的堆保留了部分内存,我不知道哪些内存区域可以免费使用,哪些不是。

那么我怎么知道哪些内存区域仍未分配并且可以免费使用?或者我可以(并且应该)使用 pvPortMalloc() 首先分配一些内存,然后用于我的 DMA 事务?在我的应用程序代码中使用 pvPortMalloc() 是否安全?另外,pvPortMalloc() 函数是从 FreeRTOS 堆中还是从 DDR 上的整个可用内存中分配内存?

【问题讨论】:

    标签: memory heap-memory freertos zynq


    【解决方案1】:

    那么我怎么知道哪些内存区域仍然未分配并且可以免费使用?或者我可以(并且应该)使用 pvPortMalloc() 首先分配一些内存,然后用于我的 DMA 事务?在我的应用程序代码中使用 pvPortMalloc() 是否安全?

    是的,与裸机应用程序不同,在 FreeRTOS 中,您可以通过简单地调用 pvPortMalloc(bytesize) 来分配内存空间,然后传递 返回的非 NULL 指针分配空间的大小字节 到您的 DMA 控制器。另外请重新检查 DMA 控制器不会写入超出分配的空间(因为这可能会破坏空闲内存块管理的内部数据结构)。

    您不必知道细节,例如哪些内存块是空闲的,哪些已经分配给其他任务……等等。取决于您在 FreeRTOS 项目中选择的堆实现,空闲内存块在 heap_x.c see different heap implementations in FreeRTOS 内部进行管理

    另外,pvPortMalloc() 函数是从 FreeRTOS 堆中还是从 DDR 上的整个可用内存中分配内存?

    pvPortMalloc() 仅在 FreeRTOS 堆中分配空间,其大小由定义参数configTOTAL_HEAP_SIZE 确定。

    【讨论】:

      【解决方案2】:

      如果您使用heap_1, heap_2, heap_4 (recommended), or heap_5,那么堆实际上是一个静态分配的数组,这意味着它会进入 .bss 部分 - 然后它会进入哪个内存取决于您的链接描述文件放置 .bss 的位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-25
        • 2020-12-30
        • 2013-09-09
        • 2018-02-17
        • 2020-04-22
        • 2016-06-29
        • 2015-09-07
        • 2016-11-06
        相关资源
        最近更新 更多