stm32 内存管理
来源:互联网 发布:淘宝加盟骗局郑州 编辑:程序博客网 时间:2024/06/05 19:01
分块式内存管理
举例
#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_SIZEu8 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);}
阅读全文
1 0
- stm32 内存管理
- stm32内存管理总结
- Keil编程环境下STM32内存管理研究[转载]
- Keil编程环境下STM32内存管理研究[转载]
- Keil编程环境下STM32内存管理研究
- STM32内存管理以及堆和栈的理解
- STM32内存管理以及堆和栈的理解
- 自编STM32轻量级操作系统(三)------内存管理
- 基于STM32原子战舰板内存管理源码详解
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- Keil编程环境下STM32内存管理研究 (Code、 RO-data、 RW-data、ZI-data)
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- 自己写的STM32 内存管理 实现了malloc,free,remalloc等函数
- STM32 DMA->内存到内存
- stm32内存分配
- 2017年8月25日 星期五
- 函数式编程
- sparkSql入门1
- Hibernate配置详解
- ACM进阶之路
- stm32 内存管理
- HDU
- U盘图标改成自己喜欢的图标
- BZOJ 1096: [ZJOI2007]仓库建设 斜率优化
- 2017-8-26 C#学习如何新建一个Helloworld
- 2017年8月26日 星期六
- 表、视图、实体化视图的比较
- BZOJ1790:[Ahoi2008]Rectangle 矩形藏宝地 (CDQ分治+线段树)
- IOS逆向笔记之HOOK实现(非越狱)