我正在努力理解FreeRTOS中的内存管理概念,如果有人可以确认我对事物的理解,我将不胜感激
我有一个Zynq 7000器件,其中在SoC的FPGA端实现了一些自定义逻辑和AXI DMA控制器。此逻辑实质上会生成一些数据样本,然后将其写入DDR存储器。在处理器方面,我设置了FreeRTOS(v10),必须将写入DDR的数据并对此进行一些处理。
现在,使用AXI DMA意味着我必须在DDR中为DMA控制器指定一些内存区域,以便在其中写入样本。在我的裸机应用程序中,这相对容易些,因为我可以在DDR中指定系统未保留的任何区域(可以从内存映射中看到)。关于FreeRTOS,这并不是一件容易的事,因为FreeRTOS显然已经为其堆保留了部分内存,我不知道哪些内存区域可以自由使用,哪些不是。
那么我怎么知道哪些内存区域仍未分配并可以免费使用?或者我可以(也应该)使用 pvPortMalloc()首先分配一些内存,然后将其用于DMA事务? pvPortMalloc()是否可以在我的应用程序代码中安全使用?另外,pvPortMalloc()函数是否在FreeRTOS堆中或从DDR上的整个可用内存中分配我的内存?
答案 0 :(得分:0)
那么我怎么知道哪些内存区域仍未分配并可以免费使用?还是可以(并且应该)使用pvPortMalloc()首先分配一些内存,然后将其用于DMA事务?在我的应用程序代码中可以安全使用pvPortMalloc()吗?
是的,与裸机应用程序不同,在FreeRTOS中,您可以通过简单地调用pvPortMalloc(bytesize)
来分配内存空间,然后传递返回的非NULL指针和已分配大小字节空间。另外,请重新检查DMA控制器不会超出分配的空间进行写操作(因为这可能会破坏可用内存块管理的内部数据结构)。
您不必知道详细信息,例如哪些内存块是空闲的,哪些已经分配给其他任务...等等。取决于FreeRTOS项目中选择的堆实现,可用的内存块是在heap_x.c see different heap implementations in FreeRTOS
内部进行管理的此外,pvPortMalloc()函数是否在FreeRTOS堆中或从DDR上的整个可用内存中分配我的内存?
pvPortMalloc()
仅在FreeRTOS堆中分配空间,其大小由定义参数configTOTAL_HEAP_SIZE
确定。
答案 1 :(得分:0)
如果您使用heap_1, heap_2, heap_4 (recommended), or heap_5,则堆实际上是一个静态分配的数组,这意味着它进入.bss部分-然后进入哪个内存取决于链接描述文件放置在.bss中的位置。