基于STM32原子战舰板内存管理源码
存使用率 mem1base,mem2base, //内存池 mem1mapbase,mem2mapbase, //内存管理状态表,mem1mapbase(1250项),mem2mapbase(6250项) 0,0, //内存管理未就绪 }; /* 1,“void *des”无类型指针,不能指向具体的数据,“void *des”无类型指针指向内存中的数据类型由用户自己确定,如malloc()函数的返回值就是“void *des”无类型指针,因为malloc()函数的返回值是不确定的是根据形参的数据类型确定的 2,“void mymemcpy(void *des,void *src,u32 n) ”函数的理解: des是指针,但是不确定指向什么类型的数据,换句话说des指针存储的什么类型数据不确定,“u8 *xdes=des;”将des指针存储的数据 存储到一个新的“u8 *”类型指针xdes中;“u8 *xsrc=src;”同理。 “*xdes++=*xsrc++; ”,当*xsrc++(自增)时,即指针“src”指针自增,也就是说把“src”指针逐位复制到des目标指针去了。复制个数就是n。 3,“*P”的意义:a),“*P”就是以指针变量P的内容(P的内容就是指针变量P里存储的某一类型数据的指针值)为地址的变量;b),指针运算符“*”如果是在定义变量时候加在前面,意思是这个变量是指针变量,如 char *a;如果是在访问指针变量的时候加在前面(如*a),意思是取指针变量指向的值,如 char b=*a; 上面定义了a是一个字符指针,这里就是把指针变量a指向的值取出来并赋给b。 */ //复制内存,作用是将源地址的内容复制到目标地址 //*des:目的地址 //*src:源地址 //n:需要复制的内存长度(字节为单位) void mymemcpy(void *des,void *src,u32 n) { //“void *des”无类型指针,不能指向具体的数据,“void *des”无类型指针指向内存中的数据类型由用户自己确定 u8 *xdes=des;//目标地址,“*xdes”转换成u8类型,也可以理解为把目的地地址des存储到xdes指针中 u8 *xsrc=src; while(n--)*xdes++=*xsrc++; } //设置内存 //*s:内存首地址 //c :要设置的值 //count:需要设置的内存大小(字节为单位) void mymemset(void *s,u8 c,u32 count) { u8 *xs = s; while(count--)*xs++=c; } //以*s为内存首地址的count个字节中,填充c,即把c写入到*s为首地址的内存中,个数多少由count值决定 //内存管理初始化 //memx:所属内存块,要么SRAMEX==1(外部内存);要么SRAMIN(内部内存)==0 /* const u32 memtblsize[2]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE};//内存管理表大小 const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小 const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //内存总大小 */ void mem_init(u8 memx) //如“mem_init(SRAMIN);”表示内部内存块 { //memmap,是16位的,mymemset,设置是针对8位的,那么1个16位的数据是不是2个8位组成的啊?! mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//内存状态表数据清零 //把u8类型的数据“0”填充到u16类型指针元素memmap[0]中(根据结构体定义“u16 *memmap[2]; ”),memmap[0]=mem1mapbase==1250, //也就是说“mallco_dev.memmap[memx]”在这里表示1250个内部内存块用以存储u16类型指针, //“memtblsize[memx]”是什么呢?memtblsize[memx]即memtblsize[0]==1250个内部内存管理表, //而mallco_dev.memmap[memx]是16位的,为了将其全部清零,所以乘以2. mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //内存池所有数据清零 //memsize[0]==40K字节空间, mallco_dev.membase[memx]==40K字节空间, mallco_dev.memrdy[memx]=1; //内存管理初始化OK } /* */ //获取内存使用率 //memx:所属内存块,要么SRAMEX==1(外部内存);要么SRAMIN(内部内存)==0 //返回值:使用率(0~100) u8 mem_perused(u8 memx) { u32 used=0; u32 i; for(i=0;i if(mallco_dev.memmap[memx][i])used++; } //mallco_dev.memmap[memx][i]是二维数组。当内存块初始化后该值为0, return (used*100)/(memtblsize[memx]); //used*100,乘以100是将小数变成整数 } //内存分配(内部调用) //memx:所属内存块 //size:要分配的内存大小(字节数) //返回值:0XFFFFFFFF,代表错误;其他,内存偏移地址 //向memx存储器申请size个字节的连续存储空间,并将size个字节中首个字节的地址偏
STM32原子战舰板内存管 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)