单片机上实现内存池的功能


#define MAX_ALLOC_NUM 32  //最多可申请的内存块数。

#define MEM_PAGE_SZ 32 //一页内存的字节数。(分配的最小单位为page)
#define MEM_BLK_NUM 2   //可供分配的块数量。(一个块2048byte字节)



//内存池的块
typedef struct mem_block
{
unsigned char mem[64][MEM_PAGE_SZ];  //内存池:64个页
u64 mask;   //内存池页占用的掩码
}mem_block_t;





//内存池的管理块
typedef struct mem_patch
{
u8 m_blk_id;   //使用的内存池的块的ID
u8 m_sta_idx; //当前内存片在内存池中的起始位置(及在mem数组中的下标)
u16 m_sz;     //所申请的内存大小(单位字节)
u8 used;      //标识:标识当前管理块是否已被使用

}mem_patch_t;




mem_block_t mem_pool[MEM_BLK_NUM];  //所申请的内存池块
mem_patch_t mem_pacth[MAX_ALLOC_NUM];   //管理内存的管理块




//获取一个空闲的内存管理项ID
static  char mem_get_free_patch()
{
u8 i=0;


for(i=0;i<MAX_ALLOC_NUM;i++)
{
if(mem_pacth[i].used == 0)
{
return i;
}
}
return -1;
}


//通过给定的地址,查找一个内存管理项ID
static  char

单片机内存管理框架主要是为了有效地利用有限的内存资源,避免内存碎片化和浪费。以下是一个简单的单片机内存管理框架的实现思路: 1. 定义内存池:首先需要定义一个内存池,用于存储可用的内存块,内存池可以是一个数组或链表,每个内存块大小相同。 2. 初始化内存池:在系统启动时,需要将整个内存池初始化为一系列可用的内存块,这些内存块可以用于分配给任务或其他部分使用。 3. 分配内存:当需要分配内存时,内存管理框架会从内存池中找到一个可用的内存块,将其标记为已分配,并返回该内存块的地址。 4. 释放内存:当任务完成了对内存块的使用,需要将其释放回内存池中,以便其他任务可以重新使用该内存块。 5. 管理内存池:内存管理框架还需要实现一些管理内存池的函数,例如检查内存池的状态、打印内存池的使用情况等。 下面是一个简单的单片机内存管理框架的代码示例: ```c #define MEM_POOL_SIZE 1024 // 内存池大小 typedef struct mem_block { uint8_t data[MEM_BLOCK_SIZE]; // 内存块数据 struct mem_block *next; // 指向下一个内存块 uint8_t used; // 是否被使用 } mem_block_t; static mem_block_t mem_pool[MEM_POOL_SIZE]; // 内存池 void mem_init(void) { // 初始化内存池 for (int i = 0; i < MEM_POOL_SIZE; i++) { mem_pool[i].used = 0; mem_pool[i].next = &mem_pool[i+1]; } mem_pool[MEM_POOL_SIZE-1].next = NULL; } void *mem_alloc(size_t size) { // 分配内存 if (size > MEM_BLOCK_SIZE) { return NULL; } mem_block_t *block = mem_pool; while (block != NULL) { if (!block->used) { block->used = 1; return block->data; } block = block->next; } return NULL; } void mem_free(void *ptr) { // 释放内存 if (ptr == NULL) { return; } mem_block_t *block = (mem_block_t *)((uint8_t *)ptr - offsetof(mem_block_t, data)); block->used = 0; } void mem_print(void) { // 打印内存池状态 int free_blocks = 0; int used_blocks = 0; mem_block_t *block = mem_pool; while (block != NULL) { if (block->used) { used_blocks++; } else { free_blocks++; } block = block->next; } printf("free blocks: %d, used blocks: %d\n", free_blocks, used_blocks); } ``` 这个简单的内存管理框架采用了一个静态数组作为内存池,并实现了分配、释放和打印内存池状态等基本功能。在实际应用中,可以根据需求修改和扩展该框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值