嵌入式简单的内存管理方法

前言

 

东土KY3001平台 我增加code以后测试 发现编译正常 烧录正常 但是板子run的时候会崩溃

预计是板子的RAM已经不够用了!怎么办?

剔除一些无用的code比如不用的GPIO DEV 有一定的效果

找到问题的关键 注意到内存大户jq_os_mm.c 在它身上做减法效果极好

其实这种事情很常见

比如你要写flash 假定一个page是4096那么需要写一个对应的数组来操作

#define FLASH_PAGE_LEN 4096static uint8_t wbuf[FLASH_PAGE_LEN];

上述写法比较消耗内存!

解决办法是利用malloc-free用完归还并且可以工程共享 如下

 

#defineFLASH_PAGE_LEN 4096static uint8_t *wbuf;
wbuf = (uint8_t*)jq_os_mm_malloc(FLASH_PAGE_LEN);去使用wbuf jq_os_mm_free(wbuf)

上面的接口jq_os_mm_malloc/jq_os_mm_free 是内存管理

本文就是描述这个模块

行文思路一如既往 简单粗暴

首先定义一个大大的数组 以后malloc求内存 就是在里面割出来一块给你 然后free就是还回去。对于数组里面的内存有没有被使用 还需要一个flag标记一下

 

1
H文件

 

图片

 

解决文首我的烦恼 就是把这些宏写小一些 比如都写1 就可以不崩溃了

它意义是:提前定义好的数组的数量 比如

uint8_t wbuf[4096];–1个

uint8_t wbuf[2048];–2个

uint8_t wbuf[1024];–2个

 

2
C文件

 

图片

上图展示了提前定义的数组

可以画一画 二维数组X是数量 Y是4096啥的

>紫色框框标记的可以无视 描述的是放置的位置和对齐

>红色标记的是理解问题 比如4096说的是U8 我们数组类型是int所以数量是1024即可

>OS_MM_FLAG_SIZE是宏定义1 这就是额外描述该内存是否被使用的flag

>绿色标记能看出端倪 比如数组4096 其实是1+4096的内存 flag不参加分布只是做标识的  被使用了就写数组[0]=’J’

图片

比如准备2个4096的大数组

内存图如上 合计是4+4096+4+4096的内存

提前在板子RAM申请好了的  绿色的是flag

完整代码如下:

#include "jq_util_macro.h"#include "jq_product_config.h"
#ifndef NULL#define NULL (void *)0#endif
#ifndef OS_MM_FLAG_SIZE#define OS_MM_FLAG_SIZE (1)#endif
#ifndef OS_MM_4096_NUM#define OS_MM_4096_NUM (2)#endif
#ifndef OS_MM_2048_NUM#define OS_MM_2048_NUM (4)#endif
#ifndef OS_MM_1024_NUM#define OS_MM_1024_NUM (4)#endif
#ifndef OS_MM_512_NUM#define OS_MM_512_NUM (5)#endif
#ifndef OS_MM_256_NUM#define OS_MM_256_NUM (5)#endif
#ifndef OS_MM_128_NUM#define OS_MM_128_NUM (10)#endif
#ifndef OS_MM_64_NUM#define OS_MM_64_NUM (10)#endif
#ifndef OS_MM_32_NUM#define OS_MM_32_NUM (10)#endif
#ifndef OS_MM_16_NUM#define OS_MM_16_NUM (10)#endif
/* Private variables ------------------------------------------------------------*/static int os_mm_4096_buffer[OS_MM_4096_NUM][(1024 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_2048_buffer[OS_MM_2048_NUM][(512 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_1024_buffer[OS_MM_1024_NUM][(256 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_512_buffer[OS_MM_512_NUM][(128 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_256_buffer[OS_MM_256_NUM][(64 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_128_buffer[OS_MM_128_NUM][(32 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_64_buffer[OS_MM_64_NUM][(16 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_32_buffer[OS_MM_32_NUM][(8 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
static int os_mm_16_buffer[OS_MM_16_NUM][(4 + OS_MM_FLAG_SIZE)] JQ_SRAM_BUFFER_PLACE_IN_SECTION JQ_ALIGN(4);
/* Fuction ------------------------------------------------------------*/JQ_INLINE void *jq_os_malloc_buffer(void *buffer, unsigned int buffer_size, unsigned int buffer_num){    unsigned int i = 0;    int *dirty;    dirty =(int *)buffer;    for (i = 0; i < buffer_num; i++)    {        if (dirty[0] != 'J')        {            dirty[0] = 'J';            return (void *)(dirty + OS_MM_FLAG_SIZE);        }        dirty += buffer_size;    }
    return NULL;}
void *jq_os_mm_malloc(unsigned int size){    void *preturn = NULL;    if (size <= 16)    {        preturn = jq_os_malloc_buffer(os_mm_16_buffer, 16 + OS_MM_FLAG_SIZE, OS_MM_16_NUM);    }    else if (size <= 32)    {        preturn = jq_os_malloc_buffer(os_mm_32_buffer, 32 + OS_MM_FLAG_SIZE, OS_MM_32_NUM);    }    else if (size <= 64)    {        preturn = jq_os_malloc_buffer(os_mm_64_buffer, 64 + OS_MM_FLAG_SIZE, OS_MM_64_NUM);    }    else if (size <= 128)    {        preturn = jq_os_malloc_buffer(os_mm_128_buffer, 128 + OS_MM_FLAG_SIZE, OS_MM_128_NUM);    }    else if (size <= 256)    {        preturn = jq_os_malloc_buffer(os_mm_256_buffer, 256 + OS_MM_FLAG_SIZE, OS_MM_256_NUM);    }    else if (size <= 512)    {        preturn = jq_os_malloc_buffer(os_mm_512_buffer, 512 + OS_MM_FLAG_SIZE, OS_MM_512_NUM);    }    else if (size <= 1024)    {        preturn = jq_os_malloc_buffer(os_mm_1024_buffer, 1024 + OS_MM_FLAG_SIZE, OS_MM_1024_NUM);    }    else if (size <= 2048)    {        preturn = jq_os_malloc_buffer(os_mm_2048_buffer, 2048 + OS_MM_FLAG_SIZE, OS_MM_2048_NUM);    }    else if (size <= 4096)    {        preturn = jq_os_malloc_buffer(os_mm_4096_buffer, 4096 + OS_MM_FLAG_SIZE, OS_MM_4096_NUM);    }    return preturn;}
int jq_os_mm_free(void *buffer){    if (buffer == NULL)        return -1;    int *dirty = (int *)buffer - OS_MM_FLAG_SIZE;    if (dirty[0] == 'J')    {        dirty[0] = '';    }    return 0;}

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/89640.html

(0)
guozi's avatarguozi
上一篇 2024年6月4日 下午5:17
下一篇 2024年6月4日 下午5:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注