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