記憶體管理實驗筆記
定義記憶體池 ##
//內部SRAM記憶體池 32位元組對齊 說明一次取出32位元組 效率高
__align(32) u8 mem1base[MEM1_MAX_SIZE];
_**_align(32)** u8 mem2base[MEM2_MAX_SIZE] attribute((at(0X68000000)));
定義管理記憶體池的表
**雖然起到管理記憶體的作用 但是同時也帶來了記憶體開銷(浪費記憶體)**
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //內部SRAM記憶體池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] attribute((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM記憶體池MAP
//記憶體管理引數 //這幾個陣列中存放的是 記憶體表和記憶體池大小
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE}; //記憶體表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //記憶體分塊大小
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE};
//記憶體管理控制器 定義一個結構體
struct _m_mallco_dev
{
void (*init)(u8); //**函式指標** 用於呼叫初始化函式
u8 (*perused)(u8); // 同樣是函式指標 用於呼叫使用率函式
u8 *membase[SRAMBANK]; //記憶體池 管理SRAMBANK個區域的記憶體
u16 *memmap[SRAMBANK]; //記憶體管理狀態表
u8 memrdy[SRAMBANK]; //記憶體管理是否就緒
};
定義上述結構體的一個全域性變數 並且做相應的初始化
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //記憶體初始化
my_mem_perused, //記憶體使用率
mem1base,mem2base, //記憶體池
mem1mapbase,mem2mapbase, //記憶體管理狀態表
0,0, //記憶體管理未就緒 1表示就緒
};
對記憶體表和記憶體池初始化清零操作
//記憶體管理初始化
//memx:所屬記憶體塊
void my_mem_init(u8 memx)
{
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//記憶體狀態表資料清零
mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //記憶體池所有資料清零
mallco_dev.memrdy[memx]=1; //記憶體管理初始化OK
}
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs++=c;
}
記憶體分配函式 malloc(mem_addr,size)
malloc函式返回的是具體地址
所以必須找到連續size大小的記憶體 並且返回這塊連續記憶體的首地址
怎麼查詢?
方法:從尾部開始查詢以32位元組一塊為單位 一塊一塊的向前移動 直到找到連續的結束
所以首先將size/32+size%32 得到需要多少塊
從記憶體管理表尾部開始找把記憶體管理表管理的塊數給 offset偏移量 然後offset– 直到找到連續塊跳出迴圈
找到後別忘了把管理表相應的塊置1標記已經在使用
查詢依據是?
管理表置0表示未使用
具體程式碼如下:
//記憶體分配(內部呼叫)
//memx:所屬記憶體塊
//size:要分配的記憶體大小(位元組)
//返回值:0XFFFFFFFF,代表錯誤;其他,記憶體偏移地址
u32 my_mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u32 nmemb; //需要的記憶體塊數
u32 cmemb=0;//連續空記憶體塊數
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先執行初始化
if(size==0)return 0XFFFFFFFF;//不需要分配
nmemb=size/memblksize[memx]; //獲取需要分配的連續記憶體塊數
if(size%memblksize[memx])nmemb++;
for(offset=memtblsize[memx]-1(其實這個就是管理的塊數量);offset>=0;offset--)//搜尋整個記憶體控制區
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//連續快計數
else cmemb=0; //如果中間是斷開的計數清零 需要重新計數
if(cmemb==nmemb) //找到了連續nmemb個空記憶體塊
{
for(i=0;i<nmemb;i++) //標註記憶體塊非空 別忘記標記找的塊
{
mallco_dev.memmap[memx][offset+i]=nmemb;
} //這不是二維陣列 因為memmap[memx]=陣列首地址
return (offset*memblksize[memx]);//返回偏移地址
}
}
return 0XFFFFFFFF;//未找到符合分配條件的記憶體塊
}
“`
相關推薦
記憶體管理實驗筆記
定義記憶體池 ## //內部SRAM記憶體池 32位元組對齊 說明一次取出32位元組 效率高 __align(32) u8 mem1base[MEM1_MAX_SIZE]; _**_align(32)** u8 mem2bas
STM32H7 記憶體管理實驗將記憶體使用率上傳至PC 以及硬體除錯演算法的小經驗
移植一些演算法到STM32上,演算法在PC上能夠執行,而移植到STM32的時候就會出現問題, 總結來說主要是因為編譯器的版本不同,MDK5的編譯器是很古老的編譯器,有些C語法會有問題。 常見的問題就是: 1.結構體賦值的時候,在32裡面的程式碼,結構體
黑馬程式設計師————OC記憶體管理_筆記整理(二)
一、@Prpperty引數 // 加上retain:表示生成的set方法,release舊值,retain新值 @property (retain) Book *book; // oc物件型別 //@property (nonatomic,retain) 類名 *屬性名
記一次MongoDB效能問題+Linux記憶體管理學習筆記--實體記憶體分配
最近忙著把一個專案從MySQL遷移到MongoDB,在匯入舊資料的過程中,遇到了些許波折,犯了不少錯誤,但同時也學到了不少知識,遂記錄下來。 公司為這個專案專門配備了幾臺高效能務器,清一色的雙路四核超執行緒CPU,外加32G記憶體,運維人員安裝好MongoDB後,就交我手裡了,我習慣於在使用新伺服器前先看
block 知識點 ---- Objective-C 高階程式設計 iOS 與 OS X 多執行緒記憶體管理 學習筆記
1. block捕捉變數: 結論:只有呼叫_Block_copy 才能持有截獲的附有 __strong 修飾符的物件型別的自動變數值。 block 中使用物件型別的自動變數時,除以下情形,推薦使用copy方法: “When the Block is returned
Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理讀書筆記
Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理 自動引用計數 自動引用計數(ARC,Automatic Reference Counting) “在LLVM編輯器中設定ARC為有效狀態,就無需再次鍵入retain或者是releas
Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 讀書筆記(一)
1.2.2 記憶體管理原則: 自己生成的物件,自己所持有 非自己生成的物件,自己也能持有 不再需要自己持有的物件時釋放 非自己持有的物件無法釋放 自己生成的物件,自己所持有 //自己生成並持有物件 id obj = [[NSObject alloc] init]; //自己持有物件
Unity移動遊戲載入效能和記憶體管理-學習筆記
前言 正在學習Doctor 張.鑫大佬的移動遊戲載入效能和記憶體管理,內容非常非常的幹,所以我燒了很多開水,邊喝邊看,一邊拿小本幾做好筆記 本文只是關於前2章的內容筆記,關於各種資源的載入耗時 紋理資源載入耗時 重複載入十次,取平均值 紋理尺寸測試結論 1、紋理資源的解析度對載入效能影響較大,解析度越高
[讀書筆記]iOS與OS X多執行緒和記憶體管理 [GCD部分]
3.2 GCD的API 蘋果對GCD的說明:開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue中。 “Dispatch Queue”是執行處理的等待佇列。通過dispatch_async函式等API,在Block
記憶體管理函式(C++學習筆記 14)
一、C語言中的記憶體管理函式 記憶體分配函式主要有malloc( )和calloc( ),記憶體釋放函式是free( )。 這兩類函式的原型在stdlib.h中,要使用這些函式時,首先要用檔案包含: #include"stdlib.h" 或#include<stdli
【Java】「深入理解Java虛擬機器」學習筆記(2)-記憶體管理
一、執行時資料區 JVM在執行Java程式的時候,將其執行時資料區劃分為若干不同區域。它們的用途和建立及銷燬的時間不同。 1、程式計數器(Program Counter Register) 是一塊很小的記憶體空間。當執行緒執行的是Java方法,它記錄的是當前正在執行的
程式設計師面試寶典隨筆記(一)--記憶體管理詳解
記憶體管理是C++最令人切齒痛恨的問題,也是C++最有爭議的問題,C++高手從中獲得了更好的效能,更大的自由,C++菜鳥的收穫則是一遍一遍的檢查程式碼和對C++的痛恨,但記憶體管理在C++中無處不在,記憶體洩漏幾乎在每個C++程式中都會發生,因此要想成為C++高手,記
S3C2440的記憶體管理單元MMU學習筆記
1.MMU簡介 MMU(Memory Management Unit),記憶體管理單元,主要職責: 將虛擬地址對映為實體地址,提供硬體機制的記憶體訪問許可權檢查 。MMU使得每個使用者程序擁有自己獨立的地址空間,並通過記憶體訪問許可權的檢查保護每個程序所用的
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.4 虛擬儲存管理
虛擬儲存管理 背景:固定式、分頁式、分段式儲存一個共同的特點是要求的儲存空間必須足夠大裝載入作業的全部資訊,但由於作業在執行過程中,作業中所有的記憶體不是一次全部使用的,甚至有些記憶體塊根本就不是使用,這樣就造成了記憶體資源的極度浪費 虛擬儲存工作過程:當作業載入到記憶體時
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.3 段頁式管理
分頁式儲存管理 概念:為了避免分割槽式管理產生儲存碎片和管理複雜的問題,分頁式管理把作業的邏輯地址劃分成若干個相等的區域(稱為頁),記憶體空間也劃分成若干個與頁長度相等的區域(也稱為頁幀或塊),然後把頁裝載到頁幀中 特點 頁幀可以是連續的,也可以是不連續的
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.2 分割槽儲存管理
記憶體儲存管理方式分類 分割槽儲存管理方式 分頁式儲存管理方式 分段式儲存管理方式 虛擬儲存器 分割槽儲存管理方式 固定分割槽 分割槽方法:在裝入作業前,記憶體被操作管理員分為N個區,分割槽大小和分割槽數量不可以修改
易學筆記-系統分析師考試-第3章 作業系統基本原理/3.3 記憶體管理/3.3.1 地址變換
幾種程式 源程式:使用者用開發語言編寫的程式 編譯程式(彙編程式):專門編譯源程式的程式 目標程式:編譯後的程式 地址 邏輯地址 概念:指的是目標程式使用的地址,也稱為相對地址或者虛擬地址 格式:一般以0為基地址
學習筆記- GC與記憶體管理
深入GC與記憶體管理 託管堆中存放引用型別物件,因此GC的記憶體管理的目標主要都是引用型別物件,本文中涉及的物件如無明確說明都指的是引用型別物件。 物件建立及生命週期 一個物件的生命週期簡單概括就是:建立>使用>釋放,在.NET中一個物件的生命週期: n
《現代作業系統》閱讀筆記——記憶體管理
地址重定位 最開始的計算機沒有重定位,程式直接使用記憶體的實體地址 任然被微波爐,洗衣機等嵌入式裝置使用 缺點是一次只能執行一個程式,因為第二個程式地址起始位置會變動 靜態重定位
Java虛擬機器筆記-1(Java技術體系&自動記憶體管理機制&記憶體區域與記憶體溢位&垃圾收集器與記憶體分配策略)
世界上沒有完美的程式,但寫程式是不斷追求完美的過程。 Devices(裝置、裝置)、GlassFish(商業相容應用伺服器) 目錄 1. Java技術體系包括: Java技術體系的4個平臺 虛擬機器分類 HotSpot VM 模組化、混合程式設計 多核並行