news 2026/1/30 19:59:24

多类型内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多类型内存管理

最近想给64kb rom 以及 4kb ram mcu准备图形系统所以避免不了内存管理,以下为mcu装备的几种内存管理

第一款混合堆栈方案(占用大,被抛弃版本)

外围辅助头文件
#ifndef __GUI_MEMPOOL_CONFIG_H #define __GUI_MEMPOOL_CONFIG_H //内存池配置 #define GUI_MEMPOOL_ENABLE_STATISTICS 0 #define GUI_MEMPOOL_DEBUG 0 #define GUI_MEMPOOL_ALIGN_SIZE 4 //分区 #define GUI_SMALL_POOL_SIZE 1 #define GUI_MEDIUM_POOL_SIZE 1 #define GUI_LARGE_POOL_SIZE 0 #define GUI_SPECIAL_POOL_SIZE 1 typedef enum{ OBJ_TYPE_INVALID = 0, OBJ_TYPE_BASE, OBJ_TYPE_BUTTON, OBJ_TYPE_LABLE, OBJ_TYPE_IMAGE, OBJ_TYPE_CONTAINER, OBJ_TYPE_SCREEN, OBJ_TYPE_CUSTOM, OBJ_TYPE_MAX }obj_type_t; typedef enum{ BLOCK_FREE = 0, BLOCK_USED, BLOCK_COIRRUPTED, }block_state_t; #endif
声明(头文件)
#ifndef _GUI_MEM_H_ #define _GUI_MEM_H_ #include "gui_mempool_config.h" #include <stdint.h> #include <stdbool.h> #include <stddef.h> typedef struct memblock_header{ struct memblock_header* next; struct memblock_header* prev; uint16_t size; uint8_t type; uint8_t state; uint32_t magic; }mem_block_header_t; //内存块头指针 typedef struct{ uint8_t* start; uint8_t* end; uint16_t block_size; uint16_t total_blocks; uint16_t free_blocks; uint16_t used_blocks; mem_block_header_t* free_list; uint8_t* bitmap; }mem_zone_t; //内存块描述 typedef struct{ mem_zone_t small_zone; //64字节 mem_zone_t medium_zone; //256字节 mem_zone_t large_zone; //1024字节 mem_zone_t special_zone; //1024字节 uint32_t total_allocs; uint32_t total_frees; uint32_t alloc_fails; uint32_t max_used_memory; uint32_t current_used_memory; bool initialized; bool use_bitmap; }gui_mempool_t; //对齐宏 #define ALIGN_UP(x,align) (((x) + ((align) - 1)) & ~((align) - 1)) #define BLOCK_HEADER_SIZE ALIGN_UP(sizeof(mem_block_header_t), GUI_MEMPOOL_ALIGN_SIZE) #define MAGIC_NUMBER 0xDEADBEEF bool gui_mempool_init(void); void* gui_mempool_alloc(size_t size, obj_type_t type); void gui_mempool_free(void* ptr); void gui_mempool_is_valid(void* ptr); void gui_mempool_dump_stats(void); void gui_mempool_check_integrity(void); size_t gui_mempool_get_alloc_size(void); obj_type_t gui_mempool_get_obj_type(void* ptr); #endif
初始化
bool gui_mempool_init(void) { if(mempool.initialized){ // MEMPOOL_DEBUG("[MEMPOOL] Already initialized\n"); return true; } uint8_t* current = memory_pool; mempool.small_zone.start = current; mempool.small_zone.end = current + GUI_SMALL_POOL_SIZE * 1024; mempool.small_zone.block_size = 64; mempool.small_zone.total_blocks = 0; mempool.small_zone.free_blocks = 0; mempool.small_zone.used_blocks = 0; mempool.small_zone.used_blocks = 0; mempool.small_zone.free_list = NULL; mempool.small_zone.bitmap = NULL; current = mempool.small_zone.end; mempool.medium_zone.start = current; mempool.medium_zone.end = current + GUI_SMALL_POOL_SIZE * 1024; mempool.medium_zone.block_size = 64; mempool.medium_zone.total_blocks = 0; mempool.medium_zone.free_blocks = 0; mempool.medium_zone.used_blocks = 0; mempool.medium_zone.used_blocks = 0; mempool.medium_zone.free_list = NULL; mempool.medium_zone.bitmap = NULL; mempool.large_zone.start = current; mempool.large_zone.end = current + GUI_SMALL_POOL_SIZE * 1024; mempool.large_zone.block_size = 64; mempool.large_zone.total_blocks = 0; mempool.large_zone.free_blocks = 0; mempool.large_zone.used_blocks = 0; mempool.large_zone.used_blocks = 0; mempool.large_zone.free_list = NULL; mempool.large_zone.bitmap = NULL; mempool.special_zone.start = current; mempool.special_zone.end = current + GUI_SMALL_POOL_SIZE * 1024; mempool.special_zone.block_size = 64; mempool.special_zone.total_blocks = 0; mempool.special_zone.free_blocks = 0; mempool.special_zone.used_blocks = 0; mempool.special_zone.used_blocks = 0; mempool.special_zone.free_list = NULL; mempool.special_zone.bitmap = NULL; mempool.total_allocs = 0; mempool.total_frees = 0; mempool.alloc_fails = 0; mempool.max_used_memory = 0; mempool.current_used_memory = 0; mempool.initialized = true; mempool.use_bitmap = true; return true; }

在区中分配内存

static void *zone_alloc(mem_zone_t* zone,size_t size,obj_type_t type){ if(!zone || size == 0) return NULL; // 计算实际需要的内存大小(包含头部) size_t total_size = BLOCK_HEADER_SIZE + ALIGN_UP(size, GUI_MEMPOOL_ALIGN_SIZE); if(zone->block_size > 0 && total_size > zone->block_size) { return NULL; } // 特殊区域使用首次适配算法 if(zone->block_size == 0) { mem_block_header_t* current = (mem_block_header_t*)zone->start; mem_block_header_t* prev = NULL; // 遍历特殊区域寻找足够大的空闲块 while((uint8_t*)current < zone->end) { if(current->state == BLOCK_FREE && current->size >= total_size) { // 找到合适的块 if(current->size > total_size + BLOCK_HEADER_SIZE + GUI_MEMPOOL_ALIGN_SIZE) { // 分割块 mem_block_header_t* new_block = (mem_block_header_t*) ((uint8_t*)current + BLOCK_HEADER_SIZE + total_size); new_block->size = current->size - total_size - BLOCK_HEADER_SIZE; new_block->state = BLOCK_FREE; new_block->magic = MAGIC_NUMBER; new_block->type = OBJ_TYPE_INVALID; // 插入到空闲链表 new_block->next = current->next; new_block->prev = current; if(current->next) { ((mem_block_header_t*)current->next)->prev = new_block; } current->next = new_block; current->size = total_size; } // 从空闲链表中移除 if(current->prev) { current->prev->next = current->next; } if(current->next) { current->next->prev = current->prev; } if(zone->free_list == current) { zone->free_list = current->next; } // 设置块信息 current->state = BLOCK_USED; current->type = type; current->magic = MAGIC_NUMBER; current->prev = NULL; current->next = NULL; zone->used_blocks++; zone->free_blocks--; return (uint8_t*)current + BLOCK_HEADER_SIZE; } prev = current; current = (mem_block_header_t*)((uint8_t*)current + BLOCK_HEADER_SIZE + current->size); } return NULL; } // 固定大小区域使用空闲链表 if(!zone->free_list) { // 初始化空闲链表 size_t block_count = (zone->end - zone->start) / (BLOCK_HEADER_SIZE + zone->block_size); for(size_t i = 0; i < block_count; i++) { mem_block_header_t* block = (mem_block_header_t*) (zone->start + i * (BLOCK_HEADER_SIZE + zone->block_size)); block->size = zone->block_size; block->state = BLOCK_FREE; block->type = OBJ_TYPE_INVALID; block->magic = MAGIC_NUMBER; block->next = zone->free_list; block->prev = NULL; if(zone->free_list) { zone->free_list->prev = block; } zone->free_list = block; zone->total_blocks++; zone->free_blocks++; } } if(!zone->free_list) { return NULL; } // 从空闲链表头部取出一个块 mem_block_header_t* block = zone->free_list; zone->free_list = block->next; if(zone->free_list) { zone->free_list->prev = NULL; } block->state = BLOCK_USED; block->type = type; block->prev = NULL; block->next = NULL; zone->used_blocks++; zone->free_blocks--; return (uint8_t*)block + BLOCK_HEADER_SIZE; }

主分配函数

static mem_zone_t* select_zone(size_t size) { if(size <= 64){ return &mempool.small_zone; }else if(size<= 256){ return &mempool.medium_zone; }else if(size <= 1024){ return &mempool.large_zone; }else{ return &mempool.special_zone; } } void* gui_mempool_alloc(size_t size, obj_type_t type){ if(!mempool.initialized || size == 0){ return NULL; } mem_zone_t* zone = select_zone(size); if(!zone){ mempool.alloc_fails++; return NULL; } void* ptr = zone_alloc(zone,size,type); if(ptr){ mempool.total_allocs++; mempool.current_used_memory += BLOCK_HEADER_SIZE + ALIGN_UP(size,GUI_MEMPOOL_ALIGN_SIZE); if(mempool.current_used_memory > mempool.max_used_memory){ mempool.max_used_memory = mempool.current_used_memory; } }else{ mempool.alloc_fails++; } return ptr; }
释放内存函数
void gui_mempool_free(void* ptr){ if(!ptr || !mempool.initialized){ return; } mem_block_header_t* block = (mem_block_header_t*)((uint8_t*)ptr - BLOCK_HEADER_SIZE); if(block->magic != MAGIC_NUMBER){ return; } mem_zone_t* zone = NULL; if((uint8_t*) block >= mempool.small_zone.start && (uint8_t*)block < mempool.small_zone.end){ zone = &mempool.small_zone; }else if((uint8_t*) block >= mempool.medium_zone.start && (uint8_t*)block < mempool.small_zone.end){ zone = &mempool.medium_zone; }else if((uint8_t*)block >= mempool.large_zone.start && (uint8_t*)block < mempool.large_zone.end) { zone = &mempool.large_zone; }else if((uint8_t*)block >= mempool.special_zone.start && (uint8_t*)block < mempool.special_zone.end) { zone = &mempool.special_zone; }else{ return; } if(block->state != BLOCK_USED) { return; } if(zone->block_size == 0){ mem_block_header_t* prev = block->prev; if(prev && prev->state == BLOCK_FREE){ prev->size += BLOCK_HEADER_SIZE + block->size; if(block->next){ block->next->prev = prev; } if(block->prev){ block->prev->next = block->next; } } block = prev; } mem_block_header_t* next = (mem_block_header_t*) ((uint8_t*)block + BLOCK_HEADER_SIZE + block->size); if((uint8_t*)next < zone->end && next->state == BLOCK_FREE){ block->size += BLOCK_HEADER_SIZE + next->size; //从空闲链表中移除下一个块 if(next->next){ next->next->prev = block; } if(next->prev){ next->prev->next = next->prev; } } block->state = BLOCK_FREE; block->type = OBJ_TYPE_INVALID; block->next = zone->free_list; block->prev = NULL; if(zone->free_list){ zone->free_list->prev = block; } zone->free_list = block; zone->used_blocks--; zone->free_blocks++; mempool.total_frees++; mempool.current_used_memory -= BLOCK_HEADER_SIZE + block->size; }

二.纯栈方案

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 0:20:59

Python轻松生成斐波那契数列

实现功能&#xff1a;Python代码生成斐波那契数列前N项def fibonacci(n):fib_sequence []a, b 0, 1for _ in range(n):fib_sequence.append(a)a, b b, a breturn fib_sequence# 示例&#xff1a;生成前10项 n 10 print(f"斐波那契数列前{n}项&#xff1a;{fibonacci(…

作者头像 李华
网站建设 2026/1/29 22:48:34

Python快速排序实现详解

生成Python代码实现快速排序def quick_sort(arr):if len(arr) < 1:return arrpivot arr[len(arr) // 2]left [x for x in arr if x < pivot]middle [x for x in arr if x pivot]right [x for x in arr if x > pivot]return quick_sort(left) middle quick_sort…

作者头像 李华
网站建设 2026/1/30 0:27:43

黄仁勋年终总结:DeepSeek是去年对美国AI贡献最大的一项工作!AI的算力成本每年下降超10倍;预训练从未结束;5年内会出现大量垂直AI公司

黄仁勋指出&#xff0c;随着市场不断扩大&#xff0c;每个模型公司都可以选择自己想要差异化竞争的垂直方向或细分领域&#xff0c;比如“最强的编程模型”或“最容易使用、最适合大众的消费级产品”&#xff0c;他预测大模型领域未来会呈现出高度多样化的形态。“即便 ChatGPT…

作者头像 李华
网站建设 2026/1/30 23:55:23

2026 开篇:架构师为什么不用 DDD ?

这不是一篇 DDD 教程&#xff0c;也不是最佳实践指南。 这是我在真实项目中尝试使用 DDD 之后的困惑、挣扎&#xff0c;甚至是放弃。 如果你正在考虑要不要上 DDD&#xff0c; 或者你已经在用&#xff0c;但总觉得哪里不对劲&#xff0c; 那这篇文章&#xff0c;可能会戳中你…

作者头像 李华
网站建设 2026/1/31 0:25:31

新浪微博架构

技术开发者往往对微博这个产品非常关心&#xff0c;对微博的构架非常感兴趣&#xff0c;就是一个明星他有300万粉丝&#xff0c;这个技术怎么来实现&#xff1f;今天在这里跟大家分享一下微博的底层机构&#xff0c;让大家对微博的底层技术有更好的了解。另外不管是做客户端、W…

作者头像 李华