生活随笔
收集整理的這篇文章主要介紹了
内存管理代码分析 stm32
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)malloc函數用于內存申請,free函數用于內存釋放。
(2)內存管理表的項值代表的意義:當該項值為0的時候,代表對應的內存塊未被占用,當該項值非零的時候,代表該項對應的內存塊已經被占用,其數值則代表被連續占用的內存塊數。**比如某項值為10,那么說明包括本項對應的內存塊在內,總共分配了10個內存塊給外部的某個指針。**

(3)內寸分配方向:是從頂?底的分配方向。即首先從最末端開始找空內存。當內存管理剛初始化的時候,內存管理表全部清零,表示沒有任何內存塊被占用。
(4)分塊式內存管理——分配原理當指針p調用malloc申請內存的時候,先判斷p要分配的內存塊數(m),然后從第n項開始,向下查找,直到找到m塊連續的空內存塊(即對應內存管理表項為0),然后將這m個內存管理表項的值都設置為m(標記被占用),最后,把最后的這個空內存塊的地址返回指針p,完成一次分配。注意,如果當內存不夠的時候(找到最后也沒找到連續的m塊空閑內存),則返回NULL給p,表示分配失敗。
(5)分塊式內存管理——釋放原理當指針p申請的內存用完,需要釋放的時候,調用free函數實現。free函數先判斷p指向的內存地址所對應的內存塊,然后找到對應的內存管理表項目,得到p所占用的內存塊數目m(內存管理表項目的值就是所分配內存塊的數目),將這m個內存管理表項目的值都清零,標記釋放,完成一次內存釋放。
(6)//內存管理控制器
struct _m_mallco_dev
{
void (*init)(u8); //初始化
u8 (*perused)(u8); //內存使用率
u8 *membase[SRAMBANK]; //內存池 管理SRAMBANK個區域的內存
u16 *memmap[SRAMBANK]; //內存管理狀態表
u8 memrdy[SRAMBANK]; //內存管理是否就緒
};
extern struct _m_mallco_dev mallco_dev;//在mallco.c里面定義
nit,函數指針,指向內存初始化函數,用于初始化內存管理,帶一個參數(Mini板不帶)
,表示要初始化的內存片。
perused,函數指針,指向內存使用率函數,用于獲取內存使用率,,帶一個參數(Mini板不帶),表示要獲取內存使用率的內存片。
membase,內存池指針,指向內存池。最多有SRAMBANK個內存池(Mini板僅一個)。
memmap,內存管理表指針,指向內存管理表。最多有SRAMBANK個內存管理表(Mini板僅一個)。該指針為16位類型,因此,最大可以分配65535(可申請的
內存塊數)內存塊這么大的內存區域。
假定內存塊大小為32字節,那么一次性最大可以申請的內存就是2M-32字節。
memrdy,內存管理表就緒標志,用于表示內存管理表是否已經初始化(清零)。最多有
SRAMBANK個內存管理表就緒標志(Mini板僅一個)。
(7)
內存中幾個概念,1 內存塊大小-一個內存塊有多少個字節,2 內存表大小–有多少個內存表(一個內存塊對應一個內存表),3最大管理內存=內存表大小內存塊大小
總結
以上是生活随笔為你收集整理的内存管理代码分析 stm32的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。