staticvoidprvHeapInit(void)/* PRIVILEGED_FUNCTION */{BlockLink_t*pxFirstFreeBlock;uint8_t*pucAlignedHeap;portPOINTER_SIZE_TYPEuxAddress;size_txTotalHeapSize=configTOTAL_HEAP_SIZE;/* 确保堆起始地址是按照 portBYTE_ALIGNMENT 对齐的 */uxAddress=(portPOINTER_SIZE_TYPE)ucHeap;/* 处理未对齐的情况 *...
就像xTaskCreate()函数的堆栈大小参数一样,堆栈大小不是以字节为单位而是以字为单位的,比如在32位架构下,栈大小为100表示栈内存占用400字节的空间。 configTOTAL_HEAP_SIZE RTOS内核总计可用的有效的RAM大小。仅在你使用官方下载包中附带的内存分配策略时,才有可能用到此值。每当创建任务、队列、互斥量、软件定时器或...
void *pvPortMalloc( size_t xWantedSize ){ void *pvReturn = NULL; static uint8_t *pucAlignedHeap = NULL; /* 确保字节对齐 */ #if( portBYTE_ALIGNMENT != 1 ) { if( xWantedSize & portBYTE_ALIGNMENT_MASK ){ /* 需要进行字节对齐 */ xWantedSize += (portBYTE_ALIGNMENT-(xWantedSize&...
拆分多余的内存,插回到链表if((pxBlock->xBlockSize-xWantedSize)>heapMINIMUM_BLOCK_SIZE){/* This block is to be split into two. Create a new block
原型描述:void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ); 返回值结构 typedefstructHeapRegion{/* 内存块的起始地址将成为堆的一部分.*/uint8_t*pucStartAddress;/* 堆的容量大小bytes. */size_txSizeInBytes; } HeapRegion_t; ...
xPortGetFreeHeapSize() API函数返回未分配的堆空间总量,允许对configTOTAL_HEAP_SIZE设置进行优化。 heap_1实现: 如果你的应用程序从来没有删除任务、队列、信号量、互斥量等,可以使用它(这实际上涵盖了使用FreeRTOS的大多数应用程序)。 始终是确定的(始终需要相同的时间来执行),并且不会导致内存碎片化。
计算尾部指针地址 */uxAddress = ( (size_t) pucAlignedHeap ) + xTotalHeapSize;/* 减去end所占用的8个字节 */uxAddress -= xHeapStructSize;/* pxend字节对齐,也就是尾部会空出8-15字节用于放pxend */uxAddress &= ~( (size_t) portBYTE_ALIGNMENT_MASK );/* pxend初始化 */pxEnd = (void...
因为程序运行起来实际占用heap的空间不好计算那么准,那么我们可以借助freertos的API来准确的得出空闲的heap空间和用的最对时候的空闲值。这两个API如下: xPortGetFreeHeapSize() 1. 这个函数可以获取调用时堆中空闲内存的大小,以字节为单位。使用它可以优化堆的大小。需要注意,当使用heap_3时是不能调用这个函数的。
ESP.getHeapSize();//获取堆容量 ESP.getFreeHeap();//获取剩余的空闲内存 uxTaskGetStackHighWaterMark(任务句柄);//FreeRTOS使用此函数,查看任务堆栈空间使用情况。 任务堆栈的“高水位线”值,也就是堆栈的历史剩余最小值。这个值越小说明任务堆栈溢出的可能性就越大! 示例如下: ...
在这一段代码里,有一个地方要注意的就是这里用到的空闲块头部并不是直接sizeof(BlockLink_t),而是heapSTRUCT_SIZE,这个常量也定义在Heap_2.c中,这是对空闲块头部的大小再进行了一次大小对齐。 接下来做了一个分配判断。xWantedSize0,还看得我很迷糊的。本来xWantedSize就是unsigned int,是大于等于0的,一下...