C語言實現記憶體池管理可用於嵌入式裝置

2021-09-30 00:04:57 字數 3732 閱讀 1080

c語言標準庫malloc函式的效率是很低的,一般在嵌入式裝置上是比較要求效率,所以在嵌入式小型系統中,可以開闢乙個大一點的陣列,通過管理該陣列模擬記憶體釋放的功能,以此來提高記憶體申請和釋放的效率。

/*

* malloc.h

* * created on: 2023年11月26日

* author: ankun

*/#ifndef malloc_h_

#define malloc_h_

#ifndef null

#define null 0

#endif

#define mem_block_size 32

// 記憶體塊大小

#define mem_block_nums 1024

// 記憶體塊數目

#define mem_max_size (mem_block_size * mem_block_nums)

// 記憶體池大小,32*1024=32kb

// 記憶體池初始化

void

mem_init

(void);

// 記憶體釋放

void

mem_free

(void

* p)

;// 記憶體申請

void

*mem_malloc

(unsigned

int size)

;// 重新調整已有記憶體大小

void

*mem_realloc

(void

* p,

unsigned

int size)

;// 獲得記憶體使用率

float

mem_perused

(void);

// 記憶體設定

void

mem_memset

(void

* dst,

unsigned

char val,

unsigned

int size)

;// 記憶體拷貝

void

mem_memcpy

(void

* dst,

const

void

* src,

unsigned

int size)

;// 獲得記憶體使用量

unsigned

intmem_getused

(void);

// 獲得記憶體空餘量

unsigned

intmem_getfree

(void);

// 獲得記憶體大小

unsigned

intmem_getsize

(void);

#endif

/* malloc_h_ */

/*

* malloc.c

* * created on: 2023年11月26日

* author: ankun

*/#include

"malloc.h"

__attribute__((

aligned(4

)))unsigned

char memory[mem_max_size]

;__attribute__((

aligned(4

)))unsigned

short memtbl[mem_block_nums]

;/**

* 記憶體拷貝函式

* @param dst 目標位址

* @param src 源位址

* @param size 拷貝大小

*/void

mem_memcpy

(void

* dst,

const

void

* src,

unsigned

int size)

while

(size--)}

/** * 記憶體設定函式

* @param dst 目標位址

* @param val 要設定的值

* @param size 記憶體連續設定的長度

*/void

mem_memset

(void

* dst,

unsigned

char val,

unsigned

int size)

while

(size--)}

/** * 記憶體申請函式,申請的記憶體空間會被初始化為0

* @param size 要申請的大小

* @return 申請成功返回記憶體位址,失敗返回null

*/void

*mem_malloc

(unsigned

int size)

p =(unsigned

char*)

(memory +

(i +

1- nblocks)

* mem_block_size)

;mem_memset

(p,0

, nblocks * mem_block_size)

;return

(void

*)p;}}

return

null;}

/** * 重新申請記憶體

* 注意:若newsize > p的size,則會造成p的多餘部分內容丟失;若p為空位址,則等效於mem_malloc函式

* @param p 舊位址

* @param size 重新申請的大小

* @return 新位址

*/void

*mem_realloc

(void

* p,

unsigned

int newsize)

return

null;}

/** * 記憶體釋放函式

* @param p 要釋放的記憶體位址

*/void

mem_free

(void

* p)

}/**

* 獲得記憶體使用率

*/float

mem_perused

(void

)return((

(float

)(used *

100))/

((float

)mem_block_nums));

}/**

* 獲得記憶體使用量

*/unsigned

intmem_getused

(void

)return used * mem_block_size;

}/**

* 獲得記憶體空餘量

*/unsigned

intmem_getfree

(void

)return free * mem_block_size;

}/**

* 獲得記憶體池總大小

*/unsigned

intmem_getsize

(void

)/**

* 記憶體池初始化函式

*/void

mem_init

(void

)

C語言實現記憶體池

什麼是記憶體池,這裡簡單介紹一下 不做詳細說明 記憶體池技術是一種用於分配大量大小相同的小物件的技術,通過該技術可以極大加快記憶體分配 釋放過 程。其原理是先申請一大塊記憶體,然後分成若干個大小相等的小塊,用鍊錶的方式將這些小塊鏈在一起,當開發人員需要使用記憶體時 分配 從煉表頭取下一塊返 回給開發...

C語言記憶體管理(記憶體池)

c語言可以使用 alloc 從棧上動態分配記憶體。malloc free或者 new delete 大量使用會造成記憶體碎片,這種碎片形成的機理如下 記憶體碎片一般是由於空閒的記憶體空間比要連續申請的空間小,導致這些小記憶體塊不能被充分的利用,舉個例子 如果有100 個單位的連續空閒記憶體,那麼先申...

c語言實現執行緒池

ifndef threadpool h included define threadpool h included include typedef struct threadpool job void routine void void arg struct threadpool job next ...