初级会员
- 积分
- 58
- 金钱
- 58
- 注册时间
- 2018-6-14
- 在线时间
- 10 小时
|
楼主 |
发表于 2019-5-27 15:19:42
|
显示全部楼层
RE: emwin中使用内存池及结构体链表,内存分配出现异常的问题
我现在在调试emwin界面,他有用的内存池,并且有自己编写的malloc.c文件,该文件自己编写了内存的分配和释放函数(mymalloc()和myfree()),但是为了便于listview控件的内容的编辑,我增加了结构体链表,结构体链表需要在增加节点的时候分配内存,一开始我用stm32系统自带的malloc()和free()两个函数在针对节点的内存进行操作,但是程序编译时提示内存不足;后来我用malloc.c文件中的mymalloc()和myfree()两个函数来对节点进行操作,但是emwin界面显示异常,现在是没有思路,希望能提供一下解决的思路。
malloc.c文件的内容如下:
[mw_shl_code=applescript,true]#include "malloc.h"
#include "stm32f10x_gpio.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEKÕ½½¢STM32¿a·¢°åV3
//Äú′æ1üàí Çy¶ˉ′úÂë
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2015/1/20
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//Äú′æ3Ø(32×Ö½ú¶ÔÆë)
__align(4) u8 mem1base[MEM1_MAX_SIZE]; //Äú2¿SRAMÄú′æ3Ø
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //ía2¿SRAMÄú′æ3Ø
//Äú′æ1üàí±í
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //Äú2¿SRAMÄú′æ3ØMAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //ía2¿SRAMÄú′æ3ØMAP
//Äú′æ1üàí2Îêy
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE}; //Äú′æ±í′óD¡
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //Äú′æ·Ö¿é′óD¡
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE}; //Äú′æ×ü′óD¡
//Äú′æ1üàí¿ØÖÆÆ÷
struct _m_mallco_dev mallco_dev=
{
my_mem_init, //Äú′æ3õê¼»ˉ
my_mem_perused, //Äú′æê1óÃÂê
mem1base,mem2base, //Äú′æ3Ø
mem1mapbase,mem2mapbase, //Äú′æ1üàí×′쬱í
0,0, //Äú′æ1üàíÎ′¾íD÷
};
//¸′ÖÆÄú′æ
//*des:Ä¿μÄμØÖ·
//*src:Ô′μØÖ·
//nèòa¸′ÖÆμÄÄú′æ3¤¶è(×Ö½úÎaμ¥λ)
void mymemcpy(void *des,void *src,u32 n)
{
u8 *xdes=des;
u8 *xsrc=src;
while(n--)*xdes++=*xsrc++;
}
//éèÖÃÄú′æ
//*s:Äú′æê×μØÖ·
//c :òaéèÖÃμÄÖμ
//countèòaéèÖÃμÄÄú′æ′óD¡(×Ö½úÎaμ¥λ)
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs++=c;
}
//Äú′æ1üàí3õê¼»ˉ
//memx:ËùêôÄú′æ¿é
void my_mem_init(u8 memx)
{
mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//Äú′æ×′쬱íêy¾YÇåáã
mymemset(mallco_dev.membase[memx], 0,memsize[memx]); //Äú′æ3ØËùóDêy¾YÇåáã
mallco_dev.memrdy[memx]=1; //Äú′æ1üàí3õê¼»ˉOK
}
//»ñè¡Äú′æê1óÃÂê
//memx:ËùêôÄú′æ¿é
//·μ»ØÖμ:ê1óÃÂê(0~100)
u8 my_mem_perused(u8 memx)
{
u32 used=0;
u32 i;
for(i=0;i<memtblsize[memx];i++)
{
if(mallco_dev.memmap[memx])used++;
}
return (used*100)/(memtblsize[memx]);
}
//Äú′æ·ÖÅä(Äú2¿μ÷óÃ)
//memx:ËùêôÄú′æ¿é
//size:òa·ÖÅäμÄÄú′æ′óD¡(×Ö½ú)
//·μ»ØÖμ:0XFFFFFFFF,′ú±í′íÎó;ÆäËû,Äú′æÆ«òÆμØÖ·
u32 my_mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u32 nmemb; //DèòaμÄÄú′æ¿éêy
u32 cmemb=0;//á¬Dø¿ÕÄú′æ¿éêy
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//Î′3õê¼»ˉ,ÏèÖ′DD3õê¼»ˉ
if(size==0)return 0XFFFFFFFF;//2»Dèòa·ÖÅä
nmemb=size/memblksize[memx]; //»ñè¡Dèòa·ÖÅäμÄá¬DøÄú′æ¿éêy
if(size%memblksize[memx])nmemb++;
for(offset=memtblsize[memx]-1;offset>=0;offset--)//ËÑË÷Õû¸öÄú′æ¿ØÖÆÇø
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//á¬Dø¿ÕÄú′æ¿éêyÔö¼ó
else cmemb=0; //á¬DøÄú′æ¿éÇåáã
if(cmemb==nmemb) //Õòμ½áËá¬Dønmemb¸ö¿ÕÄú′æ¿é
{
for(i=0;i<nmemb;i++) //±ê×¢Äú′æ¿é·Ç¿Õ
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//·μ»ØÆ«òÆμØÖ·
}
}
return 0XFFFFFFFF;//Î′Õòμ½·ûoÏ·ÖÅäìõ¼tμÄÄú′æ¿é
}
//êí·ÅÄú′æ(Äú2¿μ÷óÃ)
//memx:ËùêôÄú′æ¿é
//offset:Äú′æμØÖ·Æ«òÆ
//·μ»ØÖμ:0,êí·Å3é1|;1,êí·Å꧰ü;
u8 my_mem_free(u8 memx,u32 offset)
{
int i;
if(!mallco_dev.memrdy[memx])//Î′3õê¼»ˉ,ÏèÖ′DD3õê¼»ˉ
{
mallco_dev.init(memx);
return 1;//Î′3õê¼»ˉ
}
if(offset<memsize[memx])//Æ«òÆÔúÄú′æ3ØÄú.
{
int index=offset/memblksize[memx]; //Æ«òÆËùÔúÄú′æ¿éoÅÂë
int nmemb=mallco_dev.memmap[memx][index]; //Äú′æ¿éêyá¿
for(i=0;i<nmemb;i++) //Äú′æ¿éÇåáã
{
mallco_dev.memmap[memx][index+i]=0;
}
return 0;
}else return 2;//Æ«òÆ3¬ÇøáË.
}
//êí·ÅÄú′æ(ía2¿μ÷óÃ)
//memx:ËùêôÄú′æ¿é
//ptr:Äú′æê×μØÖ·
void myfree(u8 memx,void *ptr)
{
u32 offset;
if(ptr==NULL)return;//μØÖ·Îa0.
offset=(u32)ptr-(u32)mallco_dev.membase[memx];
my_mem_free(memx,offset); //êí·ÅÄú′æ
}
//·ÖÅäÄú′æ(ía2¿μ÷óÃ)
//memx:ËùêôÄú′æ¿é
//size:Äú′æ′óD¡(×Ö½ú)
//·μ»ØÖμ:·ÖÅäμ½μÄÄú′æê×μØÖ·.
void *mymalloc(u8 memx,u32 size)
{
u32 offset;
offset=my_mem_malloc(memx,size);
if(offset==0XFFFFFFFF)return NULL;
else return (void*)((u32)mallco_dev.membase[memx]+offset);
}
//ÖØD·ÖÅäÄú′æ(ía2¿μ÷óÃ)
//memx:ËùêôÄú′æ¿é
//*ptr:¾éÄú′æê×μØÖ·
//size:òa·ÖÅäμÄÄú′æ′óD¡(×Ö½ú)
//·μ»ØÖμ·ÖÅäμ½μÄÄú′æê×μØÖ·.
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); //¿½±′¾éÄú′æÄúèYμ½DÂÄú′æ
myfree(memx,ptr); //êí·Å¾éÄú′æ
return (void*)((u32)mallco_dev.membase[memx]+offset); //·μ»ØDÂÄú′æê×μØÖ·
}
}
[/mw_shl_code]
malloc.h文件的内容如下:
[mw_shl_code=applescript,true]#ifndef __MALLOC_H
#define __MALLOC_H
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEKÕ½½¢STM32¿a·¢°åV3
//Äú′æ1üàí Çy¶ˉ′úÂë
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//DT¸ÄèÕÆú:2015/1/20
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#ifndef NULL
#define NULL 0
#endif
//¶¨òåὸöÄú′æ3Ø
#define SRAMIN 0 //Äú2¿Äú′æ3Ø
#define SRAMEX 1 //ía2¿Äú′æ3Ø
#define SRAMBANK 2 //¶¨òåÖ§3ÖμÄSRAM¿éêy.
//mem1Äú′æ2Îêyé趨.mem1íêè«′|óúÄú2¿SRAMàïÃæ.
#define MEM1_BLOCK_SIZE 32 //Äú′æ¿é′óD¡Îa32×Ö½ú
#define MEM1_MAX_SIZE 40*1024 //×î′ó1üàíÄú′æ 40K
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE/MEM1_BLOCK_SIZE //Äú′æ±í′óD¡
//mem2Äú′æ2Îêyé趨.mem2μÄÄú′æ3Ø′|óúía2¿SRAMàïÃæ
#define MEM2_BLOCK_SIZE 32 //Äú′æ¿é′óD¡Îa32×Ö½ú
#define MEM2_MAX_SIZE 960 *1024 //×î′ó1üàíÄú′æ960K
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE/MEM2_BLOCK_SIZE //Äú′æ±í′óD¡
//Äú′æ1üàí¿ØÖÆÆ÷
struct _m_mallco_dev
{
void (*init)(u8); //3õê¼»ˉ
u8 (*perused)(u8); //Äú′æê1óÃÂê
u8 *membase[SRAMBANK]; //Äú′æ3Ø 1üàíSRAMBANK¸öÇøóòμÄÄú′æ
u16 *memmap[SRAMBANK]; //Äú′æ1üàí×′쬱í
u8 memrdy[SRAMBANK]; //Äú′æ1üàíêÇ·ñ¾íD÷
};
extern struct _m_mallco_dev mallco_dev; //Ôúmallco.càïÃ涨òå
void mymemset(void *s,u8 c,u32 count); //éèÖÃÄú′æ
void mymemcpy(void *des,void *src,u32 n);//¸′ÖÆÄú′æ
void my_mem_init(u8 memx); //Äú′æ1üàí3õê¼»ˉoˉêy(ía/Äú2¿μ÷óÃ)
u32 my_mem_malloc(u8 memx,u32 size); //Äú′æ·ÖÅä(Äú2¿μ÷óÃ)
u8 my_mem_free(u8 memx,u32 offset); //Äú′æêí·Å(Äú2¿μ÷óÃ)
u8 my_mem_perused(u8 memx); //»ñμÃÄú′æê1óÃÂê(ía/Äú2¿μ÷óÃ)
////////////////////////////////////////////////////////////////////////////////
//óû§μ÷óÃoˉêy
void myfree(u8 memx,void *ptr); //Äú′æêí·Å(ía2¿μ÷óÃ)
void *mymalloc(u8 memx,u32 size); //Äú′æ·ÖÅä(ía2¿μ÷óÃ)
void *myrealloc(u8 memx,void *ptr,u32 size);//ÖØD·ÖÅäÄú′æ(ía2¿μ÷óÃ)
#endif
[/mw_shl_code] |
|