打印

[分享]内存管理代码429开发板,可用于其他系统

[复制链接]
259|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稻花香1号|  楼主 | 2018-7-15 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
头文件
#ifndef __MEM_H__
#define __MEM_H__
#include "stdlib.h"
#include "stdio.h"
#include "stm32f4xx_hal.h"
#define Mem_Total_Size (32*1024*1024L) //需要用户填写
#define Mem_Block_Size (2*64*1024L)    //需要用户填写
#define Mem_Start_Addr (0xC0000000L)   //需要用户填写
#define Mem_Manage_Size (sizeof(struct Mem_Info) * Mem_Block_Num)
#define Mem_Block_Num (Mem_Total_Size/(sizeof(struct Mem_Info)+ Mem_Block_Size ))
struct Memery_Info
{
        unsigned long TotalSizes ;
        unsigned long TotalBlock ;
        unsigned long Bytes_Block ;
        unsigned long FreeSizeBytes ;
        unsigned long FreeBlock ;
        unsigned int Mem_Start ;
        unsigned int Mem_End ;
} ;
struct Mem_Info
{
        unsigned char Flag ; //0:free;1:used
        unsigned long BlkNum ;
        unsigned int Start_Addr ;
        unsigned int End_Addr ;
        unsigned char *Buff ;
} ;


extern unsigned char Init_Memery( void ) ;
extern void *Get_Mem( unsigned long Size) ;
extern unsigned char Free_Mem( void *p ) ;
#endif

实现文件

#include "mem.h"


struct Memery_Info Memry ;
struct Mem_Info Mem[Mem_Block_Num] __attribute__ ((at(Mem_Start_Addr)));;
unsigned char Mem_Buff[Mem_Block_Num][Mem_Block_Size] __attribute__ ((at(Mem_Start_Addr + Mem_Manage_Size)));
unsigned char Init_Memery( void )
{
        unsigned long i ;
        volatile unsigned int tmpreg ;
        
                tmpreg = Mem_Manage_Size + Mem_Block_Num * Mem_Block_Size ;
                if( tmpreg > Mem_Total_Size )
                {
                        tmpreg = Mem_Total_Size/(sizeof(struct Mem_Info)+Mem_Block_Size) ;                        
                        return 0 ;
                }
        Memry.TotalSizes = Mem_Total_Size ;
        Memry.TotalBlock = Mem_Block_Num ;
        Memry.Bytes_Block = Mem_Block_Size ;
        Memry.FreeSizeBytes = Mem_Total_Size ;
        Memry.Mem_Start = Mem_Start_Addr ;
        Memry.FreeBlock = Mem_Block_Num ;
        Memry.Mem_End = Mem_Start_Addr + Mem_Total_Size ;
        for(i = 0 ; i < Mem_Block_Num ; i++ )
        {
                Mem.Flag = 0 ;
                Mem.BlkNum = 0 ;
                Mem.Start_Addr = Memry.Mem_Start + i * Mem_Block_Size ;
                Mem.End_Addr = Memry.Mem_Start + ( i + 1 ) * Mem_Block_Size ;
                Mem.Buff = ( unsigned char *)&Mem_Buff[0] ;
        }
        return 1 ;
}
void *Get_Mem( unsigned long Size)
{
        volatile unsigned long i ,j ;
        volatile unsigned long NeedBlk ;
        volatile unsigned long Blktmp ;
        volatile unsigned char Flag ;
        if(Size > Memry.FreeSizeBytes)
        {
                return NULL ;
        }
        NeedBlk = ( unsigned long )( Size / Mem_Block_Size ) ;
        if( ( Size % Mem_Block_Size ) != 0 )
        {
                NeedBlk++ ;
        }
        if( NeedBlk > Memry.FreeBlock )
        {
                return NULL ;
        }
        Blktmp = 0 ;
        Flag = 0 ;
        for( i = 0 ; i < Mem_Block_Num ; i++ )
        {
                if( Mem.Flag == 0 )
                {
                        for( j = 0 ; j < NeedBlk ; j++ )
                        {
                                if( Mem[ i + j ].Flag == 0  )
                                {
                                        Blktmp++ ;
                                        if( Blktmp == NeedBlk )
                                        {
                                                Flag = 1 ;
                                                break ;
                                        }
                                }
                                else
                                {
                                        break ;
                                }
                        }
                        
                }
                if( Flag == 1 )
                {
                        break ;
                }
        }
        if( Flag == 1 )
        {
                for( j = 0 ; j < NeedBlk ; j++ )
                {
                        Mem[i+j].Flag = 1 ;                        
                }
                Mem.BlkNum = NeedBlk ;               
                Memry.FreeSizeBytes = Memry.TotalSizes - Size ;
                Memry.FreeBlock = Memry.FreeBlock - NeedBlk ;
                return (void *)Mem.Buff ;
        }
        else
        {
                return NULL ;
        }
}
unsigned char Free_Mem( void *p )
{
        unsigned char *q ;
        unsigned long i ;
        unsigned long j ;
        unsigned long tmpreg ;
        if( p==NULL )
        {
                return 0 ;
        }
        q = ( unsigned char *)p ;
        for( i = 0 ; i < Mem_Block_Num ; i++ )
        {
                if( Mem.Start_Addr == ( unsigned int )( q ) )
                {
                        if( Mem.Flag == 1 )
                        {
                                if( Mem.BlkNum == 0 )
                                {
                                        Mem.Flag = 0 ;
                                        Memry.FreeBlock++ ;
                                }
                                else
                                {
                                        tmpreg = Mem.BlkNum ;
                                        for( j = 0 ; j < tmpreg ; j++ )
                                        {
                                                Mem[i+j].Flag = 0 ;
                                                Mem[i+j].BlkNum = 0 ;
                                                Memry.FreeBlock++ ;
                                        }
                                        break ;
                                }
                        }
                        else
                        {
                                return 0 ;
                        }
                }               
        }
        p = (unsigned char *)0 ;
        return 1 ;
}


请大家批评指正

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

381

主题

382

帖子

1

粉丝