东土KY3001平台 我增加code以后测试 发现编译正常 烧录正常 但是板子run的时候会崩溃
预计是板子的RAM已经不够用了!怎么办?
剔除一些无用的code比如不用的GPIO DEV 有一定的效果
找到问题的关键 注意到内存大户jq_os_mm.c 在它身上做减法效果极好
其实这种事情很常见
比如你要写flash 假定一个page是4096那么需要写一个对应的数组来操作
static uint8_t wbuf[FLASH_PAGE_LEN];
上述写法比较消耗内存!
解决办法是利用malloc-free用完归还并且可以工程共享 如下
#defineFLASH_PAGE_LEN 4096
static 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 就可以不崩溃了
它意义是:提前定义好的数组的数量 比如
uint8_t wbuf[4096];–1个
uint8_t wbuf[2048];–2个
uint8_t wbuf[1024];–2个
上图展示了提前定义的数组
可以画一画 二维数组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
完整代码如下:
/* 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