www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]對于固態(tài)存儲器,其存儲容量可以很大,往往需要一款文件系統(tǒng)對存儲器用戶數(shù)據(jù)進(jìn)行組織文件的管理。它對文件存儲器空間進(jìn)行組織和分配,負(fù)責(zé)文件的存儲并對存入的文件進(jìn)行保護(hù)和檢索。在嵌入式系統(tǒng)中,往往需要采用wi

對于固態(tài)存儲器,其存儲容量可以很大,往往需要一款文件系統(tǒng)對存儲器用戶數(shù)據(jù)進(jìn)行組織文件的管理。它對文件存儲器空間進(jìn)行組織和分配,負(fù)責(zé)文件的存儲并對存入的文件進(jìn)行保護(hù)和檢索。在嵌入式系統(tǒng)中,往往需要采用windows兼容的文件系統(tǒng),像相機(jī)的照片、視頻監(jiān)控、語音產(chǎn)品等,很多都需要從windows計(jì)算機(jī)上提取資源或在windows計(jì)算機(jī)上進(jìn)一步處理。Fatfs由于其開源免費(fèi),支持fat32,受到了廣泛的應(yīng)用,筆者此處就s3c2416移植Fatfs,對sd卡進(jìn)行讀寫訪問作一個(gè)簡單的介紹。

1. Fatfs概述

Fatfs是由日本工程師ChaN所編寫的fat文件系統(tǒng)模塊,從06年發(fā)布第一個(gè)Fatfs版本開始,作者就從未停止維護(hù)和更新。Fatfs的編寫遵循ANSI C,并且完全與磁盤I/O層分開。它不依賴于硬件架構(gòu),代碼和工作區(qū)占用空間小,使之可以嵌入到各個(gè)低成本的微控制器中,如AVR、8051、PIC、ARM、Z80、68K等。

2. 代碼準(zhǔn)備

Fatfs源碼,請讀者自行從Fatfs官網(wǎng)http://elm-chan.org/fsw/ff/00index_e.html下載最新的源碼。

s3c2416啟動代碼工程,啟動代碼是s3c2416/50/51這系列arm9芯片在運(yùn)行用戶c代碼main函數(shù)之前必須先運(yùn)行的代碼,啟動代碼支持sd、Nand啟動,為用戶設(shè)置系統(tǒng)時(shí)鐘,初始化內(nèi)存,自動識別啟動設(shè)備并搬移代碼到RAM,MMU映射,中斷管理等,用戶只需專注于用c開發(fā)其它功能函數(shù)即可。關(guān)于啟動代碼以及啟動代碼的實(shí)現(xiàn)過程,筆者前面章節(jié)有非常詳細(xì)的介紹。此處以GCC下移植Fatfs為講解,下載”GCC啟動代碼工程應(yīng)用實(shí)例”中的啟動代碼源碼即可。如果在MDK下開發(fā),下載”MDK啟動代碼工程應(yīng)用實(shí)例”中的啟動代碼源碼。

用戶代碼,用c開發(fā)的所有功能代碼,其中,用戶代碼入口為main()函數(shù),在這里需要實(shí)現(xiàn)sd卡驅(qū)動模塊等。

3. 工程搭建

在linux操作系統(tǒng)下任一路徑下新建一個(gè)Fatfs_GCC的工程目錄,該目錄下新建Fatfs目錄,下載Fatfs最新源碼并解壓,把src目錄內(nèi)容全部拷貝到Fatfs目錄下。

把啟用代碼目錄start_code拷貝到Fatfs_GCC目錄下,這部分代碼無需任何的修改。并保留其中的Makefile這些文件,按照Makefile的模板添加各個(gè)目錄的Makefile。GCC啟動代碼下的工程管理Makefile提取自uboot,可以方便地增加源代碼以及代碼目錄。

在Fatfs_GCC目錄下新建apps目錄,用來保存應(yīng)用相關(guān)的源碼以及各個(gè)模塊驅(qū)動。

4. Fatfs移植

Fatfs模塊完全獨(dú)立于磁盤I/O層,因此底層磁盤I/O訪問并不屬于Fatfs的模塊部分,用戶必須自己實(shí)現(xiàn)這部分用來訪問存儲設(shè)備。通常在diskio.c中實(shí)現(xiàn)這六個(gè)函數(shù)disk_initialize()、disk_status()、disk_read()、disk_wirte()、disk_ioctl()、get_fattime()即可。如果使能了OS相關(guān)的特性,則還需額外實(shí)現(xiàn)進(jìn)程/內(nèi)存函數(shù)。sd卡底層驅(qū)動實(shí)現(xiàn)在前面的章節(jié)有詳細(xì)的介紹,此處直接在Fatfs移植接口中調(diào)用sd驅(qū)動模塊中的相關(guān)函數(shù)。

4.1. disk_initialize函數(shù)

初始化存儲設(shè)備,若設(shè)備初始化成功,應(yīng)清除STA_NOINIT這個(gè)標(biāo)志返回。若初始化不成功,應(yīng)置位STA_NOINIT標(biāo)志再返回。如果在初始化時(shí),未檢測到卡,可設(shè)置STA_NODISK標(biāo)志表明無卡,檢測到寫保護(hù),可設(shè)置STA_PROTECT標(biāo)志表明寫保護(hù)。

static DSTATUS State = STA_NOINIT;

DSTATUS disk_initialize (

BYTE pdrv /* Physical drive nmuber (0..) */

)

{

if (pdrv != 0) {

return STA_NOINIT; // 僅支持driver0

}

if (!Hsmmc_Init()) { // 調(diào)用sd卡初始化

State &= ~STA_NOINIT; // 初始化成功

} else {

State |= STA_NOINIT;

}

return State;

}

4.2. disk_status函數(shù)

獲取設(shè)備的狀態(tài),返回STA_NOINIT、STA_NODISK、STA_PROTECT這三個(gè)標(biāo)志的組合。磁盤設(shè)備的狀態(tài)隨時(shí)都可能發(fā)生變化,例如初始化后的sd卡在某一時(shí)刻被拔出,此時(shí)無卡,F(xiàn)atfs通過disk_status函數(shù)重新獲知STA_NODISK無卡這一標(biāo)志。

DSTATUS disk_status (

BYTE pdrv /* Physical drive nmuber (0..) */

)

{

if (pdrv != 0) {

return STA_NOINIT; // 僅支持driver0

}

return State;

}

4.3. disk_read函數(shù)

讀取扇區(qū),F(xiàn)atfs通過該函數(shù)從磁盤某一扇區(qū)地址開始獲取一塊或多塊扇區(qū)的數(shù)據(jù),F(xiàn)atfs最多支持一次性讀寫128個(gè)扇區(qū)的數(shù)據(jù),通常磁盤都支持多塊讀、多塊寫,并且這樣的讀寫性能遠(yuǎn)遠(yuǎn)好于分單塊的讀寫。

DRESULT disk_read (

BYTE pdrv, /* Physical drive nmuber (0..) */

BYTE *buff, /* Data buffer to store read data */

DWORD sector, /* Sector address (LBA) */

UINT count /* Number of sectors to read (1..128) */

)

{

if (pdrv || !count) {

return RES_PARERR;

}

if (State & STA_NOINIT) {

return RES_NOTRDY;

}

if (!Hsmmc_ReadBlock(buff, sector,count)) {

return RES_OK; // 讀取成功

} else {

return RES_ERROR; // 讀取出錯(cuò)

}

}

4.4. disk_wirte函數(shù)

寫扇區(qū),F(xiàn)atfs通過該函數(shù)從磁盤某一扇區(qū)地址開始寫入一塊或多塊扇區(qū)的數(shù)據(jù)。如果只讀(_FS_READONLY == 1),可以不實(shí)現(xiàn)該函數(shù)。

#if _USE_WRITE

DRESULT disk_write (

BYTE pdrv, /* Physical drive nmuber (0..) */

const BYTE *buff, /* Data to be written */

DWORD sector, /* Sector address (LBA) */

UINT count /* Number of sectors to write (1..128) */

)

{

if (pdrv || !count) {

return RES_PARERR;

}

if (State & STA_NOINIT) {

return RES_NOTRDY;

}

if (State & STA_PROTECT) {

return RES_WRPRT;

}

if (!Hsmmc_WriteBlock((unsignedchar *)buff, sector, count)) {

return RES_OK; // 寫成功

} else {

return RES_ERROR; // 寫錯(cuò)誤

}

}

#endif

4.5. disk_ioctl函數(shù)

控制設(shè)備相關(guān)的功能,F(xiàn)atfs使用5個(gè)設(shè)備獨(dú)立的命令控制/獲取設(shè)備特定的功能。

CTRL_SYNC:寫同步,在關(guān)閉文件等操作時(shí),如果磁盤I/O口層使用了寫緩存,那么通知磁盤I/O口層把寫緩存中的數(shù)據(jù)寫回到磁盤中。對于沒有寫緩存,即每次disk_write均寫入到磁盤中,無需處理該命令,只需返回RES_OK即可。在可寫時(shí)_FS_READONLY == 0,該命令才會被使用。

GET_SECTOR_COUNT:獲取磁盤的總扇區(qū)數(shù),在用f_mkfs()格式化文件系統(tǒng),f_fdisk對磁盤分區(qū)時(shí)均會使用這個(gè)命令來獲取磁盤的總扇區(qū)數(shù),對于sd卡,通過CSD獲取卡容量信息。在支持格式化文件系統(tǒng)或多分區(qū)的情況下(_USE_MKFS == 1 或 _MULTI_PARTITION== 1),該命令才會被使用。

GET_SECTOR_SIZE:獲取磁盤一個(gè)扇區(qū)的字節(jié)數(shù),有效值為512、1024、2048或4096。對于大部分的系統(tǒng),所有內(nèi)存卡,硬盤,通常返回扇區(qū)大小為512字節(jié),但對于flash,一頁可能為512字節(jié),也可能為1k字節(jié),2k字節(jié),4k字節(jié),需要根據(jù)具體的flash頁大小進(jìn)行配置。

GET_BLOCK_SIZE:以扇區(qū)為單位獲取擦除塊的大小。在用f_mkfs()格式化文件系統(tǒng)時(shí),用來使數(shù)據(jù)區(qū)對齊到擦除塊。例如,第一個(gè)擦除塊往往用來保存系統(tǒng)信息等,真正的數(shù)據(jù)在第二個(gè)擦除塊位置開始存放。該命令并不重要,可直接返回1表明1個(gè)扇區(qū)對齊。此處與原作者移植例程保持一致,對sd2.0版本卡,返回AU(可分配單元)的大小,sd1.0版本卡,返回擦除塊大小。在_USE_MKFS == 1時(shí),該命令才被使用。

CTRL_ERASE_SECTOR:擦除某一段扇區(qū),對于flash,都是要先擦除才能正確寫入,對于nor、nand flash,某一個(gè)文件不再使用時(shí)(例如刪除或被覆蓋),先發(fā)出這個(gè)命令強(qiáng)制設(shè)備擦除這個(gè)文件所在的空間區(qū)域,之后在disk_write無需再對flash進(jìn)行擦除操作,因?yàn)槊看挝募辉偈褂脮r(shí),都已經(jīng)先擦除了這部分。對于sd卡等,這個(gè)命令沒有任何用處,因?yàn)閟d卡接收到塊寫命令均是先擦除再寫。如果再開啟這個(gè)命令_USE_ERASE == 1,相當(dāng)重復(fù)擦除。對于sd卡,建議設(shè)置_USE_ERASE == 0,不使用這個(gè)命令。

#if _USE_IOCTL

DRESULT disk_ioctl (

BYTE pdrv, /* Physical drive nmuber (0..) */

BYTE cmd, /* Control code */

void *buff /* Buffer to send/receive control data */

)

{

unsigned char CSD[16];

unsigned charSdState[64];

unsigned int c_size,c_size_multi, read_bl_len, sector_size, au_size;

DRESULT Result =RES_ERROR;

if (pd

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

加利福尼亞庫爾弗城2024年7月16日 /美通社/ --?Snail, Inc. (納斯達(dá)克股票代碼: SNAL) (以下簡稱"蝸牛游戲"或"公司")是一家領(lǐng)先的全球獨(dú)立開發(fā)商和發(fā)行商,專注于互動數(shù)字娛樂,今日宣布方舟:...

關(guān)鍵字: iOS 安卓系統(tǒng) 移植 移動平臺

上海2023年2月16日 /美通社/ -- 近日,諾華中國宣布與中國紅十字基金會正式啟動"中國地中海貧血救助項(xiàng)目"廣西地區(qū)專項(xiàng)援助,將在當(dāng)?shù)囟ㄏ蛸Y助困難家庭地中海貧血患兒,同時(shí)通過相關(guān)醫(yī)生培...

關(guān)鍵字: BSP 控制 移植 大眾

北京2022年12月7日 /美通社/ -- 2022年12月3日,由高博醫(yī)學(xué)(血液?。V東研究中心南方春富(兒童)血液病研究院、南方醫(yī)科大學(xué)南方醫(yī)院共同主辦的高博醫(yī)學(xué)論壇·華南造血干細(xì)胞移植論壇通過線下線上...

關(guān)鍵字: 移植 HD PID 血細(xì)胞

捐款近4000萬 上海2022年12月7日 /美通社/ -- 2022年12月7日下午,中芯國際"芯肝寶貝計(jì)劃"十年紀(jì)念暨2022年度捐贈儀式在上海仁濟(jì)醫(yī)院舉行。十年來,該項(xiàng)目捐贈善款總額近4000...

關(guān)鍵字: 中芯國際 移植

北京2022年11月14日 /美通社/ -- 2022年10月,高博醫(yī)學(xué)(血液病)北京研究中心北京高博博仁醫(yī)院造血干細(xì)胞移植科迎來了五周歲"生日"。在吳彤主任帶領(lǐng)下,移植科于2017年從無到有,歷經(jīng)五...

關(guān)鍵字: 移植 OS MT CD

上海2022年11月6日 /美通社/ -- 在第五屆中國國際進(jìn)口博覽會期間,武田制藥攜5款創(chuàng)新產(chǎn)品亮相武田罕見遺傳與血液疾病領(lǐng)域?qū)霭l(fā)布會。用于移植后抗巨細(xì)胞病毒(CMV)感染或疾病治療[1]的馬立巴韋[2]迎來&quo...

關(guān)鍵字: 移植 BSP CD FDA

亙喜生物科技集團(tuán)宣布正在中國開展的、旨在全面評估GC007g治療復(fù)發(fā)/難治性急性B淋巴細(xì)胞白血病效果的1/2期注冊性臨床試驗(yàn)順利進(jìn)入2期研究階段,首例入組患者已給藥。GC007g是亙喜生物旗下的一款靶向CD19的供者來源...

關(guān)鍵字: 移植 CD

北京2022年9月9日 /美通社/ -- 諾誠健華(香港聯(lián)交所代碼:09969)今天宣布,tafasitamab (Minjuvi®)聯(lián)合來那度胺治療不適合自體干細(xì)胞移植 (ASCT) 條件的復(fù)發(fā)/難治彌漫性大B...

關(guān)鍵字: VI NJU BSP 移植

蘇州2022年8月19日 /美通社/ -- 近日,華中科技大學(xué)同濟(jì)醫(yī)學(xué)院附屬協(xié)和醫(yī)院心外科董念國教授團(tuán)隊(duì)運(yùn)用與心擎醫(yī)療聯(lián)合研發(fā)的短中期體外全磁懸浮心室輔助裝置MoyoAssist®,成功救治三例危重的終...

關(guān)鍵字: 磁懸浮 移植 IC 靜脈

上海2022年8月17日 /美通社/ -- 2022年8月16日,聚焦于基因和細(xì)胞治療的上海邦耀生物科技有限公司(以下簡稱"邦耀生物")宣布,其...

關(guān)鍵字: CD 移植 BSP ISP
關(guān)閉