头文件
#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 ;
}
请大家批评指正 |