OpenEdv-开源电子网

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

内存管理问题

[复制链接]

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
发表于 2016-12-12 08:30:52 | 显示全部楼层 |阅读模式
最近使用用到动态数组,看了原子哥的内存管理试验的视频,使用MYMALLOC 申请和myfree释放     使用过程中查看内存占用率,下图给出我的程序部分  ,发现内存占用率一直增加  ,而且幅度都很大,  大神们帮我看看  哪里出问题了。(使用的芯片是STM32f103vct6)请大神帮忙看看   谢谢   感激不尽!!
QQ截图20161212082153.png
QQ截图20161209161004.png
QQ截图20161212082922.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 08:43:16 | 显示全部楼层
中间的for循环是读取eeprom中的数据的
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 09:41:41 | 显示全部楼层
大神快来帮帮我a
回复 支持 反对

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1765
金钱
1765
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-12 11:42:43 | 显示全部楼层
从代码上看,不是这部分的问题,mymalloc申请了200字节,除以200/10*1024 ≈2%,从串口打印来看,申请和释放是没有问题的,你应该全局找下有没有其它地方调用了mymalloc, 或者内存管理的实现有没有bug
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 13:04:04 | 显示全部楼层
zc123 发表于 2016-12-12 11:42
从代码上看,不是这部分的问题,mymalloc申请了200字节,除以200/10*1024 ≈2%,从串口打印来看,申请和释 ...

我代码中也只有这个地方用到这个内存调用函数    但是每次一进入这个函数后  打印出来的内存占用率都会多30%     会多出来3000个字节!!!    其他地方也没有用函数申请调用过内存呀
回复 支持 反对

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1765
金钱
1765
注册时间
2015-6-11
在线时间
312 小时
发表于 2016-12-12 13:14:55 | 显示全部楼层
jixiangyu 发表于 2016-12-12 13:04
我代码中也只有这个地方用到这个内存调用函数    但是每次一进入这个函数后  打印出来的内存占用率都会多 ...

内存管理代码你改动过没?
回复 支持 反对

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8017
金钱
8017
注册时间
2014-8-13
在线时间
1594 小时
发表于 2016-12-12 13:18:57 | 显示全部楼层
jixiangyu 发表于 2016-12-12 13:04
我代码中也只有这个地方用到这个内存调用函数    但是每次一进入这个函数后  打印出来的内存占用率都会多 ...

把每次的申请和释放以及申请和释放的参数、地址都打印出来详细分析吧。
不要仅仅打印使用量。

如果仅仅是这里使用了内存管理的话,那就是细节问题了,得详细掰扯。
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 13:32:09 | 显示全部楼层
zc123 发表于 2016-12-12 13:14
内存管理代码你改动过没?

没有  只是改动了一下 那个最大管理内存   这个和芯片的型号没关系吧?
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 13:34:45 | 显示全部楼层
本帖最后由 jixiangyu 于 2016-12-12 13:37 编辑

#include "malloc.h"            



__align(4) u8 membase[MEM_MAX_SIZE];                     

u16 memmapbase[MEM_ALLOC_TABLE_SIZE];                     
      
const u32 memtblsize=MEM_ALLOC_TABLE_SIZE;            
const u32 memblksize=MEM_BLOCK_SIZE;                     
const u32 memsize=MEM_MAX_SIZE;                                       



struct _m_mallco_dev mallco_dev=
{
        mem_init,                        
        mem_perused,           
        membase,                        
        memmapbase,                        
        0,                              
};


void mymemcpy(void *des,void *src,u32 n)  
{  
    u8 *xdes=des;
        u8 *xsrc=src;
    while(n--)*xdes++=*xsrc++;  
}  


void mymemset(void *s,u8 c,u32 count)  
{  
    u8 *xs = s;  
    while(count--)*xs++=c;  
}           
//Äú′æ1üàí3õê¼»ˉ  void mem_init(void)  
{  
    mymemset(mallco_dev.memmap, 0,memtblsize*2);
        mymemset(mallco_dev.membase, 0,memsize);      
        mallco_dev.memrdy=1;                                            
}  

u8 mem_perused(void)  
{  
    u32 used=0;  
    u32 i;  
    for(i=0;i<memtblsize;i++)  
    {  
        if(mallco_dev.memmap)used++;
    }
    return (used*100)/(memtblsize);  
}  

u32 mem_malloc(u32 size)  
{  
    signed long offset=0;  
    u16 nmemb;      
        u16 cmemb=0;
    u32 i;  
    if(!mallco_dev.memrdy)mallco_dev.init();      
    if(size==0)return 0XFFFFFFFF;                           
    nmemb=size/memblksize;                                          
    if(size%memblksize)nmemb++;  
    for(offset=memtblsize-1;offset>=0;offset--)      
    {     
                if(!mallco_dev.memmap[offset])cmemb++;        
                else cmemb=0;                                                      
                if(cmemb==nmemb)                                               
                {
            for(i=0;i<nmemb;i++)                                
            {  
                mallco_dev.memmap[offset+i]=nmemb;  
            }  
            return (offset*memblksize);                       
                }
    }  
    return 0XFFFFFFFF;
}  



u8 mem_free(u32 offset)  
{  
    int i;  
    if(!mallco_dev.memrdy)
        {
                mallco_dev.init();   
        return 1;
    }  
    if(offset<memsize)
    {  
        int index=offset/memblksize;               
        int nmemb=mallco_dev.memmap[index];      
        for(i=0;i<nmemb;i++)                              
        {  
            mallco_dev.memmap[index+i]=0;  
        }
        return 0;  
    }else return 2;
}  

void myfree(void *ptr)  
{  
        u32 offset;  
    if(ptr==NULL)return;
         offset=(u32)ptr-(u32)mallco_dev.membase;  
    mem_free(offset);     
}  

void *mymalloc(u32 size)  
{  
    u32 offset;                                                                                
        offset=mem_malloc(size);                                                
    if(offset==0XFFFFFFFF)return NULL;  
    else return (void*)((u32)mallco_dev.membase+offset);  
}  

void *myrealloc(void *ptr,u32 size)  
{  
    u32 offset;  
    offset=mem_malloc(size);  
    if(offset==0XFFFFFFFF)return NULL;     
    else  
    {                                                                             
            mymemcpy((void*)((u32)mallco_dev.membase+offset),ptr,size);     
        myfree(ptr);                                                                                                
        return (void*)((u32)mallco_dev.membase+offset);                    
    }  
}











回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 16:12:58 | 显示全部楼层
找到原因了   申请完之后没有进行初始化    初始化后内存就不会一直增加了
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-9
在线时间
13 小时
 楼主| 发表于 2016-12-12 17:13:43 | 显示全部楼层
谢谢大家
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 05:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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