21.2.2 ffsystem.c文件的修改
(1)內存分配ff_memalloc
void* ff_memalloc( UINT msize )
{
return ( void* )mymalloc( SRAMIN, msize ) ;
}
(2)內存釋放ff_memfree
void ff_memfree( void* mblock )
{
myfree( SRAMIN, mblock ) ;
}
21.2.3 exfuns.c與exfuns.h文件的創(chuàng)建
(1)創(chuàng)建exfuns.h文件,并輸入以下代碼。
#ifndef _EXFUNS_H
#define _EXFUNS_H
#include "sys.h"
#include "ff.h"
extern FATFS *fs[ FF_VOLUMES ] ;
extern FIL *file;
extern FIL *ftemp;
extern UINT br,bw;
extern FILINFO fileinfo;
extern DIR dir;
u8 exfuns_init( void ) ; //為exfuns申請內存
u8 exf_getfree( u8 *drv, u32 *total, u32 *free ) ; //得到磁盤總容量和剩余容量
#endif
(2)創(chuàng)建exfuns.c文件,并輸入以下代碼。
#include "exfuns.h"
#include "malloc.h"
FATFS *fs[ FF_VOLUMES ] ; //邏輯磁盤工作區(qū)
FIL *file ; //文件1
FIL *ftemp ; //文件2
UINT br, bw ; //讀寫變量
FILINFO fileinfo ; //文件信息
DIR dir ; //目錄
u8 *fatbuf ; //SD卡數據緩存區(qū)
u8 exfuns_init()
{
u8 i;
for( i=0; i
{
//為磁盤i工作區(qū)申請內存
fs[ i ] = ( FATFS* )mymalloc( SRAMIN, sizeof( FATFS ) ) ;
if( !fs[ i ] )
break ;
}
file = ( FIL* )mymalloc( SRAMIN, sizeof( FIL ) ) ; //為file申請內存
ftemp = ( FIL* )mymalloc( SRAMIN, sizeof( FIL ) ) ; //為ftemp申請內存
fatbuf = ( u8* )mymalloc( SRAMIN, 512 ) ; //為fatbuf申請內存
//申請有一個失敗,即失敗
if( ( i==FF_VOLUMES )&&file&&ftemp&&fatbuf )
return 0 ;
else
return 1 ;
}
u8 exf_getfree( u8 *drv, u32 *total, u32 *free )
{
FATFS *fs1;
u8 res;
u32 fre_clust=0, fre_sect=0, tot_sect=0;
//得到磁盤信息及空閑簇數量
res = ( u32 )f_getfree( ( const TCHAR* )drv, ( DWORD* )&fre_clust, &fs1 ) ;
if( res==0 )
{
tot_sect =( fs1->n_fatent-2 )*fs1->csize ; //得到總扇區(qū)數
fre_sect = fre_clust*fs1->csize ; //得到空閑扇區(qū)數
//扇區(qū)大小不是512字節(jié),則轉換為512字節(jié)
#if FF_MAX_SS!=512
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif
*total=tot_sect>>1 ; //單位為KB
*free=fre_sect>>1 ; //單位為KB
}
return res;
}
注:如果SD卡文件系統(tǒng)不能正確掛載則需要修改SD卡驅動文件中的兩個參數,如下圖所示。
21.3 內存管理
21.3.1 內存管理簡介
內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當的時候釋放和回收內存資源。內存管理的實現方法有很多種,他們其實最終都是要實現2個函數:malloc和free;malloc函數用于內存申請,free函數用于內存釋放。
這一部分我們使用了一種比較簡單的辦法來實現:分塊式內存管理。下面我們介紹一下該方法的實現原理,如下圖所示。
從上圖可以看出,分塊式內存管理由內存池和內存管理表兩部分組成。內存池被等分為n塊,對應的內存管理表,大小也為n,內存管理表的每一個項對應內存池的一塊內存。內存管理表的項值代表的意義為:當該項值為0的時候,代表對應的內存塊未被占用,當該項值非零的時候,代表該項對應的內存塊已經被占用,其數值則代表被連續(xù)占用的內存塊數。比如某項值為10,那么說明包括本項對應的內存塊在內,總共分配了10個內存塊給外部的某個指針。
內存分配方向如圖所示,是從頂到底的分配方向。即首先從最末端開始找空內存。當內存管理剛初始化的時候,內存表全部清零,表示沒有任何內存塊被占用。
21.3.2 分配原理
當指針p調用malloc申請內存的時候,先判斷p要分配的內存塊數m,然后從第n項開始,向下查找,直到找到m塊連續(xù)的空內存塊(即對應內存管理表項為0),然后將這m個內存管理表項的值都設置為m(標記被占用),最后,把最后的這個空內存塊的地址返回指針p,完成一次分配。注意,如果當內存不夠的時候(找到最后也沒找到連續(xù)的m塊空閑內存),則返回NULL給p,表示分配失敗。
21.3.3 釋放原理
當p申請的內存用完,需要釋放的時候,調用free函數實現。free函數先判斷p指向的內存地址所對應的內存塊,然后找到對應的內存管理表項目,得到p所占用的內存塊數目m(內存管理表項目的值就是所分配內存塊的數目),將這m個內存管理表項目的值都清零,標記釋放,完成一次內存釋放。
21.3.4 源代碼實現
(1)創(chuàng)建malloc.h文件,并輸入以下代碼。
/*********************************************************************************************************
內 存 管 理 文 件
*********************************************************************************************************/
#ifndef _MALLOC_H_
#define _MALLOC_H_
#include "sys.h"
/*********************************************************************************************************
數 據 結 構 定 義
*********************************************************************************************************/
//定義兩個內存池
#define SRAMIN 0 //內部內存池
#define SRAMBANK 1 //定義支持的SRAM塊數
//mem1內存參數設定
#define MEM1_BLOCK_SIZE 32 //內存塊大小為32字節(jié)
#define MEM1_MAX_SIZE 40*1024 //最大管理內存40K
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE/MEM1_BLOCK_SIZE //內存表大小
//內存管理控制器
struct _m_mallco_dev
{
void ( *init )( u8 ) ; //初始化
u8 ( *perused )( u8 ) ; //內存使用率
u8 *membase[ SRAMBANK ] ; //內存池 管理SRAMBANK個區(qū)域的內存
u16 *memmap[ SRAMBANK ] ; //內存管理狀態(tài)表
u8 memrdy[ SRAMBANK ] ; //內存管理是否就緒
};
extern struct _m_mallco_dev mallco_dev; //在mallco.c里面定義
/*********************************************************************************************************
函 數 列 表
*********************************************************************************************************/
void my_mem_init( u8 memx ) ; //內存管理初始化函數
u8 my_mem_perused( u8 memx ) ; //獲得內存使用率
void myfree( u8 memx, void *ptr ) ; //內存釋放
void *mymalloc( u8 memx, u32 size ) ; //內存分配
void *myrealloc( u8 memx, void *ptr, u32 size ) ; //重新分配內存
#endif
-
單片機
+關注
關注
6035文章
44554瀏覽量
634633 -
嵌入式系統(tǒng)
+關注
關注
41文章
3587瀏覽量
129435 -
FATFS
+關注
關注
0文章
44瀏覽量
18298
發(fā)布評論請先 登錄
相關推薦
評論