0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RTThread的DFS文件系統(tǒng)組件使用筆記

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 2022-11-28 20:50 ? 次閱讀

簡(jiǎn)單介紹了一下DFS代碼框架和如何在RTThread平臺(tái)上使用DFS分布式文件系統(tǒng)。工作比較忙先把目前整理的發(fā)出來,希望對(duì)小伙伴們有幫助,也希望玩過的朋友一起討論指正。等空閑下來再繼續(xù)細(xì)化深入分析一下。甚至看看能不能掛載個(gè)網(wǎng)絡(luò)文件系統(tǒng)玩玩。

  • 環(huán)境用的RTThreadStudio

  • RTThread版本:標(biāo)準(zhǔn)版4.0.3

  • 硬件平臺(tái):自己做的產(chǎn)品電路板,MCU用的STM32F407VET6


DFS分布式文件系統(tǒng)框架如下:

主要特點(diǎn):


  1. 支持多種類型的存儲(chǔ)設(shè)備。

  2. 支持多種類型的文件系統(tǒng),提供普通文件、設(shè)備文件、網(wǎng)絡(luò)文件描述符的管理。

  3. 提供統(tǒng)一的POSIX文件操作接口:read、write、poll/select等。


DFS虛擬文件系統(tǒng)文件目錄如下:


關(guān)鍵文件簡(jiǎn)單介紹如下(詳見具體的API手冊(cè)):



  • src文件夾:?dfs虛擬文件系統(tǒng)層相關(guān)代碼

  • dfs_posix.c ?對(duì)上層的調(diào)用接口代碼

  • int open(const char *file, int flags, …) ?打開文件

  • int close(int fd) ?關(guān)閉文件

  • int read(int fd, void *buf, size_t len) ?讀取文件

  • int write(int fd, const void *buf, size_t len) ?寫入文件

  • off_t lseek(int fd, off_t offset, int whence) ?移動(dòng)文件讀寫位置

  • int rename(const char old_file, const char new_file) ?重命名文件

  • int unlink(const char *pathname) ?刪除文件

  • int stat(const char file, struct stat buf) ?讀取文件信息

  • int fstat(int fildes, struct stat *buf) ?讀取文件狀態(tài)

  • int fsync(int fildes) ?把文件描述符對(duì)應(yīng)文件的緩沖區(qū)數(shù)據(jù),寫入對(duì)應(yīng)磁盤文件,清空緩存區(qū)

  • int fcntl(int fildes, int cmd, …) ?文件的ioctl接口,針對(duì)dfs層只能讀取和設(shè)置文件flags。對(duì)應(yīng)具體文件系統(tǒng),由具體文件系統(tǒng)的ioctl接口定義

  • int ioctl(int fildes, int cmd, …) ?文件的ioctl接口,內(nèi)部調(diào)用上面的fcntl,如此,對(duì)外只需調(diào)用ioctl即可

  • int ftruncate(int fd, off_t length) ?按照length長(zhǎng)度截?cái)辔募?/span>

  • int statfs(const char path, struct statfs buf) ?讀取文件系統(tǒng)信息,包括block大小,block總數(shù),剩余block數(shù),用于計(jì)算剩余空間

  • int mkdir(const char *path, mode_t mode) ?創(chuàng)建文件夾,目前mode內(nèi)部并沒有使用,無實(shí)際意義??膳渲脼?x777

  • int rmdir(const char *pathname) ?刪除文件夾

  • DIR opendir(const char name) ?打開文件夾

  • struct dirent readdir(DIR d) ?讀取文件夾,可打開一個(gè)文件夾后,連續(xù)調(diào)用此函數(shù)遍歷讀取文件夾內(nèi)所有子文件夾和文件,dirent內(nèi)的d_type表明文件類型,1為文件,2為文件夾

  • long telldir(DIR *d) ?讀取目錄流中的當(dāng)前位置(尚未測(cè)試有何用途)

  • void seekdir(DIR *d, off_t offset) ?設(shè)置目錄流中的讀寫位置(尚未測(cè)試有何用途)

  • void rewinddir(DIR *d) ?復(fù)位目錄流中的讀寫位置(尚未測(cè)試有何用途)

  • int closedir(DIR *d) ?關(guān)閉文件夾

  • int chdir(const char *path) ?更改當(dāng)前目錄

  • int access(const char *path, int amode) ?測(cè)試文件是否可以訪問

  • char getcwd(char buf, size_t size) ?讀取當(dāng)前路徑

  • dfs.c ? dfs文件系統(tǒng)初始化,文件句柄列表管理等接口函數(shù)

  • int dfs_init(void) ? 初始化dfs文件系統(tǒng),如果使能devfs,則直接掛載。此接口程序默認(rèn)被rtthread設(shè)置為組件前自動(dòng)初始化,無需用戶調(diào)用。需發(fā)生在掛載底層文件系統(tǒng)之前

  • void dfs_lock(void) ? 嘗試獲取dfs的互斥量,如果已被占用,則掛起當(dāng)前線程,等待其它線程讓出dfs操作權(quán)

  • void dfs_unlock(void) ? 釋放dfs互斥量,讓出dfs操作權(quán)

  • static int fd_alloc(struct dfs_fdtable *fdt, int startfd) ? 如果已打開的文件句柄列表內(nèi)有空余句柄,則直接返回。如果沒有空余,則在打開文件的時(shí)候需要新開辟空間,擴(kuò)充已打開的文件句柄列表(每次擴(kuò)充4個(gè))。如果已超過同時(shí)打開文件的數(shù)量上限,則不再開辟。但這里沒有直接返回錯(cuò)誤,而是返回最大文件描述符。等待調(diào)用者做越界保護(hù)處理

  • int fd_new(void) ? 調(diào)用上面的fd_alloc函數(shù),申請(qǐng)一個(gè)空文件描述符。如果越界(沒有空閑設(shè)備描述符可用)則返回-1.否則返回+3的描述符.0,1,2的文件描述符用于承載終端設(shè)備文件描述符

  • struct dfs_fd *fd_get(int fd) ? 通過文件描述符,在文件句柄列表內(nèi)找出對(duì)應(yīng)的文件句柄

  • void fd_put(struct dfs_fd *fd) ? 如果文件句柄的ref_count減一后為0,則釋放掉文件句柄。

  • int fd_is_open(const char *pathname) ? 查找某文件是否已打開,0為打開,-1為未打開。

  • const char dfs_subdir(const char directory, const char *filename) ? 在filename中去掉directory,返回相對(duì)子目錄

  • char dfs_normalize_path(const char directory, const char *filename) ? 返回標(biāo)準(zhǔn)格式的路徑

  • struct dfs_fdtable *dfs_fdtable_get(void) ? 返回文件句柄列表

  • int list_fd(void) ? 打印當(dāng)前文件句柄列表內(nèi),已打開的文件屬性

  • dfs_fs.c ? dfs層文件系統(tǒng)對(duì)底層具體文件系統(tǒng)的管理接口函數(shù)

  • int dfs_register(const struct dfs_filesystem_ops *ops) ? 注冊(cè)一個(gè)具體的文件系統(tǒng)(dev,elm等)。具體操作為在文件系統(tǒng)操作符數(shù)組中,找出空閑句柄,并添加為新注冊(cè)的操作符

  • struct dfs_filesystem dfs_filesystem_lookup(const char path) ? 根據(jù)路徑名,在文件系統(tǒng)列表中查找對(duì)應(yīng)的文件系統(tǒng)。路徑名只要包含文件系統(tǒng)具體掛載點(diǎn)即可。比如給定一個(gè)文件的絕對(duì)路徑名,即可找到它所在的文件系統(tǒng)

  • const char dfs_filesystem_get_mounted_path(struct rt_device device) ? 根據(jù)設(shè)備ID,在文件系統(tǒng)列表中查找對(duì)應(yīng)的文件系統(tǒng),并返回對(duì)應(yīng)文件系統(tǒng)的掛載點(diǎn)

  • int dfs_filesystem_get_partition(struct dfs_partition part,uint8_t buf,uint32_t pindex) ? 在指定存儲(chǔ)空間內(nèi)讀取分區(qū)表。一般分區(qū)表在存儲(chǔ)設(shè)備的第一個(gè)扇區(qū)。

  • int dfs_mount(const char device_name,const char path,const char filesystemtype,unsigned long rwflag,const void data) ? 根據(jù)設(shè)備名,把該設(shè)備掛載到指定路徑。filesystemtype指定具體的文件系統(tǒng)類型,以使用具體的操作接口。rwflag為文件系統(tǒng)的讀寫屬性,data為傳的參數(shù),是否有實(shí)際意義要看具體的文件系統(tǒng)操作接口。常用的elm和dev文件系統(tǒng)都無實(shí)際意義,直接給0即可。該函數(shù)需要等注冊(cè)完具體的存儲(chǔ)設(shè)備和dfs文件系統(tǒng)并在dfs文件系統(tǒng)內(nèi)注冊(cè)了具體的文件系統(tǒng)后,由用戶調(diào)用,把具體的存儲(chǔ)設(shè)備掛載到dfs的指定掛載點(diǎn)。并指定以哪種類型的文件系統(tǒng)操作接口處理此設(shè)備。在此之前無需open對(duì)應(yīng)的存儲(chǔ)設(shè)備,此函數(shù)內(nèi)部會(huì)先打開存儲(chǔ)設(shè)備再掛載

  • int dfs_unmount(const char *specialfile) ? 取消掛載,在文件系統(tǒng)列表中刪除指定文件系統(tǒng),關(guān)閉存儲(chǔ)設(shè)備。specialfile只需包含文件系統(tǒng)掛載路徑即可

  • int dfs_mkfs(const char fs_name, const char device_name) ? 根據(jù)fs_name指定的具體文件系統(tǒng)類型,把device_name指定的實(shí)際存儲(chǔ)設(shè)備進(jìn)行格式化,構(gòu)建文件系統(tǒng)

  • int dfs_statfs(const char path, struct statfs buffer) ? 讀取指定文件系統(tǒng)的信息,包括塊大小,總塊數(shù)以及剩余塊數(shù),可以用于查看設(shè)備剩余空間

  • void mkfs(const char fs_name, const char device_name) ? finsh函數(shù)命令的mkfs接口。使能了MSH后,此函數(shù)未被使用

  • int df(const char *path) ? finsh函數(shù)命令的stafts接口,打印存儲(chǔ)設(shè)備的容量和剩余空間信息。使能了MSH后,此函數(shù)未被使用

  • dfs_file.c ? dfs文件系統(tǒng)層對(duì)于文件相關(guān)的處理接口函數(shù),具體實(shí)現(xiàn)會(huì)分別調(diào)用對(duì)應(yīng)實(shí)際文件系統(tǒng)的操作函數(shù)接口。既dfs面向下層文件系統(tǒng)的接口,移植具體文件系統(tǒng)的時(shí)候需要實(shí)現(xiàn)對(duì)接代碼(用RTT移植的時(shí)候,RTT已經(jīng)完成了此接口,在dfs_elm.c內(nèi))。

  • int dfs_file_open(struct dfs_fd fd, const char path, int flags) ? 按照flags屬性打開path指定文件或文件夾,然后由fd文件句柄返回

  • int dfs_file_close(struct dfs_fd *fd) ? 關(guān)閉fd指定的文件或文件夾

  • int dfs_file_ioctl(struct dfs_fd fd, int cmd, void args) ? dfs層的ioctl內(nèi)部接口,可讀取和設(shè)置文件flags。并調(diào)用具體文件系統(tǒng)的ioctl接口實(shí)現(xiàn)底層具體功能

  • int dfs_file_read(struct dfs_fd fd, void buf, size_t len) ? dfs層的read接口,調(diào)用具體文件系統(tǒng)的read接口實(shí)現(xiàn)讀取功能

  • int dfs_file_getdents(struct dfs_fd fd, struct dirent dirp, size_t nbytes) ? 根據(jù)文件操作符,讀取dirent結(jié)構(gòu)體對(duì)應(yīng)的屬性信息

  • int dfs_file_unlink(const char *path) ? dfs層刪除接口,調(diào)用具體文件系統(tǒng)的unlink接口實(shí)現(xiàn)文件或文件夾的刪除功能

  • int dfs_file_write(struct dfs_fd fd, const void buf, size_t len) ? dfs層的write接口,調(diào)用具體文件系統(tǒng)的write接口實(shí)現(xiàn)寫入功能

  • int dfs_file_flush(struct dfs_fd *fd) ? dfs層的同步接口,調(diào)用具體文件系統(tǒng)的flush接口實(shí)現(xiàn)文件的同步,既把文件句柄內(nèi)的緩存數(shù)據(jù)真正寫入到存儲(chǔ)設(shè)備

  • int dfs_file_lseek(struct dfs_fd *fd, off_t offset) ? dfs層的lseek接口,調(diào)用具體文件系統(tǒng)的lseek接口,實(shí)現(xiàn)對(duì)文件讀取位置的移動(dòng)

  • int dfs_file_stat(const char path, struct stat buf) ? dfs層的讀取文件屬性接口,也會(huì)調(diào)用具體文件系統(tǒng)的stat接口

  • int dfs_file_rename(const char oldpath, const char newpath) ? dfs層的rename接口,調(diào)用底層具體文件系統(tǒng)的rename接口,實(shí)現(xiàn)文件重命名

  • int dfs_file_ftruncate(struct dfs_fd *fd, off_t length) ? 調(diào)用具體文件系統(tǒng)的ioctl接口,實(shí)現(xiàn)對(duì)文件fd的截?cái)啵╨ength字節(jié))

  • void ls(const char *pathname) ? finsh的ls命令函數(shù)

  • void rm(const char *filename) ? finsh的rm命令函數(shù)

  • void cat(const char *filename) ? finsh的cat命令函數(shù)

  • static void copyfile(const char src, const char dst) ? dfs層實(shí)現(xiàn)的文件拷貝函數(shù)

  • static void copydir(const char src, const char dst) ? dfs層實(shí)現(xiàn)的文件夾拷貝函數(shù),遍歷子文件夾,把所有子文件拷貝到目標(biāo)文件夾

  • static const char _get_path_lastname(const char path) ? 通過path路徑,得到最后一級(jí)路徑名

  • void copy(const char src, const char dst) ? finsh的copy命令函數(shù),調(diào)用上面的copyfile和copydir實(shí)現(xiàn)

  • filesystems文件夾:dfs支持的具體文件系統(tǒng),默認(rèn)會(huì)有一個(gè)devfs文件夾,對(duì)應(yīng)設(shè)備文件系統(tǒng)。開啟了elm的fat文件系統(tǒng)模塊后,會(huì)多一個(gè)elmfat文件夾,對(duì)應(yīng)fatfs的代碼

  • elmfat文件夾:fatfs對(duì)應(yīng)的代碼,其中ff.c為fatfs代碼,dfs_elm.c為RTT實(shí)現(xiàn)的移植代碼,承上啟下,完成dfs的調(diào)用接口和與fatfs對(duì)接的接口,并通過具體設(shè)備(flash,sdcard)的操作接口實(shí)現(xiàn)具體的功能

  • dfs_elm.c ? 相對(duì)直接移植fatfs時(shí)diskio.c要實(shí)現(xiàn)的接口外,又多了一些和dfs層對(duì)接的接口。下面針對(duì)dfs_elm.c下的接口函數(shù)做簡(jiǎn)單說明

  • static int elm_result_to_dfs(FRESULT result) ? 做fatfs下的返回狀態(tài)與dfs下的返回狀態(tài)的轉(zhuǎn)換

  • static int get_disk(rt_device_t id) ? 根據(jù)設(shè)備ID,在掛載的磁盤列表中找到磁盤列表ID

  • int dfs_elm_mount(struct dfs_filesystem fs, unsigned long rwflag, const void data) ? 承上啟下,連接dfs層和fatfs內(nèi)的mount接口,實(shí)現(xiàn)設(shè)備掛載,把設(shè)備ID添加到掛載的磁盤列表內(nèi)

  • int dfs_elm_unmount(struct dfs_filesystem *fs) ? 承上啟下,連接dfs層和fatfs內(nèi)的unmount接口,實(shí)現(xiàn)設(shè)備取消掛載,把設(shè)備ID從磁盤列表中刪除

  • int dfs_elm_mkfs(rt_device_t dev_id) ? 承上啟下,連接dfs層和fatfs內(nèi)的mkfs接口,實(shí)現(xiàn)存儲(chǔ)設(shè)備的格式化

  • int dfs_elm_statfs(struct dfs_filesystem fs, struct statfs buf) ? 承上啟下,連接dfs層和fatfs內(nèi)的statfs和getfree接口,讀取文件系統(tǒng)的存儲(chǔ)空間信息

  • int dfs_elm_open(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的open或opendir接口,實(shí)現(xiàn)打開文件或文件夾功能

  • int dfs_elm_close(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的close接口,實(shí)現(xiàn)關(guān)閉文件或文件夾功能

  • int dfs_elm_ioctl(struct dfs_fd file, int cmd, void args) ? 承上啟下,連接dfs層和fatfs內(nèi)的ioctl接口,實(shí)現(xiàn)文件截?cái)喙δ?/span>

  • int dfs_elm_read(struct dfs_fd file, void buf, size_t len) ? 承上啟下,連接dfs層和fatfs內(nèi)的read接口,實(shí)現(xiàn)文件讀取功能

  • int dfs_elm_write(struct dfs_fd file, const void buf, size_t len) ? 承上啟下,連接dfs層和fatfs內(nèi)的write接口,實(shí)現(xiàn)文件寫入功能

  • int dfs_elm_flush(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的flush和sync接口,實(shí)現(xiàn)文件的同步功能,把緩存數(shù)據(jù)寫入磁盤

  • int dfs_elm_lseek(struct dfs_fd *file, rt_off_t offset) ? 承上啟下,連接dfs層和fatfs內(nèi)的lseek或seekdir接口,實(shí)現(xiàn)文件或文件夾的操作位置移動(dòng)

  • int dfs_elm_getdents(struct dfs_fd file, struct dirent dirp, uint32_t count) ? 承上啟下,調(diào)用fatfs的readdir接口,實(shí)現(xiàn)dfs層的getdents接口,讀取文件dirent屬性

  • int dfs_elm_unlink(struct dfs_filesystem fs, const char path) ? 承上啟下,連接dfs層和fatfs內(nèi)的funlink接口,實(shí)現(xiàn)文件的刪除功能

  • int dfs_elm_rename(struct dfs_filesystem fs, const char oldpath, const char *newpath) ? 承上啟下,連接dfs層和fatfs內(nèi)的rename接口,實(shí)現(xiàn)改文件名的功能

  • int dfs_elm_stat(struct dfs_filesystem fs, const char path, struct stat *st) ? 承上啟下,連接dfs層和fatfs內(nèi)的stat接口,實(shí)現(xiàn)讀取文件stat信息的功能

  • int elm_init(void) ? 調(diào)用dfs層的dfs_register接口,把“elm”的文件系統(tǒng)操作接口注冊(cè)到dfs文件系統(tǒng)中。用于后面按照“elm”類型掛載實(shí)際的存儲(chǔ)設(shè)備。此函數(shù)被RTT加入到了組件初始化列表,會(huì)自動(dòng)運(yùn)行,無需用戶調(diào)用

  • DSTATUS disk_initialize(BYTE drv) ? 此函數(shù)為fatfs的初始化磁盤設(shè)備的接口,由于RTT實(shí)際初始化磁盤設(shè)備的代碼也被加入到了自動(dòng)初始化列表,所以此接口直接返回OK即可

  • DSTATUS disk_status(BYTE drv) ? 此函數(shù)為fatfs讀取磁盤設(shè)備狀態(tài)的接口。RTT的移植,并沒有對(duì)此函數(shù)做具體實(shí)現(xiàn),直接返回的OK

  • DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count) ? 此函數(shù)為fatfs讀取磁盤扇區(qū)數(shù)據(jù)的接口,對(duì)接具體的設(shè)備驅(qū)動(dòng)讀取接口

  • DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count) ? 此函數(shù)為fatfs寫入磁盤扇區(qū)數(shù)據(jù)的接口,對(duì)接具體的設(shè)備驅(qū)動(dòng)寫入接口

  • DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff) ? 此函數(shù)為fatfs的ioctl接口,對(duì)接具體設(shè)備驅(qū)動(dòng)的control接口

  • DWORD get_fattime(void) ? 此函數(shù)為fatfs獲取系統(tǒng)時(shí)間的接口,用于記錄文件和文件夾的創(chuàng)建和修改時(shí)間

  • int ff_cre_syncobj(BYTE drv, FF_SYNC_t *m) ? 如開啟文件重入功能,則需要實(shí)現(xiàn)重入保護(hù)相關(guān)代碼,RTT利用互斥量實(shí)現(xiàn),此接口創(chuàng)建互斥量。FF_SYNC_t到rt_mutex_t的重定義在ffconf.h中定義

  • int ff_del_syncobj(FF_SYNC_t m) ? fatfs的刪除互斥量的接口

  • int ff_req_grant(FF_SYNC_t m) ? fatfs的獲取互斥量的接口

  • void ff_rel_grant(FF_SYNC_t m) ? fatfs的釋放互斥量的接口

  • void *ff_memalloc(UINT size) ? 當(dāng)定義FF_USE_LFN == 3的時(shí)候,長(zhǎng)文件名需要在堆上面開辟空間,此時(shí)需要實(shí)現(xiàn)fatfs開辟存儲(chǔ)空間的接口,對(duì)應(yīng)rt_malloc接口

  • void ff_memfree(void *mem) ? fatfs釋放存儲(chǔ)空間的接口,對(duì)應(yīng)rt_free接口


dfs以fatfs系統(tǒng)掛載sdcard相關(guān)代碼調(diào)用時(shí)序圖:


大致按照從底層到頂層的初始化過程:

sdio硬件外設(shè)初始化(自動(dòng)):

mmcsd設(shè)備初始化(自動(dòng)):

fatfs文件系統(tǒng)初始化(自動(dòng)):

dfs文件系統(tǒng)初始化(自動(dòng)):

sdcard檢測(cè)線程,檢測(cè)是否有sdcard或mmccard插入到sd卡槽并進(jìn)行卡識(shí)別:

sdcard掛載到dfs系統(tǒng)(用戶調(diào)用):

具體使用過程


如上所述,其實(shí)在RTThread平臺(tái)上使用DFS文件系統(tǒng)掛載SD卡已經(jīng)很簡(jiǎn)單了,大致分一下幾步:

1、用CubeMX生成SDIO的最底層外設(shè)初始化代碼HAL_SD_MspInit(),復(fù)制到board.c

  • SDIO配置如下:

  • SDIO的DMA配置如下:

  • SDIO的NVIC配置如下:

生成代碼如下(復(fù)制到board.c):

  1
2
3SD_HandleTypeDefhsd;
4
5DMA_HandleTypeDefhdma_sdio_rx;
6
7DMA_HandleTypeDefhdma_sdio_tx;
8
9/**
10
11*@briefSDMSPInitialization
12
13*Thisfunctionconfiguresthehardwareresourcesusedinthisexample
14
15*@paramhsd:SDhandlepointer
16
17*@retvalNone
18
19*/

20
21voidHAL_SD_MspInit(SD_HandleTypeDef*hsd)
22
23
{
24
25GPIO_InitTypeDefGPIO_InitStruct={0};
26
27if(hsd->Instance==SDIO)
28
29{
30
31/*USERCODEBEGINSDIO_MspInit0*/
32
33/*USERCODEENDSDIO_MspInit0*/
34
35/*Peripheralclockenable*/
36
37__HAL_RCC_SDIO_CLK_ENABLE();
38
39__HAL_RCC_GPIOC_CLK_ENABLE();
40
41__HAL_RCC_GPIOD_CLK_ENABLE();
42
43/**SDIOGPIOConfiguration
44
45PC8------>SDIO_D0
46
47PC9------>SDIO_D1
48
49PC10------>SDIO_D2
50
51PC11------>SDIO_D3
52
53PC12------>SDIO_CK
54
55PD2------>SDIO_CMD
56
57*/

58
59GPIO_InitStruct.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
60
61|GPIO_PIN_12;
62
63GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
64
65GPIO_InitStruct.Pull=GPIO_NOPULL;
66
67GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
68
69GPIO_InitStruct.Alternate=GPIO_AF12_SDIO;
70
71HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
72
73GPIO_InitStruct.Pin=GPIO_PIN_2;
74
75GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
76
77GPIO_InitStruct.Pull=GPIO_NOPULL;
78
79GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
80
81GPIO_InitStruct.Alternate=GPIO_AF12_SDIO;
82
83HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);
84
85/*SDIODMAInit*/
86
87/*SDIO_RXInit*/
88
89hdma_sdio_rx.Instance=DMA2_Stream3;
90
91hdma_sdio_rx.Init.Channel=DMA_CHANNEL_4;
92
93hdma_sdio_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;
94
95hdma_sdio_rx.Init.PeriphInc=DMA_PINC_DISABLE;
96
97hdma_sdio_rx.Init.MemInc=DMA_MINC_ENABLE;
98
99hdma_sdio_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
100
101hdma_sdio_rx.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
102
103hdma_sdio_rx.Init.Mode=DMA_PFCTRL;
104
105hdma_sdio_rx.Init.Priority=DMA_PRIORITY_LOW;
106
107hdma_sdio_rx.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
108
109hdma_sdio_rx.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
110
111hdma_sdio_rx.Init.MemBurst=DMA_MBURST_INC4;
112
113hdma_sdio_rx.Init.PeriphBurst=DMA_PBURST_INC4;
114
115if(HAL_DMA_Init(&hdma_sdio_rx)!=HAL_OK)
116
117{
118
119Error_Handler();
120
121}
122
123__HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
124
125/*SDIO_TXInit*/
126
127hdma_sdio_tx.Instance=DMA2_Stream6;
128
129hdma_sdio_tx.Init.Channel=DMA_CHANNEL_4;
130
131hdma_sdio_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
132
133hdma_sdio_tx.Init.PeriphInc=DMA_PINC_DISABLE;
134
135hdma_sdio_tx.Init.MemInc=DMA_MINC_ENABLE;
136
137hdma_sdio_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
138
139hdma_sdio_tx.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
140
141hdma_sdio_tx.Init.Mode=DMA_PFCTRL;
142
143hdma_sdio_tx.Init.Priority=DMA_PRIORITY_LOW;
144
145hdma_sdio_tx.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
146
147hdma_sdio_tx.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
148
149hdma_sdio_tx.Init.MemBurst=DMA_MBURST_INC4;
150
151hdma_sdio_tx.Init.PeriphBurst=DMA_PBURST_INC4;
152
153if(HAL_DMA_Init(&hdma_sdio_tx)!=HAL_OK)
154
155{
156
157Error_Handler();
158
159}
160
161__HAL_LINKDMA(hsd,hdmatx,hdma_sdio_tx);
162
163/*SDIOinterruptInit*/
164
165HAL_NVIC_SetPriority(SDIO_IRQn,6,0);
166
167HAL_NVIC_EnableIRQ(SDIO_IRQn);
168
169/*USERCODEBEGINSDIO_MspInit1*/
170
171/*USERCODEENDSDIO_MspInit1*/
172
173}
174
175}

2、用RTThreadStudio配置DFS組件和Fatfs組件:

  • Studio組件配置如下,如只需移植Fatfs掛載SD卡,則只需開啟“DFS”,“Fatfs”和“SDIO”即可,最大扇區(qū)也可以用默認(rèn)的512,我的是同時(shí)掛載了SPI接口的串行Flash,F(xiàn)lash的扇區(qū)是4096,所以修改了一下這個(gè)參數(shù):

3、掛載設(shè)備到文件系統(tǒng):

  • 如上所述,在RTThread平臺(tái)上使用DFS,只要配置好組件(代碼里面就是宏定義),基本所有的初始化代碼都會(huì)自動(dòng)調(diào)用,無需用戶干涉。這里用戶只需要找到SD卡設(shè)備,然后掛載即可。


 1#defineSDCardPath"/sdcard0"
2
3voidsdmnt(void)
4
5
{
6
7intsta;
8
9if(rt_device_find("sd0")!=RT_NULL)
10
11{
12
13sta=dfs_mount("sd0",SDCardPath,"elm",0,0);
14
15if(sta==RT_EOK)
16
17{
18
19LOG_I("sdcardmounttoSDCardPath");
20
21}
22
23else{
24
25LOG_W("sdcardmounttoSDCardPathfailed!");
26
27}
28
29}
30
31}
32
33MSH_CMD_EXPORT(sdmnt,mountthesdcardtolocalfilesystem);

4、掛載后就可以按照dfs_posix.c里面的通用接口進(jìn)行調(diào)用使用了。當(dāng)然,dfs已經(jīng)實(shí)現(xiàn)了很多基于命令行的操作命令,比如“cd”,“l(fā)s”,“cat”等。使用方法基本和linux下差不太多,但功能上確實(shí)還是沒那么強(qiáng)大,這也是很正常的,如果也做那么強(qiáng)大,豈不是又變成了和linux一個(gè)量級(jí)的系統(tǒng)了,失去了輕量級(jí)可搶占系統(tǒng)的意義了。

————————————————

版權(quán)聲明:本文為RT-Thread論壇用戶「吉利咕嚕2022」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:

https://club.rt-thread.org/ask/article/ca44a91d66b137c9.html




可以添加微信17775983565為好友,注明:公司+姓名,拉進(jìn)RT-Thread官方微信交流群!




愛我就給我點(diǎn)在看

點(diǎn)擊閱讀原文進(jìn)入官網(wǎng)


原文標(biāo)題:基于RTThread的DFS文件系統(tǒng)組件使用筆記

文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1239

    瀏覽量

    39443

原文標(biāo)題:基于RTThread的DFS文件系統(tǒng)組件使用筆記

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何修改buildroot和debian文件系統(tǒng)

    本文檔主要介紹在沒有編譯環(huán)境的情況下,如何修改buildroot和debian文件系統(tǒng)方法,如在buildroot文件系統(tǒng)中添加文件、修改目錄等文件操作,在debian
    的頭像 發(fā)表于 07-22 17:46 ?285次閱讀
    如何修改buildroot和debian<b class='flag-5'>文件系統(tǒng)</b>

    怎樣修改LVGL的lv_port_fs文件,讓它使用rt-thread的DFS文件系統(tǒng)中的API函數(shù)讀取SD卡中的圖片?

    我想問一下,怎樣修改LVGL的lv_port_fs文件,可以讓它使用rt-thread的DFS文件系統(tǒng)中的API函數(shù)(這些API函數(shù)在rt-thread的dfs_posix.c中)讀取
    發(fā)表于 07-11 06:53

    linux--sysfs文件系統(tǒng)

    sysfs文件系統(tǒng) sysfs,全稱為System Filesystem,是一個(gè)由Linux內(nèi)核實(shí)現(xiàn)的虛擬文件系統(tǒng)。它扮演著一個(gè)橋梁的角色,將內(nèi)核中的設(shè)備和驅(qū)動(dòng)程序信息以文件的形式呈現(xiàn)給用戶空間
    的頭像 發(fā)表于 07-08 11:37 ?453次閱讀
    linux--sysfs<b class='flag-5'>文件系統(tǒng)</b>

    RTThread4.1.1在spiflash上掛dfs文件系統(tǒng)報(bào)互斥鎖錯(cuò)誤的原因?

    最近使用gd32f450vg芯片,在SPI4接口上掛了gd25q32,想使用dfs文件系統(tǒng),gd25q32能夠正常的識(shí)別,顯示文件系統(tǒng)掛載正常,但是只要操作文件系統(tǒng)就會(huì)出現(xiàn)報(bào)錯(cuò),看像是
    發(fā)表于 03-05 07:39

    Linux系統(tǒng)如何擴(kuò)展文件系統(tǒng)

    當(dāng)數(shù)據(jù)盤沒有創(chuàng)建分區(qū),只在設(shè)備上創(chuàng)建了文件系統(tǒng)?;蛘吒袷交擞脖P,就直接mount上系統(tǒng)使用。
    的頭像 發(fā)表于 02-21 09:53 ?699次閱讀

    鴻蒙輕內(nèi)核源碼分析:虛擬文件系統(tǒng) VFS

    VFS(Virtual File System)是文件系統(tǒng)的虛擬層,它不是一個(gè)實(shí)際的文件系統(tǒng),而是一個(gè)異構(gòu)文件系統(tǒng)之上的軟件粘合層,為用戶提供統(tǒng)一的類 Unix 文件操作接口。由于不同
    的頭像 發(fā)表于 02-18 14:50 ?636次閱讀

    基于RT-Thread快速上手SD NAND 虛擬文件系統(tǒng)

    RT-Thread項(xiàng)目工程,這里基于Draco開發(fā)板創(chuàng)建。   完整的RT-thread項(xiàng)目默認(rèn)是開啟虛擬文件系統(tǒng)組件,RT-Thread DFS 組件的主要功能特點(diǎn)有:   為應(yīng)用
    發(fā)表于 12-15 17:29

    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2文件系統(tǒng)被誤格式化為Ext4文件系統(tǒng)的數(shù)據(jù)恢復(fù)案例

    由于工作人員的誤操作,將Ext4文件系統(tǒng)誤裝入到存儲(chǔ)中Ocfs2文件系統(tǒng)數(shù)據(jù)卷上,導(dǎo)致原Ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)。 由于Ext4
    的頭像 發(fā)表于 12-04 10:49 ?354次閱讀
    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2<b class='flag-5'>文件系統(tǒng)</b>被誤格式化為Ext4<b class='flag-5'>文件系統(tǒng)</b>的數(shù)據(jù)恢復(fù)案例

    Linux文件系統(tǒng)層的主要結(jié)構(gòu)

    Linux 文件系統(tǒng)體系結(jié)構(gòu)是一個(gè)對(duì)復(fù)雜系統(tǒng)進(jìn)行抽象化的有趣例子。通過使用一組通用的 API 函數(shù),Linux 可以在許多種存儲(chǔ)設(shè)備上支持許多種文件系統(tǒng)。例如,read 函數(shù)調(diào)用可以從指定的
    的頭像 發(fā)表于 11-10 10:37 ?463次閱讀
    Linux<b class='flag-5'>文件系統(tǒng)</b>層的主要結(jié)構(gòu)

    Linux的文件系統(tǒng)特點(diǎn)

    Linux的文件系統(tǒng)特點(diǎn) 文件系統(tǒng)要有嚴(yán)格的組織形式,使得文件能夠以塊為單位進(jìn)行存儲(chǔ)。 文件系統(tǒng)中也要有索引區(qū),用來方便查找一個(gè)文件分成的多
    的頭像 發(fā)表于 11-09 14:48 ?977次閱讀
    Linux的<b class='flag-5'>文件系統(tǒng)</b>特點(diǎn)

    如何把文件系統(tǒng)燒到EMMC并從EMMC加載

    如何下載并從SD卡加載文件系統(tǒng),提到過可以從EMMC引導(dǎo)系統(tǒng),本篇將為您介紹如何把文件系統(tǒng)燒到EMMC,并從EMMC加載。
    的頭像 發(fā)表于 10-30 16:06 ?2448次閱讀
    如何把<b class='flag-5'>文件系統(tǒng)</b>燒到EMMC并從EMMC加載

    分布式文件系統(tǒng)的設(shè)計(jì)原理是什么?

    什么是分布式文件系統(tǒng)?分布式文件系統(tǒng)(DFS)是一種計(jì)算機(jī)文件系統(tǒng),使用戶能夠從多個(gè)分布式位置存儲(chǔ)和訪問數(shù)據(jù)。它是在分布式環(huán)境中的不同計(jì)算機(jī)之間共享信息的一種方式。通過使用分布式
    的頭像 發(fā)表于 10-17 17:35 ?683次閱讀

    事務(wù)性日志結(jié)構(gòu)文件系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)

    本文發(fā)表于FAST 2022,探討日志結(jié)構(gòu)文件系統(tǒng)層面的事務(wù)支持。本文主要對(duì)F2FS進(jìn)行了支持事務(wù)的修改,實(shí)現(xiàn)了支持ACID事務(wù)特性的文件系統(tǒng)層面支持。本文通過實(shí)驗(yàn)測(cè)試了SQLite和ROCKSDB
    的頭像 發(fā)表于 10-16 16:01 ?553次閱讀
    事務(wù)性日志結(jié)構(gòu)<b class='flag-5'>文件系統(tǒng)</b>的設(shè)計(jì)及實(shí)現(xiàn)

    片上flash使用文件系統(tǒng)筆記

    由于之前需要使用片上的flash多余的部分來搭建文件系統(tǒng),但是沒有找到使用片上的教程,都是利用片外的flash教程。
    的頭像 發(fā)表于 10-13 17:00 ?1871次閱讀
    片上flash使用<b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>筆記</b>

    移植Linux內(nèi)核ramfs和ramdisk文件系統(tǒng)

    在移植Linux內(nèi)核早期時(shí),如果flash等存儲(chǔ)設(shè)備的驅(qū)動(dòng)還沒寫好,可以將文件系統(tǒng)放到內(nèi)存中運(yùn)行。 此時(shí)可以使用 ramfs 和 ramdisk ,即將內(nèi)存的一部分用作文件系統(tǒng)。 ramfs
    的頭像 發(fā)表于 10-04 14:41 ?900次閱讀
    移植Linux內(nèi)核ramfs和ramdisk<b class='flag-5'>文件系統(tǒng)</b>