3 軟件設計
利用SD卡控制器驅動的接口函數,在其讀寫的基礎上應用FAT16文件系統,實現SD卡文件操作(如獲取目錄/文件信息、讀文件、刪除文件、創建文件、追加文件等)以便于與PC機及其他多媒體設備進行數據交換。設計中使用實時多任務嵌入式操作系統?滋C/OS-II,以降低系統軟件設計的復雜度和提高系統的穩定性[6],并設計多個任務,實現SD卡初始化、文件讀取、數據流控制。
3.1 FAT16文件系統實現
3.1.1 讀文件
文件系統中文件數據的存放是以簇為單位的,而SD卡的基本讀寫單位是扇區,所以需要根據簇號計算相應的扇區號,由文件系統結構可得一般的計算公式為:
起始扇區號=隱藏扇區數+保留扇區數+2×FAT表占用扇區數+FDT表占用扇區數+(起始簇號-2)×每簇扇區數
從SD卡的數據扇區中讀取指定文件的核心代碼為:
clunum = ffdt.fst_clu; /*獲取下一個簇號*/
do{
secnum = get_sta_sec(clunum); /*由起始簇號獲得
起始扇區*/
clunum = fat[clunum]; /*獲取下一個簇號*/
for(i=0; i《gbpb.sec_per_chus; i++) /*從SD卡中
讀取一簇數據*/
{ret = sd_read(rsv, secnum+(UINT32)i);
…
for(j=0; j《512; j++)fdata[count++] = rsv[j];}
}while(clunum != 0xFFFF);
3.1.2 長文件名支持
具有長文件名的一個文件或目錄實際對應著多個目錄登記項(FDT),由幾個長文件名和一個別名組成。作為別名的短文件名以傳統的8.3文件名格式存儲在一個FDT中,其余的幾個長文件名則存儲在屬性標志為0x0FH的FDT中。每個這種登記項中可以存儲13個字符,當讀取文件或目錄時,操作系統會將它們重組成可以包含小寫字母的長文件名[7]。實現思路為:獲取文件及目錄信息時,記錄屬性為0x0F的登記項中的內容直到出現屬性為0x01或0x02的登記項,然后從之前記錄的登記項內容中得出真正的文件或目錄名。支持長文件名的FDT結構定義如下:
struct _longname_fdt_{
UINT8 name[2048]; /*文件名*/
UINT16 nlen; /*文件名的實際長度*/
UINT8 attr; /*屬性*/
UINT8 rsvd_data[10]; /*保留數據*/
UINT16 wrt_time; /*最后更新時間*/
UINT16 wrt_date; /*最后更新日期*/
UINT16 fst_clu; /*第一簇*/
UINT32 file_size; /*文件大小*/};
typedef struct _fdt_ FDT;
3.2 μC/OS-II任務劃分
在Nios II IDE集成開發環境中整合了?滋C/OS-II操作系統,集成該操作系統后,根據系統的功能和軟硬件功能模塊設計多個任務,各個任務間通過信號量、全局變量等方式進行通信[8]。任務調度示意圖如圖6所示。
評論