FreeRTOS記憶體管理中位元組對齊的理解

2021-10-01 21:26:32 字數 1712 閱讀 2097

freertos記憶體申請函式pvportmalloc()位元組對齊的語句如下

1.申請記憶體數字節對齊

xwantedsize += ( portbyte_alignment - ( xwantedsize & portbyte_alignment_mask ) );

xwantedsize 是要申請的位元組數

portbyte_alignment是位元組對齊數

portbyte_alignment_mask 是位元組對齊掩碼

xwantedsize 是要申請的位元組數,先按照數學思維理一理思路,比如需要申請21個位元組且按照8位元組對齊,申請的位元組數必須是8的倍數才能達到位元組對齊的目的,那麼被除數是21,除數是8。21除以8餘5,除數8必須減去餘數5再加上被除數才能被8整除(8-5=3,21+3=24),所以會申請24個位元組。**實現為xwantedsize += (portbyte_alignment -xwantedsize%portbyte_alignment)。

freertos加入了portbyte_alignment_mask來實現位元組對齊的功能。

xwantedsize += ( portbyte_alignment - ( xwantedsize & portbyte_alignment_mask ) );

我們發現,當portbyte_alignment 和portbyte_alignment_mask滿足如下關係時,

portbyte_alignment

portbyte_alignment_mask

8(表示以8個位元組對齊)

0x0007

4(表示以4個位元組對齊)

0x0003

2(表示以2個位元組對齊)

0x0001

1(表示以1個位元組對齊)

0x0000

xwantedsize % portbyte_alignment 等價於 xwantedsize & portbyte_alignment_mask。xwantedsize & portbyte_alignment_mask 就是被除數xwantedsize 對除數portbyte_alignment取餘的值。

2.記憶體堆起始位址位元組對齊

pucalignedheap = ( uint8_t * ) ( ( ( portpointer_size_type ) &ucheap[ portbyte_alignment ] ) & ( ~( ( portpointer_size_type ) portbyte_alignment_mask ) ) );

&ucheap[ portbyte_alignment ] 是編譯器定義的記憶體堆的起始位址增加了portbyte_alignment ,

&ucheap[ portbyte_alignment ]   &  ( ~( ( portpointer_size_type ) portbyte_alignment_mask ) ) 等價於&ucheap[ portbyte_alignment ]  對 portbyte_alignment 取餘,然後&ucheap[ portbyte_alignment ] 減去這個餘數,得到的位址正好會被portbyte_alignment 整除,也就實現了位元組對齊。

舉例:假設,為了好理解,編譯器定義ucheap位址為3,portbyte_alignment 為8,portbyte_alignment_mask 為0x07。ucheap[ portbyte_alignment ] 位址就為11,11&(~(0x07))為8。記憶體位址從3變成8,實現了記憶體堆位址的位元組對齊。

FreeRTOS 記憶體管理

1.標準malloc 和 free 庫函式的缺陷 1 在小型的嵌入式系統中,可能不可用。2 具體實現相對較大,占用較多寶貴的 空間。3 通常不具備執行緒安全性。4 具有不確定性,每次呼叫的時間開銷可能不同。5 會產生記憶體碎片。6 會使得鏈結器 配置的複雜。2.記憶體分配方案範例。1 heap 1....

FreeRTOS初探 記憶體管理

記憶體管理 概覽 背景 每當任務 佇列或是訊號量被建立時,核心需要進行動態記憶體分配。呼叫標準的malloc 和free 庫函式,必須承擔以下若干問題 解決方案 freertos將記憶體分配作為可移植層面。內容 記憶體分配方案範例 heap 1.c heap 1.c實現乙個非常基本的pvportma...

(八)FreeRTOS記憶體管理

本文介紹記憶體管理的基礎知識,詳細原始碼分析見 freertos高階篇7 freertos記憶體管理分析 freertos提供了幾個記憶體堆管理方案,有複雜的也有簡單的。其中最簡單的管理策略也能滿足很多應用的要求,比如對安全要求高的應用,這些應用根本不允許動態記憶體分配的。freertos也允許你自...