OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3457|回复: 5

emwin中使用内存池及结构体链表,内存分配出现异常的问题

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-6-14
在线时间
10 小时
发表于 2019-5-27 15:09:55 | 显示全部楼层 |阅读模式
1金钱
现在我的emwin的界面调试已经成功,但是为了便于listview控件内容的加载,我在程序中增加了“结构体链表”的使用。那么就出现如下问题:
首先emwin有自带的malloc.c文件,里面有自己编写内存分配和内存释放函数。而我在创建链表时需要给节点分配内存,如果我用stm32自带的"malloc()"函数和"free()"函数,程序编译的时候会提示内存不够用;如果我用emwin里面malloc.c文件里自己写的“mymaloc()”函数和“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]);  
}  
//&#196;ú′&#230;·&#214;&#197;&#228;(&#196;ú2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//size:òa·&#214;&#197;&#228;μ&#196;&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ:0XFFFFFFFF,′ú±í′í&#206;ó;&#198;&#228;&#203;&#251;,&#196;ú′&#230;&#198;&#171;ò&#198;μ&#216;&#214;·
u32 my_mem_malloc(u8 memx,u32 size)  
{  
    signed long offset=0;  
    u32 nmemb;        //Dèòaμ&#196;&#196;ú′&#230;&#191;éêy  
        u32 cmemb=0;//á&#172;D&#248;&#191;&#213;&#196;ú′&#230;&#191;éêy
    u32 i;  
    if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//&#206;′3&#245;ê&#188;&#187;ˉ,&#207;è&#214;′DD3&#245;ê&#188;&#187;ˉ
    if(size==0)return 0XFFFFFFFF;//2&#187;Dèòa·&#214;&#197;&#228;
    nmemb=size/memblksize[memx];          //&#187;&#241;è&#161;Dèòa·&#214;&#197;&#228;μ&#196;á&#172;D&#248;&#196;ú′&#230;&#191;éêy
    if(size%memblksize[memx])nmemb++;  
    for(offset=memtblsize[memx]-1;offset>=0;offset--)//&#203;&#209;&#203;÷&#213;&#251;&#184;&#246;&#196;ú′&#230;&#191;&#216;&#214;&#198;&#199;&#248;  
    {     
                if(!mallco_dev.memmap[memx][offset])cmemb++;//á&#172;D&#248;&#191;&#213;&#196;ú′&#230;&#191;éêy&#212;&#246;&#188;ó
                else cmemb=0;                                                                //á&#172;D&#248;&#196;ú′&#230;&#191;é&#199;&#229;á&#227;
                if(cmemb==nmemb)                                                        //&#213;òμ&#189;á&#203;á&#172;D&#248;nmemb&#184;&#246;&#191;&#213;&#196;ú′&#230;&#191;é
                {
            for(i=0;i<nmemb;i++)                                          //±ê×¢&#196;ú′&#230;&#191;é·&#199;&#191;&#213;
            {  
                mallco_dev.memmap[memx][offset+i]=nmemb;  
            }  
            return (offset*memblksize[memx]);//·μ&#187;&#216;&#198;&#171;ò&#198;μ&#216;&#214;·  
                }
    }  
    return 0XFFFFFFFF;//&#206;′&#213;òμ&#189;·&#251;o&#207;·&#214;&#197;&#228;ì&#245;&#188;tμ&#196;&#196;ú′&#230;&#191;é  
}  
//êí·&#197;&#196;ú′&#230;(&#196;ú2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//offset:&#196;ú′&#230;μ&#216;&#214;·&#198;&#171;ò&#198;
//·μ&#187;&#216;&#214;μ:0,êí·&#197;3é1|;1,êí·&#197;꧰ü;  
u8 my_mem_free(u8 memx,u32 offset)  
{  
    int i;  
    if(!mallco_dev.memrdy[memx])//&#206;′3&#245;ê&#188;&#187;ˉ,&#207;è&#214;′DD3&#245;ê&#188;&#187;ˉ
        {
                mallco_dev.init(memx);   
        return 1;//&#206;′3&#245;ê&#188;&#187;ˉ  
    }  
    if(offset<memsize[memx])//&#198;&#171;ò&#198;&#212;ú&#196;ú′&#230;3&#216;&#196;ú.
    {  
        int index=offset/memblksize[memx];                        //&#198;&#171;ò&#198;&#203;ù&#212;ú&#196;ú′&#230;&#191;éo&#197;&#194;&#235;  
        int nmemb=mallco_dev.memmap[memx][index];        //&#196;ú′&#230;&#191;éêyá&#191;
        for(i=0;i<nmemb;i++)                                                  //&#196;ú′&#230;&#191;é&#199;&#229;á&#227;
        {  
            mallco_dev.memmap[memx][index+i]=0;  
        }  
        return 0;  
    }else return 2;//&#198;&#171;ò&#198;3&#172;&#199;&#248;á&#203;.  
}  
//êí·&#197;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//ptr:&#196;ú′&#230;ê×μ&#216;&#214;·
void myfree(u8 memx,void *ptr)  
{  
        u32 offset;   
        if(ptr==NULL)return;//μ&#216;&#214;·&#206;a0.  
        offset=(u32)ptr-(u32)mallco_dev.membase[memx];     
    my_mem_free(memx,offset);        //êí·&#197;&#196;ú′&#230;      
}  
//·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//size:&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ:·&#214;&#197;&#228;μ&#189;μ&#196;&#196;ú′&#230;ê×μ&#216;&#214;·.
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);  
}  
//&#214;&#216;D&#194;·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//*ptr:&#190;é&#196;ú′&#230;ê×μ&#216;&#214;·
//size:òa·&#214;&#197;&#228;μ&#196;&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ&#194;·&#214;&#197;&#228;μ&#189;μ&#196;&#196;ú′&#230;ê×μ&#216;&#214;·.
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);        //&#191;&#189;±′&#190;é&#196;ú′&#230;&#196;úèYμ&#189;D&#194;&#196;ú′&#230;   
        myfree(memx,ptr);                                                                                                            //êí·&#197;&#190;é&#196;ú′&#230;
        return (void*)((u32)mallco_dev.membase[memx]+offset);                                  //·μ&#187;&#216;D&#194;&#196;ú′&#230;ê×μ&#216;&#214;·
    }  
}
对应的malloc.h文件如下:[mw_shl_code=applescript,true]#ifndef __MALLOC_H
#define __MALLOC_H
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229;V3
//&#196;ú′&#230;1üàí &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2015/1/20
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


#ifndef NULL
#define NULL 0
#endif

//&#182;¨ò&#229;á&#189;&#184;&#246;&#196;ú′&#230;3&#216;
#define SRAMIN         0                //&#196;ú2&#191;&#196;ú′&#230;3&#216;
#define SRAMEX   1                //ía2&#191;&#196;ú′&#230;3&#216;

#define SRAMBANK         2        //&#182;¨ò&#229;&#214;§3&#214;μ&#196;SRAM&#191;éêy.       


//mem1&#196;ú′&#230;2&#206;êyéè&#182;¨.mem1íêè&#171;′|óú&#196;ú2&#191;SRAMà&#239;&#195;&#230;.
#define MEM1_BLOCK_SIZE                        32                                                            //&#196;ú′&#230;&#191;é′óD&#161;&#206;a32×&#214;&#189;ú
#define MEM1_MAX_SIZE                        40*1024                                                  //×&#238;′ó1üàí&#196;ú′&#230; 40K
#define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //&#196;ú′&#230;±í′óD&#161;

//mem2&#196;ú′&#230;2&#206;êyéè&#182;¨.mem2μ&#196;&#196;ú′&#230;3&#216;′|óúía2&#191;SRAMà&#239;&#195;&#230;
#define MEM2_BLOCK_SIZE                        32                                                            //&#196;ú′&#230;&#191;é′óD&#161;&#206;a32×&#214;&#189;ú
#define MEM2_MAX_SIZE                        960 *1024                                                  //×&#238;′ó1üàí&#196;ú′&#230;960K
#define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //&#196;ú′&#230;±í′óD&#161;
                 

//&#196;ú′&#230;1üàí&#191;&#216;&#214;&#198;&#198;÷
struct _m_mallco_dev
{
        void (*init)(u8);                                        //3&#245;ê&#188;&#187;ˉ
        u8 (*perused)(u8);                                      //&#196;ú′&#230;ê1ó&#195;&#194;ê
        u8         *membase[SRAMBANK];                                //&#196;ú′&#230;3&#216; 1üàíSRAMBANK&#184;&#246;&#199;&#248;óòμ&#196;&#196;ú′&#230;
        u16 *memmap[SRAMBANK];                                 //&#196;ú′&#230;1üàí×′ì&#172;±í
        u8  memrdy[SRAMBANK];                                 //&#196;ú′&#230;1üàíê&#199;·&#241;&#190;íD÷
};
extern struct _m_mallco_dev mallco_dev;         //&#212;úmallco.cà&#239;&#195;&#230;&#182;¨ò&#229;

void mymemset(void *s,u8 c,u32 count);        //éè&#214;&#195;&#196;ú′&#230;
void mymemcpy(void *des,void *src,u32 n);//&#184;′&#214;&#198;&#196;ú′&#230;     
void my_mem_init(u8 memx);                                //&#196;ú′&#230;1üàí3&#245;ê&#188;&#187;ˉoˉêy(ía/&#196;ú2&#191;μ÷ó&#195;)
u32 my_mem_malloc(u8 memx,u32 size);        //&#196;ú′&#230;·&#214;&#197;&#228;(&#196;ú2&#191;μ÷ó&#195;)
u8 my_mem_free(u8 memx,u32 offset);                //&#196;ú′&#230;êí·&#197;(&#196;ú2&#191;μ÷ó&#195;)
u8 my_mem_perused(u8 memx);                                //&#187;&#241;μ&#195;&#196;ú′&#230;ê1ó&#195;&#194;ê(ía/&#196;ú2&#191;μ÷ó&#195;)
////////////////////////////////////////////////////////////////////////////////
//ó&#195;&#187;§μ÷ó&#195;oˉêy
void myfree(u8 memx,void *ptr);                          //&#196;ú′&#230;êí·&#197;(ía2&#191;μ÷ó&#195;)
void *mymalloc(u8 memx,u32 size);                        //&#196;ú′&#230;·&#214;&#197;&#228;(ía2&#191;μ÷ó&#195;)
void *myrealloc(u8 memx,void *ptr,u32 size);//&#214;&#216;D&#194;·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
#endif




希望提供一下纠错思路

最佳答案

查看完整内容[请看2#楼]

问题解决:首先在网上找原因,有人说是内部ram堆的数组“__align(4) u8 mem1base[MEM1_MAX_SIZE]; #define MEM1_MAX_SIZE 40*1024 ”设置的太大了,于是将其由40K变动到4K发现问题不再出现。但是程序编译后ZI-data的占用量很大,于是就把外部SRAM和上面的数组的大小都降低的1k,然后编译,发现ZI-data的占用量还有60多K,于是就开始在map文件里面找到底哪里占用了这么多,最终定位到启动文件“starup_stm32f1ox_hd.s”文件中 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-6-14
在线时间
10 小时
 楼主| 发表于 2019-5-27 15:09:56 | 显示全部楼层
llhyuanzi614 发表于 2019-5-27 15:19
我现在在调试emwin界面,他有用的内存池,并且有自己编写的malloc.c文件,该文件自己编写了内存的分配和释 ...

问题解决:首先在网上找原因,有人说是内部ram堆的数组“__align(4) u8 mem1base[MEM1_MAX_SIZE];        #define MEM1_MAX_SIZE                        40*1024  ”设置的太大了,于是将其由40K变动到4K发现问题不再出现。但是程序编译后ZI-data的占用量很大,于是就把外部SRAM和上面的数组的大小都降低的1k,然后编译,发现ZI-data的占用量还有60多K,于是就开始在map文件里面找到底哪里占用了这么多,最终定位到启动文件“starup_stm32f1ox_hd.s”文件中        “Heap_Size       EQU     0x0000E000”        ,之前将这里改大了。于是改回“Heap_Size       EQU     0x00000200”发现问题解决了。按道理来说启动文件里面的堆开大了,是为了方便程序里堆的调用,可是“__align(4) u8 mem1base[MEM1_MAX_SIZE];”这个是全局变量,在栈里面,堆开大了,自然影响它的使用。
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-6-14
在线时间
10 小时
 楼主| 发表于 2019-5-27 15:11:26 | 显示全部楼层
不好意思,我是新手,赏金不多,又希望尽快解决问题,谢谢大家啦
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-6-14
在线时间
10 小时
 楼主| 发表于 2019-5-27 15:12:58 | 显示全部楼层
诶,为什么我描述的问题的细节提交之后看不到呢?
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
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"
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229;V3
//&#196;ú′&#230;1üàí &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2015/1/20
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


//&#196;ú′&#230;3&#216;(32×&#214;&#189;ú&#182;&#212;&#198;&#235;)
__align(4) u8 mem1base[MEM1_MAX_SIZE];                                                                                                        //&#196;ú2&#191;SRAM&#196;ú′&#230;3&#216;
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));                                        //ía2&#191;SRAM&#196;ú′&#230;3&#216;
//&#196;ú′&#230;1üàí±í
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];                                                                                                        //&#196;ú2&#191;SRAM&#196;ú′&#230;3&#216;MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));        //ía2&#191;SRAM&#196;ú′&#230;3&#216;MAP
//&#196;ú′&#230;1üàí2&#206;êy          
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE};                        //&#196;ú′&#230;±í′óD&#161;
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE};                                                //&#196;ú′&#230;·&#214;&#191;é′óD&#161;
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE};                                                                //&#196;ú′&#230;×ü′óD&#161;


//&#196;ú′&#230;1üàí&#191;&#216;&#214;&#198;&#198;÷
struct _m_mallco_dev mallco_dev=
{
        my_mem_init,                                //&#196;ú′&#230;3&#245;ê&#188;&#187;ˉ
        my_mem_perused,                                //&#196;ú′&#230;ê1ó&#195;&#194;ê
        mem1base,mem2base,                        //&#196;ú′&#230;3&#216;
        mem1mapbase,mem2mapbase,        //&#196;ú′&#230;1üàí×′ì&#172;±í
        0,0,                                                   //&#196;ú′&#230;1üàí&#206;′&#190;íD÷
};

//&#184;′&#214;&#198;&#196;ú′&#230;
//*des:&#196;&#191;μ&#196;μ&#216;&#214;·
//*src:&#212;′μ&#216;&#214;·
//nèòa&#184;′&#214;&#198;μ&#196;&#196;ú′&#230;3¤&#182;è(×&#214;&#189;ú&#206;aμ¥&#206;&#187;)
void mymemcpy(void *des,void *src,u32 n)  
{  
    u8 *xdes=des;
        u8 *xsrc=src;
    while(n--)*xdes++=*xsrc++;  
}  
//éè&#214;&#195;&#196;ú′&#230;
//*s:&#196;ú′&#230;ê×μ&#216;&#214;·
//c :òaéè&#214;&#195;μ&#196;&#214;μ
//countèòaéè&#214;&#195;μ&#196;&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú&#206;aμ¥&#206;&#187;)
void mymemset(void *s,u8 c,u32 count)  
{  
    u8 *xs = s;  
    while(count--)*xs++=c;  
}          
//&#196;ú′&#230;1üàí3&#245;ê&#188;&#187;ˉ  
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
void my_mem_init(u8 memx)  
{  
    mymemset(mallco_dev.memmap[memx], 0,memtblsize[memx]*2);//&#196;ú′&#230;×′ì&#172;±íêy&#190;Y&#199;&#229;á&#227;  
        mymemset(mallco_dev.membase[memx], 0,memsize[memx]);        //&#196;ú′&#230;3&#216;&#203;ùóDêy&#190;Y&#199;&#229;á&#227;  
        mallco_dev.memrdy[memx]=1;                                                                //&#196;ú′&#230;1üàí3&#245;ê&#188;&#187;ˉOK  
}  
//&#187;&#241;è&#161;&#196;ú′&#230;ê1ó&#195;&#194;ê
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//·μ&#187;&#216;&#214;μ:ê1ó&#195;&#194;ê(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]);  
}  
//&#196;ú′&#230;·&#214;&#197;&#228;(&#196;ú2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//size:òa·&#214;&#197;&#228;μ&#196;&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ:0XFFFFFFFF,′ú±í′í&#206;ó;&#198;&#228;&#203;&#251;,&#196;ú′&#230;&#198;&#171;ò&#198;μ&#216;&#214;·
u32 my_mem_malloc(u8 memx,u32 size)  
{  
    signed long offset=0;  
    u32 nmemb;        //Dèòaμ&#196;&#196;ú′&#230;&#191;éêy  
        u32 cmemb=0;//á&#172;D&#248;&#191;&#213;&#196;ú′&#230;&#191;éêy
    u32 i;  
    if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//&#206;′3&#245;ê&#188;&#187;ˉ,&#207;è&#214;′DD3&#245;ê&#188;&#187;ˉ
    if(size==0)return 0XFFFFFFFF;//2&#187;Dèòa·&#214;&#197;&#228;
    nmemb=size/memblksize[memx];          //&#187;&#241;è&#161;Dèòa·&#214;&#197;&#228;μ&#196;á&#172;D&#248;&#196;ú′&#230;&#191;éêy
    if(size%memblksize[memx])nmemb++;  
    for(offset=memtblsize[memx]-1;offset>=0;offset--)//&#203;&#209;&#203;÷&#213;&#251;&#184;&#246;&#196;ú′&#230;&#191;&#216;&#214;&#198;&#199;&#248;  
    {     
                if(!mallco_dev.memmap[memx][offset])cmemb++;//á&#172;D&#248;&#191;&#213;&#196;ú′&#230;&#191;éêy&#212;&#246;&#188;ó
                else cmemb=0;                                                                //á&#172;D&#248;&#196;ú′&#230;&#191;é&#199;&#229;á&#227;
                if(cmemb==nmemb)                                                        //&#213;òμ&#189;á&#203;á&#172;D&#248;nmemb&#184;&#246;&#191;&#213;&#196;ú′&#230;&#191;é
                {
            for(i=0;i<nmemb;i++)                                          //±ê×¢&#196;ú′&#230;&#191;é·&#199;&#191;&#213;
            {  
                mallco_dev.memmap[memx][offset+i]=nmemb;  
            }  
            return (offset*memblksize[memx]);//·μ&#187;&#216;&#198;&#171;ò&#198;μ&#216;&#214;·  
                }
    }  
    return 0XFFFFFFFF;//&#206;′&#213;òμ&#189;·&#251;o&#207;·&#214;&#197;&#228;ì&#245;&#188;tμ&#196;&#196;ú′&#230;&#191;é  
}  
//êí·&#197;&#196;ú′&#230;(&#196;ú2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//offset:&#196;ú′&#230;μ&#216;&#214;·&#198;&#171;ò&#198;
//·μ&#187;&#216;&#214;μ:0,êí·&#197;3é1|;1,êí·&#197;꧰ü;  
u8 my_mem_free(u8 memx,u32 offset)  
{  
    int i;  
    if(!mallco_dev.memrdy[memx])//&#206;′3&#245;ê&#188;&#187;ˉ,&#207;è&#214;′DD3&#245;ê&#188;&#187;ˉ
        {
                mallco_dev.init(memx);   
        return 1;//&#206;′3&#245;ê&#188;&#187;ˉ  
    }  
    if(offset<memsize[memx])//&#198;&#171;ò&#198;&#212;ú&#196;ú′&#230;3&#216;&#196;ú.
    {  
        int index=offset/memblksize[memx];                        //&#198;&#171;ò&#198;&#203;ù&#212;ú&#196;ú′&#230;&#191;éo&#197;&#194;&#235;  
        int nmemb=mallco_dev.memmap[memx][index];        //&#196;ú′&#230;&#191;éêyá&#191;
        for(i=0;i<nmemb;i++)                                                  //&#196;ú′&#230;&#191;é&#199;&#229;á&#227;
        {  
            mallco_dev.memmap[memx][index+i]=0;  
        }  
        return 0;  
    }else return 2;//&#198;&#171;ò&#198;3&#172;&#199;&#248;á&#203;.  
}  
//êí·&#197;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//ptr:&#196;ú′&#230;ê×μ&#216;&#214;·
void myfree(u8 memx,void *ptr)  
{  
        u32 offset;   
        if(ptr==NULL)return;//μ&#216;&#214;·&#206;a0.  
        offset=(u32)ptr-(u32)mallco_dev.membase[memx];     
    my_mem_free(memx,offset);        //êí·&#197;&#196;ú′&#230;      
}  
//·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//size:&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ:·&#214;&#197;&#228;μ&#189;μ&#196;&#196;ú′&#230;ê×μ&#216;&#214;·.
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);  
}  
//&#214;&#216;D&#194;·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
//memx:&#203;ùê&#244;&#196;ú′&#230;&#191;é
//*ptr:&#190;é&#196;ú′&#230;ê×μ&#216;&#214;·
//size:òa·&#214;&#197;&#228;μ&#196;&#196;ú′&#230;′óD&#161;(×&#214;&#189;ú)
//·μ&#187;&#216;&#214;μ&#194;·&#214;&#197;&#228;μ&#189;μ&#196;&#196;ú′&#230;ê×μ&#216;&#214;·.
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);        //&#191;&#189;±′&#190;é&#196;ú′&#230;&#196;úèYμ&#189;D&#194;&#196;ú′&#230;   
        myfree(memx,ptr);                                                                                                            //êí·&#197;&#190;é&#196;ú′&#230;
        return (void*)((u32)mallco_dev.membase[memx]+offset);                                  //·μ&#187;&#216;D&#194;&#196;ú′&#230;ê×μ&#216;&#214;·
    }  
}












[/mw_shl_code]
malloc.h文件的内容如下:
[mw_shl_code=applescript,true]#ifndef __MALLOC_H
#define __MALLOC_H
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229;V3
//&#196;ú′&#230;1üàí &#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2015/1/20
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


#ifndef NULL
#define NULL 0
#endif

//&#182;¨ò&#229;á&#189;&#184;&#246;&#196;ú′&#230;3&#216;
#define SRAMIN         0                //&#196;ú2&#191;&#196;ú′&#230;3&#216;
#define SRAMEX   1                //ía2&#191;&#196;ú′&#230;3&#216;

#define SRAMBANK         2        //&#182;¨ò&#229;&#214;§3&#214;μ&#196;SRAM&#191;éêy.       


//mem1&#196;ú′&#230;2&#206;êyéè&#182;¨.mem1íêè&#171;′|óú&#196;ú2&#191;SRAMà&#239;&#195;&#230;.
#define MEM1_BLOCK_SIZE                        32                                                            //&#196;ú′&#230;&#191;é′óD&#161;&#206;a32×&#214;&#189;ú
#define MEM1_MAX_SIZE                        40*1024                                                  //×&#238;′ó1üàí&#196;ú′&#230; 40K
#define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //&#196;ú′&#230;±í′óD&#161;

//mem2&#196;ú′&#230;2&#206;êyéè&#182;¨.mem2μ&#196;&#196;ú′&#230;3&#216;′|óúía2&#191;SRAMà&#239;&#195;&#230;
#define MEM2_BLOCK_SIZE                        32                                                            //&#196;ú′&#230;&#191;é′óD&#161;&#206;a32×&#214;&#189;ú
#define MEM2_MAX_SIZE                        960 *1024                                                  //×&#238;′ó1üàí&#196;ú′&#230;960K
#define MEM2_ALLOC_TABLE_SIZE        MEM2_MAX_SIZE/MEM2_BLOCK_SIZE         //&#196;ú′&#230;±í′óD&#161;
                 

//&#196;ú′&#230;1üàí&#191;&#216;&#214;&#198;&#198;÷
struct _m_mallco_dev
{
        void (*init)(u8);                                        //3&#245;ê&#188;&#187;ˉ
        u8 (*perused)(u8);                                      //&#196;ú′&#230;ê1ó&#195;&#194;ê
        u8         *membase[SRAMBANK];                                //&#196;ú′&#230;3&#216; 1üàíSRAMBANK&#184;&#246;&#199;&#248;óòμ&#196;&#196;ú′&#230;
        u16 *memmap[SRAMBANK];                                 //&#196;ú′&#230;1üàí×′ì&#172;±í
        u8  memrdy[SRAMBANK];                                 //&#196;ú′&#230;1üàíê&#199;·&#241;&#190;íD÷
};
extern struct _m_mallco_dev mallco_dev;         //&#212;úmallco.cà&#239;&#195;&#230;&#182;¨ò&#229;

void mymemset(void *s,u8 c,u32 count);        //éè&#214;&#195;&#196;ú′&#230;
void mymemcpy(void *des,void *src,u32 n);//&#184;′&#214;&#198;&#196;ú′&#230;     
void my_mem_init(u8 memx);                                //&#196;ú′&#230;1üàí3&#245;ê&#188;&#187;ˉoˉêy(ía/&#196;ú2&#191;μ÷ó&#195;)
u32 my_mem_malloc(u8 memx,u32 size);        //&#196;ú′&#230;·&#214;&#197;&#228;(&#196;ú2&#191;μ÷ó&#195;)
u8 my_mem_free(u8 memx,u32 offset);                //&#196;ú′&#230;êí·&#197;(&#196;ú2&#191;μ÷ó&#195;)
u8 my_mem_perused(u8 memx);                                //&#187;&#241;μ&#195;&#196;ú′&#230;ê1ó&#195;&#194;ê(ía/&#196;ú2&#191;μ÷ó&#195;)
////////////////////////////////////////////////////////////////////////////////
//ó&#195;&#187;§μ÷ó&#195;oˉêy
void myfree(u8 memx,void *ptr);                          //&#196;ú′&#230;êí·&#197;(ía2&#191;μ÷ó&#195;)
void *mymalloc(u8 memx,u32 size);                        //&#196;ú′&#230;·&#214;&#197;&#228;(ía2&#191;μ÷ó&#195;)
void *myrealloc(u8 memx,void *ptr,u32 size);//&#214;&#216;D&#194;·&#214;&#197;&#228;&#196;ú′&#230;(ía2&#191;μ÷ó&#195;)
#endif













[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-5-29 02:23:52 | 显示全部楼层
llhyuanzi614 发表于 2019-5-28 11:38
问题解决:首先在网上找原因,有人说是内部ram堆的数组“__align(4) u8 mem1base[MEM1_MAX_SIZE];        #defin ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表