当前位置:网站首页>整理了一份通用的内存管理驱动代码
整理了一份通用的内存管理驱动代码
2022-07-17 16:59:00 【李肖遥】
关注、星标公众号,直达精彩内容
来源:技术让梦想更伟大
作者:李肖遥
malloc的全称是memory allocation,即动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间的时候,就需要用到动态的分配内存。
可以说动态内存分配在嵌入式开发中是经常用到的,也是比较容易出错和被忽略的,经常忘了free,导致分配失败程序死机等等。
这里在工作的时候整理了一份通用的内存管理驱动代码。
一些基本定义
定义内存池(32字节对齐)
__align(32) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC01F4000))); //外部SDRAM内存池,前面2M给LTDC用了(1280*800*2)
__align(32) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0X10000000))); //内部CCM内存池定义内存管理表
u32 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XC01F4000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP
u32 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000+MEM3_MAX_SIZE))); //内部CCM内存池MAP定义内存管理参数
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE}; //内存表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE}; //内存分块大小
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE,MEM3_MAX_SIZE}; //内存总大小一个结构体来定义内存管理控制器
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //内存初始化
my_mem_perused, //内存使用率
mem1base,mem2base,mem3base, //内存池
mem1mapbase,mem2mapbase,mem3mapbase,//内存管理状态表
0,0,0, //内存管理未就绪
};重写函数
需要复制的内存长度(字节为单位),复制内存,重写一个memcpy
void mymemcpy(void *des,void *src,u32 n)
{
u8 *xdes=des;
u8 *xsrc=src;
while(n--)*xdes++=*xsrc++;
}需要设置的内存大小(字节为单位),设置内存,重写一个memset
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs++=c;
}常用模块函数
获取内存使用率
u16 my_mem_perused(u8 memx)
{
u32 used=0;
u32 i;
for(i=0;i<memtblsize[memx];i++)
{
if(mallco_dev.memmap[memx][i])used++;
}
return (used*1000)/(memtblsize[memx]);
}内存分配(内部调用)
u32 my_mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u32 nmemb; //需要的内存块数
u32 cmemb=0;//连续空内存块数
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先执行初始化
if(size==0)return 0XFFFFFFFF;//不需要分配
nmemb=size/memblksize[memx]; //获取需要分配的连续内存块数
if(size%memblksize[memx])nmemb++;
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加
else cmemb=0; //连续内存块清零
if(cmemb==nmemb) //找到了连续nmemb个空内存块
{
for(i=0;i<nmemb;i++) //标注内存块非空
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//返回偏移地址
}
}
return 0XFFFFFFFF;//未找到符合分配条件的内存块
}释放内存
u8 my_mem_free(u8 memx,u32 offset)
{
int i;
if(!mallco_dev.memrdy[memx])//未初始化,先执行初始化
{
mallco_dev.init(memx);
return 1;//未初始化
}
if(offset<memsize[memx])//偏移在内存池内.
{
int index=offset/memblksize[memx]; //偏移所在内存块号码
int nmemb=mallco_dev.memmap[memx][index]; //内存块数量
for(i=0;i<nmemb;i++) //内存块清零
{
mallco_dev.memmap[memx][index+i]=0;
}
return 0;
}else return 2;//偏移超区了.
}当然也可以把上面的函数封装为外部调用的,方便使用,比如重新分配内存(外部调用)
void *myrealloc(u8 memx,void *ptr,u32 size)
{
u32 offset;
offset=my_mem_malloc(memx,size);
if(offset==0XFFFFFFFF)return NULL;
else
{
mymemcpy((void*)((u32)mallco_dev.membase[memx]+offset),ptr,size); //拷贝旧内存内容到新内存
myfree(memx,ptr); //释放旧内存
return (void*)((u32)mallco_dev.membase[memx]+offset); //返回新内存首地址
}
}版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。边栏推荐
- The active and standby cache of redis cluster is full, causing frequent active and standby switchover
- 二叉树2—对称性递归问题
- 2022全球开发者薪资曝光:中国排第19名,平均年薪23,790美元
- 超声波传感器(CH101&ch201) - Ⅰ
- Pytorch version: yolov4 integrating attention and mobilenet
- 减半行情会不会来?有何投资机会?2020-03-11
- go web
- 最懂你的服装设计师是AI?让用户 “凭心意” 生成数字服装#Adidas OZWORLD
- Investment logic in market "uncertainty" 2020-03-18
- 超声波传感器系列文章汇总
猜你喜欢

关于“抄底”心态,让你筋疲力尽 2020-03-15

Go unit test

ASP. Net collaborative OA office service management platform source code

最懂你的服装设计师是AI?让用户 “凭心意” 生成数字服装#Adidas OZWORLD

Differences between get requests and post requests and usage examples

Li Hongyi machine learning 1 Introduction of this course

学习记录:调用TFTLCD液晶屏

深度梳理:机器学习建模调参方法总结

The difference and use between get request and post request

Ultrasonic sensor (ch101 & ch201) - I
随机推荐
GET 请求和 POST 请求的区别和使用
Mysql的知识梳理
10 minutes to customize the pedestrian analysis system, detection and tracking, behavior recognition, human attributes all in one!
第二天实验
第四天作業
Ultrasonic sensor (chx01) learning notes Ⅲ - I2C reading and writing operation
收益风险比:投资机会最重要指标 2020-03-14
Li Hongyi machine learning 1 Introduction of this course
Swiftui data persistence in swift, different methods of saving data
go web
OpenCV:06形态学
数组去重 数组排序 最大值 求和 类数组转化 过滤数组
RingBuffer
HICP day 3
Yunxi and Tencent cloud have reached a strategic cooperation to accelerate the expansion of the global live broadcast market
AE如何制作星云粒子特效
PostgreSQL 函数使用记录
S32K148_ Can drive (bare metal development)
云犀&腾讯云达成战略合作,加速拓展全球直播市场
Differences between get requests and post requests and usage examples
