Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory FreeRTOS堆放在DDR的哪个内存区域(Zynq 700设备)?_Memory_Heap_Freertos_Zynq - Fatal编程技术网

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

Memory FreeRTOS堆放在DDR的哪个内存区域(Zynq 700设备)?,memory,heap,freertos,zynq,Memory,Heap,Freertos,Zynq,我正在努力理解FreeRTOS中的内存管理概念,如果有人能证实我对事物的理解,我将不胜感激 我有一个Zynq 7000设备,我在SoC的FPGA端实现了一些自定义逻辑和AXI DMA控制器。该逻辑实质上生成一些数据样本,然后写入DDR内存。在处理器端,我设置了FreeRTOS(v10),它必须将数据写入DDR并对此进行一些处理 现在,使用AXI DMA意味着我必须在DDR中为DMA控制器指定一些可以写入样本的内存区域。在我的纯金属应用程序中,它相对简单,因为我基本上可以指定DDR中没有被系统保留

我正在努力理解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)
即可分配内存空间,然后将返回的非空指针和分配空间的大小(以字节为单位)传递给DMA控制器。另外,请重新检查DMA控制器不会写入超出分配的空间(因为这可能会破坏空闲内存块管理的内部数据结构)

您不必知道细节,例如哪些内存块是可用的,哪些已经分配给其他任务…等等。根据FreeRTOS项目中选择的堆实现,可用内存块在heap_x.c中进行内部管理

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

pvPortMalloc()
仅在FreeRTOS堆中分配空间,其大小由定义参数
configTOTAL\u heap\u size

确定如果使用,则堆实际上是一个静态分配的数组,这意味着它进入.bss部分-然后进入哪个内存取决于链接器脚本将.bss放在哪里