<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
FreeRTOS提供5種動態記憶體管理策略,分別為heap_1到heap_5,原始碼在FreeRTOS/Source/portable/MemMang下,本質是對一個或者多個大陣列進行操作來對系統提供記憶體的申請、釋放(有的策略沒有)功能。下面先看看heap_1是怎麼做的。
大陣列在哪裡
/* Allocate the memory for the heap. */ #if( configAPPLICATION_ALLOCATED_HEAP == 1 ) //這種情況是可以把待管理的陣列分配在外部SRAM、SDRAM中 extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; #else //這種情況是把待管理的陣列分配在內部RAM,由編譯器決定地址 static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; #endif /* configAPPLICATION_ALLOCATED_HEAP */
可以看到這個區域性靜態全域性大陣列名字是ucHeap
,大小是configTOTAL_HEAP_SIZE,這個宏在FreeRTOSConfig.h
中定義
//因為需要位元組對齊,所以實際能使用的記憶體位元組數要減去portBYTE_ALIGNMENT /* A few bytes might be lost to byte aligning the heap start address. */ #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
portBYTE_ALIGNMENT 在portmacro.h
中定義
#define portBYTE_ALIGNMENT8
已分配位元組數
//已經分配了的位元組數,也就是下一個空閒記憶體相對於首址(pucAlignedHeap)的偏移量 static size_t xNextFreeByte = ( size_t ) 0;
void *pvPortMalloc( size_t xWantedSize ) { void *pvReturn = NULL;//待返回給使用者分配地址 static uint8_t *pucAlignedHeap = NULL;//實際管理的陣列首地址 /* Ensure that blocks are always aligned to the required number of bytes. */ //如果不是1位元組對齊則先需要portBYTE_ALIGNMENT位元組對齊 #if( portBYTE_ALIGNMENT != 1 ) { if( xWantedSize & portBYTE_ALIGNMENT_MASK ) { /* Byte alignment required. */ //如果使用者申請位元組數不是portBYTE_ALIGNMENT_MASK位元組對齊的,先要調整到portBYTE_ALIGNMENT_MASK位元組對齊 //比如申請13位元組,要求portBYTE_ALIGNMENT = 8, //則xWantedSize = 13+(8-(13&7))=13+(8-5)=16, //最終申請16位元組 xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); } } #endif //掛起排程器,防止函數重入 vTaskSuspendAll(); { if( pucAlignedHeap == NULL ) //說明是第一次呼叫此函數需要對對記憶體堆初始化確保記憶體堆首址也是8位元組對齊 { /* Ensure the heap starts on a correctly aligned boundary. */ //假設&ucHeap是0x20000C64, //則&ucHeap[ portBYTE_ALIGNMENT ]是 0x20000C64+7=0x20000C6B //pucAlignedHeap = 0x20000C6B & (~0x00000007) = 0x20000C68 //pucAlignedHeap才是實際操作的堆首址 pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); } /* Check there is enough room left for the allocation. */ //已經分配的位元組數xNextFreeByte + 將要分配的位元組數xWantedSize //要小於總共有的位元組數configADJUSTED_HEAP_SIZE if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && //此條件是防止溢位,因為記憶體是地址是單調增長 ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ { /* Return the next free byte then increment the index past this block. */ //返回地址給使用者 pvReturn = pucAlignedHeap + xNextFreeByte; //更新已經分配了的記憶體位元組數 xNextFreeByte += xWantedSize; } traceMALLOC( pvReturn, xWantedSize ); } ( void ) xTaskResumeAll(); //解掛排程器 //如果使能的記憶體申請失敗的勾點函數當申請失敗時會執行申請失敗勾點函數 #if( configUSE_MALLOC_FAILED_HOOK == 1 ) { if( pvReturn == NULL ) { extern void vApplicationMallocFailedHook( void ); vApplicationMallocFailedHook(); } } #endif return pvReturn; }
其中portBYTE_ALIGNMENT_MASK是根據portBYTE_ALIGNMENT定義,在portable.h中
#if portBYTE_ALIGNMENT == 8 #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) #endif
可以看到heap_1是沒有提供釋放,是無法釋放的
void vPortFree( void *pv ) { /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the memory management pages of http://www.FreeRTOS.org for more information. */ ( void ) pv; /* Force an assert as it is invalid to call this function. */ configASSERT( pv == NULL ); }
size_t xPortGetFreeHeapSize( void ) { return ( configADJUSTED_HEAP_SIZE - xNextFreeByte ); }
適用範圍、特點
適用於只需分配,不需釋放場合,執行時間確定,不會產生碎片,但是記憶體利用率不高
以上就是FreeRTOS動態記憶體分配管理heap_1範例的詳細內容,更多關於FreeRTOS動態記憶體分配管理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45