我正在努力理解FreeRTOS中的内存管理概念,如果有人能证实我的理解,我将不胜感激
我有一台Zynq7000设备,其中我在SoC的FPGA端实现了一些自定义逻辑和AXI DMA控制器。此逻辑实质上是生成一些数据样本,然后将这些样本写入DDR内存。在处理器端,我设置了FreeRTOS (v10),它必须将数据写入DDR并对其进行一些处理。
现在,使用AXI DMA意味着我必须在DDR中为DMA控制器指定一些可以写入样本的内存区域。在我的裸机应用程序中,这是相对简单的,因为我基本上可以在DDR中指定系统未保留的任何区域(我可以从内存映射中看到)。关于FreeRTOS,这并不容易,因为很明显,FreeRTOS已经为它的堆保留了这部分内存,我不知道哪些内存区域是空闲的,哪些是不能使用的。
那么,我如何知道哪些内存区域仍未分配并可供使用呢?或者我可以(也应该)首先使用pvPortMalloc()来分配一些内存,然后用于我的DMA事务吗?在我的应用程序代码中使用pvPortMalloc()安全吗?另外,pvPortMalloc()函数是分配位于FreeRTOS堆中的内存,还是从DDR上的整个可用内存中分配内存?
发布于 2019-11-23 22:39:34
那么我如何知道哪些内存区域仍然是未分配和可用的呢?或者我可以(也应该)首先使用pvPortMalloc()来分配一些内存,然后用于我的DMA事务吗?在我的应用程序代码中使用pvPortMalloc()安全吗?
是的,与裸机应用程序不同,在FreeRTOS中,您可以通过简单地调用pvPortMalloc(bytesize)
来分配内存空间,然后将返回的非空指针和已分配空间的大小(以字节为单位)传递给控制器。另外,请重新检查DMA控制器是否不会写入超出分配的空间(因为这可能会破坏空闲内存块管理的内部数据结构)。
你不需要知道细节,比如哪些内存块是空闲的,哪些已经分配给了其他任务...etc。根据在FreeRTOS项目中选择的堆实现,可用内存块在heap_x.c see different heap implementations in FreeRTOS中进行内部管理
另外,pvPortMalloc()函数是分配位于FreeRTOS堆中的内存,还是从
上的全部可用内存中分配内存?
pvPortMalloc()
仅在FreeRTOS堆中分配空间,其大小由定义参数configTOTAL_HEAP_SIZE
决定。
发布于 2019-11-24 10:28:24
如果使用heap_1, heap_2, heap_4 (recommended), or heap_5,那么堆实际上是一个静态分配的数组,这意味着它进入.bss部分-然后进入哪个内存取决于链接器脚本放置.bss的位置。
https://stackoverflow.com/questions/59006238
复制相似问题