分块式内存管理
分块式内存管理
1
举例
#define MEM1 0 //内部SRAM
#define MEM2 1 //外部SRAM
#define MEM1_BLOCK_SIZE 32 //内存块大小 32字节
#define MEM2_BLOCK_SIZE 32
#define MEM1_MAX_SIZE 10 * 1024 //10K
#define MEM2_MAX_SIZE 40 * 1024
#define MEM1_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE
#define MEM2_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE
u8 mem1_pool_base[MEM1_MAX_SIZE];
u8 mem2_pool_base[MEM2_MAX_SIZE] __attribute__((at(0x68000000)));
u8 mem1_table_base[MEM1_TABLE_SIZE];
u8 mem2_table_base[MEM2_TABLE_SIZE];
typedef struct
{
u8 block_size;
u16 table_size;
u8 *mem_pool; //内存池
u8 *mem_table; //内存管理表
}malloc_t;
malloc_t mal[2] =
{
{MEM1_BLOCK_SIZE, MEM1_TABLE_SIZE, mem1_pool_base, mem1_table_base},
{MEM2_BLOCK_SIZE, MEM2_TABLE_SIZE, mem2_pool_base, mem2_table_base}
};
void *memset(void *s, u8 c, u32 n) //清0
{
u32 i = 0;
u8 *p = s;
for(i = 0; i < n; i++)
{
*(p + i) = c;
}
return s;
}
void mem_init(u8 i)
{
memset(&mal[i].mem_pool, 0, sizeof(mal[i].mem_pool));
memset(&mal[i].mem_table, 0, sizeof(mal[i].mem_table));
}
u32 mem_malloc(u8 i, u32 size)
{
u16 num = 0;
u16 tmp = 0;
int o = 0;
u16 j = 0;
num = size / mal[i].block_size; //整块数量
if(size % mal[i].block_size > 0)
{
num++;
}
for(o = mal[i].table_size - 1; o >= 0; o--)
{
if(mal[i].mem_table[o] == 0) //连续空内存块
{
tmp++;
}
else
{
tmp = 0;
}
if(tmp == num)
{
for(j = 0; j < num; j++)
{
mal[i].mem_table[o + j] = num; //标记非空块
}
return (o * mal[i].block_size); //返回偏移地址
}
}
return 0xFF;
}
void* malloc(u8 i, u32 size)
{
u32 offset;
offset = mem_malloc(i, size);
if(offset != 0xFF)
{
return (void*)((u32)mal[i].mem_pool + offset);
}
else
{
return NULL;
}
}
void mem_free(u8 i, u32 offset)
{
u16 num = 0;
u16 o = 0;
u16 j = 0;
o = offset / mal[i].block_size; //首块偏移
num = mal[i].mem_table[o];
for(j = 0; j < num; j++)
{
mal[i].mem_table[o + j] = 0; //块标记清0
}
}
void free(u8 i, void *addr)
{
u32 offset = 0;
offset = (u32)addr - (u32)mal[i].mem_pool;
mem_free(i, offset);
}
u8 mem_used(u8 i) //内存块使用率
{
u16 used = 0;
u16 j = 0;
for(j = 0; j < mal[i].table_size; j++)
{
if(mal[i].mem_table[j] != 0)
{
used++;
}
}
return (used * 100 / mal[i].table_size);
}
上一篇:stm32 SD卡
下一篇:stm32 内部flash
推荐阅读最新更新时间:2024-11-10 05:00
设计资源 培训 开发板 精华推荐
- 使用 ON Semiconductor 的 LV5608LP 的参考设计
- LT8570EMS8E-1 1.2MHz 升压转换器的典型应用从 9V-16V 输入产生 48V
- ADM8616LCYAKSZ-RL7 低压监控的典型应用电路
- S12XFSTARTERKITE: S12XF 2节点入门套件
- 【天津工业大学】简易电子负载 王泽宁
- 双路无刷FOC驱动_ESP32扩展板
- 使用 Microchip Technology 的 MIC2225-4KYMT TR 的参考设计
- LT1170HVIT、-10 至 -26/5A LCD 对比度电源的典型应用
- LT3430 高电压降压稳压器为 FireWire 外设提供高电流、薄型电源解决方案
- 【星火计划】 UPS分立元件版