繁体   English   中英

FreeRTOS堆(Zynq 700设备)放置在DDR的哪个内存区域中?

[英]In what memory region of the DDR is the FreeRTOS heap placed (Zynq 700 device)?

我努力理解FreeRTOS中的内存管理概念,如果有人可以确认我对事情的理解,我将不胜感激。

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

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

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

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

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

您不必知道细节,例如哪些内存块是空闲的,哪些已经分配给其他任务...等等。 取决于FreeRTOS项目中选择的堆实现,可用的内存块是在heap_x.c内部管理的, 请参见FreeRTOS中的不同堆实现。

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

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

如果使用heap_1,heap_2,heap_4(推荐)或heap_5,则堆实际上是一个静态分配的数组,这意味着它将进入.bss节,然后进入哪个内存取决于链接描述文件放置.bss的位置。 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM