?? filesystem.c
字號(hào):
#include "stdio.h"
#include "stdlib.h"
#include "type.h"
#include "filesystem.h"
#include "flash.h"
#include "main.h"
/****************************************************************************************************/
//以下為文件系統(tǒng)需要的變量和函數(shù)
FILE_HEAD fileFlash[1];
FILE_HEAD fileHost[1];
FILE_OPEN fileOpenTmp[1];
uint16 filePtr,fileNextPtr,fileEndPtr;
uint16 fileTmpLen;
uint8 FILEHeadCompare()
{
if( fileFlash->dirID[0] != fileHost->dirID[0] ||
fileFlash->dirID[1] != fileHost->dirID[1] ||
fileFlash->fileID[0] != fileHost->fileID[0] ||
fileFlash->fileID[1] != fileHost->fileID[1] )
{
return FILE_HEAD_NOT_EQU;
}
return FILE_HEAD_EQU;
}
// 參數(shù) mode: 0-> FREE文件 1 ->普通文件
uint8 FILELocateID(uint8 mode)
{
filePtr = FILE_BASE_ADDR;
/* 讀取filePtr處的文件頭信息 */
FLASHRead(filePtr,(uint8 *)fileFlash,8);
do
{
/* 驗(yàn)證當(dāng)前文件頭信息的正確性 */
if(fileFlash->type > TEA_TYPE) return FILE_LOCATE_ERR; /* 文件頭信息錯(cuò)誤,返回*/
// 需要定位的對(duì)象不同,讀取到FREE文件的時(shí)候返回結(jié)果有所區(qū)別
if(fileFlash->type == FREE_TYPE)
{
if(mode == 0)
{
return FILE_LOCATE_OK; /* 定位到FREE文件,返回*/
}
else
{
return FILE_LOCATE_END; /* 定位到FREE文件,返回*/
}
}
if(FILE_HEAD_NOT_EQU == FILEHeadCompare((uint8 *)fileFlash,(uint8 *)fileHost))
{
// 定位下一個(gè)文件的地址,并讀取該文件的頭信息到fileFlash
FILELocateID_FindNext:
fileNextPtr = filePtr;
if(FILE_LOCATE_ERR == FILELocateNext())
{
return FILE_LOCATE_ERR; /* 如果下一個(gè)文件的地址定位出錯(cuò),返回定位錯(cuò)誤 */
}
filePtr = fileNextPtr;
continue;
}
// 文件頭信息相同的情況下有一個(gè)特殊,存在著0000,0000的非FREE文件
if(mode == FILE_LOCATE_FREE)
{
// 需要定位的不是FREE文件,雖然ID相同,但是type不同 繼續(xù)尋找下一個(gè)文件
goto FILELocateID_FindNext;
}
return FILE_LOCATE_OK; /* 找到匹配ID */
}while(1);
return FILE_LOCATE_ERR; /* 文件系統(tǒng)出錯(cuò) */
}
void FILEInit()
{
uint16 i;
for(i=0;i<16 * 1024;i+=512)
{
FLASHPageErase(i);
}
RamSet((uint8 *)fileFlash, 0, 8);
fileFlash->length[0] = 0x20;
FLASHWrite(FILE_BASE_ADDR, (uint8 *)fileFlash,8);
}
uint8 FILEList(uint8 mode)
{
uint8 i=0;
if(mode == 0)
{
filePtr = FILE_BASE_ADDR;
}
do
{
FLASHRead(filePtr,(uint8 *)fileFlash, 8);
if(fileFlash->type > TEA_TYPE) return FILE_LIST_ERR;
RamCopy(sysTemp + i,(uint8 *)fileFlash,8);
i += 8;
if(i==64)
{
return FILE_LIST_OK;
}
if(fileFlash->type == FREE_TYPE) return FILE_LIST_OK;
filePtr += 8; /* 文件頭信息長(zhǎng)度 */
filePtr += fileFlash->length[0] * 256 + fileFlash->length[1];
if(filePtr > FILE_END_ADDR) return FILE_LIST_ERR;
}while(1);
}
uint8 FILECreateItem()
{
// 檢測(cè)flash中是否存在相同的FILE
switch (FILELocateID(FILE_LOCATE_FILE))
{
case FILE_LOCATE_OK:
return ERROR_INDEX; // 返回參數(shù)錯(cuò)誤
break;
case FILE_LOCATE_ERR:
return ERROR_PROGRAM; // 返回程序錯(cuò)誤
break;
case FILE_LOCATE_END:
// FLASH中沒(méi)有發(fā)現(xiàn)相同ID的文件,開(kāi)始創(chuàng)建文件
// 調(diào)用FILELocateID 后 filePtr保存當(dāng)前文件頭信息的首地址
// 從filePtr處開(kāi)始清空FLASH,長(zhǎng)度為頭文件長(zhǎng)度(8) + 文件長(zhǎng)度 + free文件長(zhǎng)度(8)
fileTmpLen = 16;
fileTmpLen += fileHost->length[0] * 256;
fileTmpLen += fileHost->length[1];
FLASHClear(filePtr,fileTmpLen);
FLASHWrite(filePtr,(uint8 *)fileHost,8); // 寫入文件頭信息
filePtr += fileTmpLen;
filePtr -= 8;
// 準(zhǔn)備寫入FREE文件
// fileFlash中存放的是原來(lái)的FREE文件信息,所以只要更新一下文件剩余長(zhǎng)度即可
fileTmpLen = FILE_END_ADDR -filePtr;
fileFlash->length[0] = fileTmpLen >> 8;
fileFlash->length[1] = fileTmpLen & 0x00ff;
FLASHWrite(filePtr,(uint8 *)fileFlash,8); // 寫入FREE文件
return RIGHT_TOKEN; //文件創(chuàng)建成功
break;
}
}
uint8 FILELocateNext()
{
// 由fileNextPtr決定,下一個(gè)文件
fileNextPtr += 8;
fileNextPtr += fileFlash->length[0] * 256;
fileNextPtr += fileFlash->length[1];
// 判斷下一個(gè)文件的有效性
if(fileNextPtr > FILE_END_ADDR)
{
return FILE_LOCATE_ERR;
}
FLASHRead(fileNextPtr,(uint8 *)fileFlash,8);
if(fileFlash->type > TEA_TYPE) return FILE_LOCATE_ERR;
if (fileFlash->type == FREE_TYPE) return FILE_LOCATE_END;
return FILE_LOCATE_OK; // 定位正確
}
// 刪除fileHost中指定的文件
uint8 FILEDelt()
{
uint16 fileIndex1,fileIndex2;
//定位文件
switch(FILELocateID(FILE_LOCATE_FILE))
{
case FILE_LOCATE_OK:
//找到匹配文件 確認(rèn)權(quán)限后 刪除
//定位下一個(gè)文件的位置
fileNextPtr = filePtr;
switch (FILELocateNext())
{
case FILE_LOCATE_OK:
// 下一個(gè)文件有效,進(jìn)行刪除操作
// 為了加快flash移動(dòng)速度,定位FREE文件地址
fileIndex1 = filePtr;
fileIndex2 = fileNextPtr;
RamSet((uint8 *)fileHost,0,8); // 清空f(shuō)ileHost中的文件ID信息,準(zhǔn)備查找free文件地址
if(FILE_LOCATE_OK !=FILELocateID(FILE_LOCATE_FREE))
{
// 沒(méi)有找到FREE文件
return ERROR_PROGRAM;
}
// FREE文件定位正確
fileTmpLen = filePtr - fileIndex2; // 需要移動(dòng)數(shù)據(jù)的長(zhǎng)度
fileTmpLen += 8; // 把FREE文件一起移動(dòng),便于重新定位,更新
FLASHMove(fileIndex1,fileIndex2,fileTmpLen);
// 重新定位free文件,更改剩余空間長(zhǎng)度
FILELocateID(FILE_LOCATE_FREE);
fileTmpLen = FILE_END_ADDR - filePtr;
fileFlash->length[0] = fileTmpLen >>8 ;
fileFlash->length[1] = fileTmpLen & 0x00ff;
FLASHUpdate(filePtr,(uint8 *)fileFlash,8);
return RIGHT_TOKEN;
break;
case FILE_LOCATE_ERR:
// 文件系統(tǒng)錯(cuò)誤,返回程序錯(cuò)誤
return ERROR_PROGRAM;
break;
case FILE_LOCATE_END:
// 下一個(gè)文件是FREE文件,直接把FREE文件覆蓋到filePtr處
// 簡(jiǎn)化操作
RamSet((uint8 *)fileFlash,0,8);
fileTmpLen = FILE_END_ADDR -filePtr;
fileFlash->length[0] = fileTmpLen >> 8;
fileFlash->length[1] = fileTmpLen & 0x00ff;
FLASHUpdate(filePtr,(uint8 *)fileFlash,8);
return RIGHT_TOKEN; // 操作正確
break;
}
break;
case FILE_LOCATE_ERR:
// 文件系統(tǒng)錯(cuò)誤,返回程序錯(cuò)誤
return ERROR_PROGRAM;
break;
case FILE_LOCATE_END:
// 沒(méi)有匹配文件,返回參數(shù)錯(cuò)誤
return ERROR_INDEX;
break;
}
}
uint8 FILEOpen()
{
switch (FILELocateID(FILE_LOCATE_FILE))
{
case FILE_LOCATE_OK:
// 找到文件
fileOpenTmp->address = filePtr + 8;
fileOpenTmp->length = fileFlash->length[0] * 256 + fileFlash->length[1];
fileOpenTmp->authority = fileFlash->authority;
fileOpenTmp->type = fileFlash->type;
return RIGHT_TOKEN;
break;
case FILE_LOCATE_ERR:
// 文件系統(tǒng)錯(cuò)誤
return ERROR_PROGRAM;
break;
case FILE_LOCATE_END:
// 找不到文件
return ERROR_INDEX;
break;
}
}
uint8 FILERead()
{
// 檢驗(yàn)是否已經(jīng)打開(kāi)文件
if((fileOpenTmp->address = 0) || (fileOpenTmp->address > FILE_END_ADDR))
{
return ERROR_NOTOPEN; // 未打開(kāi)文件
}
// 檢驗(yàn)權(quán)限
// 判斷參數(shù)是否正確
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -