實(shí)現(xiàn)STM32分塊式內(nèi)存管理
出處:網(wǎng)絡(luò)整理 發(fā)布于:2025-03-07 17:42:33
STM32分塊式內(nèi)存管理實(shí)現(xiàn)的目標(biāo)是將內(nèi)存管理系統(tǒng)分為多個(gè)塊,以便更靈活、高效地使用內(nèi)存資源。STM32的內(nèi)存管理通常是通過裸機(jī)編程、RTOS或自定義內(nèi)存池來實(shí)現(xiàn)的。這里將展示一種基于STM32裸機(jī)編程的簡單內(nèi)存池管理方法,它適用于小型項(xiàng)目或嵌入式開發(fā)中沒有RTOS的情況。
1. 內(nèi)存池的基本思想
內(nèi)存池是一個(gè)預(yù)先分配好固定大小內(nèi)存塊的區(qū)域,應(yīng)用程序從內(nèi)存池中請求內(nèi)存,并在使用完后歸還。通過這種方式,能夠避免頻繁的動態(tài)內(nèi)存分配(如 malloc 和 free),提高內(nèi)存分配和回收的效率。
2. 基本數(shù)據(jù)結(jié)構(gòu)
首先,我們需要定義一個(gè)結(jié)構(gòu)體來表示內(nèi)存塊。每個(gè)內(nèi)存塊包含一個(gè)指向下一個(gè)塊的指針和實(shí)際的數(shù)據(jù)區(qū)域。
c
#define BLOCK_SIZE 32 // 每塊內(nèi)存的大小
#define POOL_SIZE 10 // 內(nèi)存池中內(nèi)存塊的數(shù)量typedef struct MemoryBlock {struct MemoryBlock* next; // 指向下一個(gè)內(nèi)存塊} MemoryBlock;// 內(nèi)存池的起始位置
static uint8_t memory_pool[BLOCK_SIZE * POOL_SIZE];// 空閑內(nèi)存塊的鏈表頭static MemoryBlock* free_list = NULL;
3. 初始化內(nèi)存池
內(nèi)存池需要在系統(tǒng)啟動時(shí)進(jìn)行初始化,將內(nèi)存池中的所有塊鏈成一個(gè)鏈表,便于管理。
c
void memory_pool_init(void) {
// 初始化空閑鏈表
free_list = (MemoryBlock*)memory_pool;
// 將所有內(nèi)存塊連接成一個(gè)鏈表
for (int i = 0; i < POOL_SIZE - 1; i++) {MemoryBlock* current_block = (MemoryBlock*)((uint8_t*)free_list + i * BLOCK_SIZE);current_block->next = (MemoryBlock*)((uint8_t*)free_list + (i + 1) * BLOCK_SIZE);}
// 一個(gè)塊的 next 指向 NULL
MemoryBlock* last_block = (MemoryBlock*)((uint8_t*)free_list + (POOL_SIZE - 1) * BLOCK_SIZE);last_block->next = NULL;}
4. 分配內(nèi)存塊
當(dāng)應(yīng)用程序請求一個(gè)內(nèi)存塊時(shí),memory_alloc 函數(shù)將從空閑鏈表中分配一個(gè)內(nèi)存塊,并返回指向內(nèi)存塊的數(shù)據(jù)區(qū)域的指針。
c
void* memory_alloc(void) {
if (free_list == NULL) {
// 沒有可用的內(nèi)存塊
return NULL;
}
// 從鏈表中取出一個(gè)內(nèi)存塊
MemoryBlock* allocated_block = free_list;free_list = free_list->next;// 返回內(nèi)存塊的數(shù)據(jù)區(qū)域
return (void*)((uint8_t*)allocated_block + sizeof(MemoryBlock));}
5. 釋放內(nèi)存塊
當(dāng)應(yīng)用程序釋放內(nèi)存塊時(shí),memory_free 函數(shù)將該內(nèi)存塊重新加入到空閑鏈表中。
c
void memory_free(void* ptr) {
// 獲取內(nèi)存塊的起始位置
MemoryBlock* freed_block = (MemoryBlock*)((uint8_t*)ptr - sizeof(MemoryBlock));// 將內(nèi)存塊放回空閑鏈表freed_block->next = free_list;
free_list = freed_block;
}
6. 使用示例
使用內(nèi)存池管理內(nèi)存時(shí),應(yīng)用程序可以通過調(diào)用 memory_alloc 和 memory_free 來分配和釋放內(nèi)存塊。例如:
c
int main(void) {
// 初始化內(nèi)存池
memory_pool_init();
// 分配一個(gè)內(nèi)存塊
void* block1 = memory_alloc();
if (block1 != NULL) {
// 使用內(nèi)存塊
}
// 釋放內(nèi)存塊
memory_free(block1);
return 0;
}
7. 內(nèi)存池的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
高效:通過預(yù)分配內(nèi)存池,可以減少動態(tài)分配的開銷,提高內(nèi)存分配和回收的效率。
避免碎片化:內(nèi)存塊的大小固定,可以避免內(nèi)存碎片的問題。
簡潔:內(nèi)存池的管理方式簡單,易于實(shí)現(xiàn)和調(diào)試。
缺點(diǎn):
內(nèi)存浪費(fèi):內(nèi)存池中的內(nèi)存塊大小是固定的,如果某個(gè)塊的內(nèi)存使用量較小,可能會浪費(fèi)部分內(nèi)存。
有限大?。簝?nèi)存池的大小是固定的,超出池大小的內(nèi)存請求會失敗,無法動態(tài)擴(kuò)展。
8. 擴(kuò)展功能
在實(shí)際應(yīng)用中,可以根據(jù)需要對內(nèi)存池管理進(jìn)行擴(kuò)展,比如:
增加不同大小內(nèi)存塊的支持(例如,小內(nèi)存塊和大內(nèi)存塊分開管理)。
實(shí)現(xiàn)內(nèi)存池的動態(tài)調(diào)整,允許在運(yùn)行時(shí)增加或減少內(nèi)存池的大小。
使用鎖機(jī)制或其他同步機(jī)制,以支持多任務(wù)環(huán)境(例如,RTOS環(huán)境)。
上一篇:DRAM簡介
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 主流存儲技術(shù)核心特性與場景化應(yīng)用概述2026/1/13 11:12:42
- 主流存儲技術(shù)特性與場景化選型指南2026/1/7 10:07:41
- MES系統(tǒng)現(xiàn)場部署與數(shù)據(jù)對接實(shí)操指南2025/12/29 11:09:41
- eMMC 屬于閃存還是內(nèi)存?從定義到應(yīng)用講透核心區(qū)別2025/9/15 15:24:16
- ddr4和ddr5內(nèi)存接口一樣嗎?全景解析2025/9/8 17:22:03









