单片机实现内存管理

/*
 * 第三版,优化free,只需要判断前驱和后继就行,不需要再遍历整个链表
 */

#include <stdint.h>

#define MEM_USED 1
#define MEM_UNUSED 0
#define MEM_SIZE 1024 * 10
#define HEAD_NODE &memeryPool[0]
#define BLOCK_SIZE sizeof(struct MemBlock)
#define MEM_SIZE_MAX (0x7FFF - BLOCK_SIZE)

char memeryPool[MEM_SIZE] = {
   0};
/* 每个字节都是宝,对单片机来说,内存池应该不大于65k,所以size 取 unsigned short可行 */
#pragma pack(1)
struct MemBlock {
   
    struct MemBlock *next;
    uint16_t size : 15; 
    uint8_t state : 1;
};
#pragma pack()

void LaMemInit(void)
{
   
    for (int i = 0; i < sizeof(memeryPool); i++) {
   
        memeryPool[i] = 0;
    }
    struct MemBlock *head = (struct MemBlock *)HEAD_NODE;
    head->next = head;
    head->state = MEM_UNUSED;
    head->size = MEM_SIZE - BLOCK_SIZE;
}

/* 优先使用链表前面节点的地址 */
void *LaMalloc(uint16_t len)
{
   
    if ((len == 0) || (len > MEM_SIZE_MAX)) {
   
        return NULL;
    
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机内存管理框架主要是为了有效地利用有限的内存资源,避免内存碎片化和浪费。以下是一个简单的单片机内存管理框架的实现思路: 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、付费专栏及课程。

余额充值