資料介紹
描述
背景
Arduino IDE 附帶的 SD 庫很方便,但缺少 exFAT、LFN(長(zhǎng)文件名)和非英文字符支持等功能。本文介紹了一種替代 SD 卡驅(qū)動(dòng)程序(基于 RT-Thread)來解決這些問題。
RT-線程
RT-Thread是一個(gè)免費(fèi)的開源(Apache 許可證 2.0)RTOS,并以 Arduino 庫的形式提供。還有另一篇文章 ( Multitasking on Arduino ) 可用于了解 RT-Thread 的基本概念。
讓我們從通過 Arduino IDE 的庫管理器安裝庫開始。(本文基于 RT-Thread 庫版本 0.4.4 。)
SD 卡驅(qū)動(dòng)程序 (TL;DR)
(如果您對(duì)實(shí)現(xiàn)不感興趣,只想知道如何使用它,請(qǐng)?zhí)^本節(jié)。)
RT-Thread 庫中的 SD 卡支持采用DFS(設(shè)備文件系統(tǒng))的形式,它是 RT-Thread 架構(gòu)的一部分。FAT 是 RT-Thread 支持的文件系統(tǒng)之一。(在 RT-Thread 庫的 0.4.4 版本中,F(xiàn)AT 是唯一支持的文件系統(tǒng)。)
FAT DFS 本??身就是基于ChaN 的 FatFs 項(xiàng)目的優(yōu)秀作品。
標(biāo)準(zhǔn)的 RT-Thread DFS 提供以下文件系統(tǒng)和文件接口:
/* File system operations */
struct dfs_filesystem_ops
{
const char *name;
uint32_t flags; /* flags for file system operations */
/* operations for file */
const struct dfs_file_ops *fops;
/* mount and unmount file system */
int (*mount) (struct dfs_filesystem *fs, unsigned long rwflag, const void *data);
int (*unmount) (struct dfs_filesystem *fs);
/* make a file system */
int (*mkfs) (rt_device_t devid);
int (*statfs) (struct dfs_filesystem *fs, struct statfs *buf);
int (*unlink) (struct dfs_filesystem *fs, const char *pathname);
int (*stat) (struct dfs_filesystem *fs, const char *filename, struct stat *buf);
int (*rename) (struct dfs_filesystem *fs, const char *oldpath, const char *newpath);
};
/* File operations */
struct dfs_file_ops
{
int (*open) (struct dfs_fd *fd);
int (*close) (struct dfs_fd *fd);
int (*ioctl) (struct dfs_fd *fd, int cmd, void *args);
int (*read) (struct dfs_fd *fd, void *buf, size_t count);
int (*write) (struct dfs_fd *fd, const void *buf, size_t count);
int (*flush) (struct dfs_fd *fd);
int (*lseek) (struct dfs_fd *fd, off_t offset);
int (*getdents) (struct dfs_fd *fd, struct dirent *dirp, uint32_t count);
int (*poll) (struct dfs_fd *fd, struct rt_pollreq *req);
}
一個(gè)特定的 DFS 可能會(huì)實(shí)現(xiàn)它們的全部或部分。當(dāng)掛載DFS時(shí),例如dfs_mount("SD", "/", "elm", 0, 0)
,特定的DFS會(huì)綁定到一個(gè)設(shè)備上。在這種情況下,DFS "elm" (FatFs) 綁定到設(shè)備 "SD"。
標(biāo)準(zhǔn)的 RT-Thread 設(shè)備提供以下接口:
/* operations set for device object */
struct rt_device_ops
{
/* common device interface */
rt_err_t (*init) (rt_device_t dev);
rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);
rt_err_t (*close) (rt_device_t dev);
rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
rt_err_t (*control)(rt_device_t dev, int cmd, void *args);
};
一個(gè)特定的設(shè)備可以實(shí)現(xiàn)它們的全部或全部(將函數(shù)指針設(shè)置為 NULL)。
在庫中,名為“SD”的設(shè)備實(shí)現(xiàn)了與SD卡訪問相關(guān)的功能,在MKRZERO板的情況下,它涉及到一個(gè)名為“SPI1”的低級(jí)設(shè)備。而 SPI 設(shè)備最終涉及到了 Arduino SPI 庫。
數(shù)據(jù)記錄器示例
Arduino SD 庫提供了一個(gè)名為“Datalogger”的示例。RT-Thread 庫中也提供了相同的示例,如下面的代碼部分所列。
不同之處在于,在下面的示例代碼中,采樣間隔為 1 秒,并且只執(zhí)行 10 次。
您可能已經(jīng)注意到上面的注釋open()
功能。要打開現(xiàn)有文件并刪除其所有內(nèi)容,只需O_APPEND
用O_TRUNC
標(biāo)志替換即可。
當(dāng)使用 MKRZERO 板運(yùn)行以下示例時(shí),您可能會(huì)觀察到串行監(jiān)視器的以下輸出:
\ | /
- RT - Thread Operating System
/ | \ 4.0.1 build Apr 17 2019
2006 - 2019 Copyright by rt-thread team
+ Mount SD to "/"
416,347,312
finsh />436,369,335
442,375,340
449,376,338
449,375,346
429,374,341
447,369,342
449,363,338
426,363,334
419,353,327
使用 Shell 進(jìn)行操作
使用 RT-Thread 庫的真正優(yōu)勢(shì)在于它使您能夠使用 (FinSH) shell 命令來操作文件。
在串行監(jiān)視器或其他串行終端工具中,輸入ls()
命令將顯示當(dāng)前目錄(在本例中為“/”)中的文件列表,如下所示。
ls()
Directory /:
DATALOG.TXT 240
HI_UTF8.TXT 35
A_REAL~1.TXT 22
0, 0x00000000
文件名后面的數(shù)字是以字節(jié)為單位的文件大小。在上面的屏幕截圖中,“datalog.txt”的大小為 240 字節(jié),因?yàn)槲疫\(yùn)行了該示例兩次。
輸入cat("datalog.txt")
命令會(huì)顯示“datalog.txt”的內(nèi)容,確認(rèn)有20條記錄。
finsh />cat("datalog.txt")
464,358,333
464,368,336
480,381,354
447,364,346
443,363,340
441,365,343
463,371,345
467,374,313
447,364,345
465,369,346
416,347,312
436,369,335
442,375,340
449,376,338
449,375,346
429,374,341
447,369,342
449,363,338
426,363,334
419,353,327
0, 0x00000000
還有copy()
和rm()
命令。
finsh />copy("datalog.txt", "copy.txt")
0, 0x00000000
finsh />ls()
Directory /:
COPY.TXT 240
DATALOG.TXT 240
HI_UTF8.TXT 35
A_REAL~1.TXT 22
0, 0x00000000
finsh />rm("copy.txt")
0, 0x00000000
finsh />ls()
Directory /:
DATALOG.TXT 240
HI_UTF8.TXT 35
A_REAL~1.TXT 22
0, 0x00000000
要列出所有可用命令,請(qǐng)輸入list()
。
finsh />list()
--Function List:
hello -- say hello world
version -- show RT-Thread version information
list -- list available commands
list_mem -- list memory usage information
list_thread -- list thread
list_sem -- list semaphore in system
list_mutex -- list mutex in system
list_event -- list event in system
list_mb -- list mail box in system
list_mq -- list message queue in system
list_memp -- list memory pool in system
list_timer -- list timer in system
list_dev -- list device in system
mkfs -- make a file system
df -- get disk free
mkdir -- create a directory
cd -- change current working directory
ls -- list directory contents
rm -- remove files or directories
cat -- print file content
copy -- copy file or dir
list_sd -- show SD information
--Variable List:
dummy -- dummy variable for finsh
0, 0x00000000
ExFAT、LFN 和非英文字符支持
默認(rèn)情況下不啟用 ExFAT、LFN(長(zhǎng)文件名)和非英文字符支持(以使示例更?。?。在“ rtconfig.h ”(位于 RT-Thread 庫目錄中)中打開以下配置以啟用這些功能。
#define RT_DFS_ELM_USE_EXFAT
#define RT_DFS_ELM_USE_LFN (2)
#define RT_DFS_ELM_MAX_LFN (255)
#define RT_DFS_ELM_CODE_PAGE 936
RT_DFS_ELM_MAX_LFN表示文件名的最大長(zhǎng)度,可以在 12 到 255 的范圍內(nèi)。
RT_DFS_ELM_CODE_PAGE默認(rèn)設(shè)置為 437 用于美國(guó),更改為 936 將啟用簡(jiǎn)體中文支持,如下所示。
finsh />ls()
Directory /:
DATALOG.TXT 240
hi_utf8.txt 35
a_really_long_file_name.txt22
0, 0x00000000
finsh />cat("hi_utf8.txt")
Hello, world!
世界,你好! 0, 0x00000000
下一步
- RT-Thread Primer(即將推出)
- 帶有RT-Thread的Arduino應(yīng)用程序
- RT-Thread文檔_workqueue
- RT-Thread文檔_ringbuffer
- RT-Thread文檔_completion
- RT-Thread文檔_RT-Thread SMP 介紹與移植
- RT-Thread文檔_內(nèi)核基礎(chǔ)
- RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
- RT-Thread文檔_RT-Thread 簡(jiǎn)介
- RT-Thread Smart 上手指南
- 【RT-Thread開源作品秀】基于RT-Thread的星務(wù)平臺(tái)研究
- RT-Thread AI kit開源:輕松實(shí)現(xiàn)一鍵部署AI模型至 RT-Thread
- RT-Thread Studio驅(qū)動(dòng)SD卡
- 嵌入式RT-Thread應(yīng)用與開發(fā) 72次下載
- RT-Thread用戶手冊(cè) 0次下載
- RT-Thread編程指南 0次下載
- 基于 RT-Thread專業(yè)版的EtherCAT主站方案 1010次閱讀
- BL808 RT-Thread Wi-Fi驅(qū)動(dòng)適配 924次閱讀
- RT-Thread qemu mps2-an385 bsp移植制作 :系統(tǒng)運(yùn)行篇 874次閱讀
- i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下) 960次閱讀
- i.MX RT1170:VGLite移植RT-Thread Nano過程講解(上) 2778次閱讀
- rt-studio潘多拉開發(fā)板最新rt-thread不能運(yùn)行解決辦法 1395次閱讀
- RT-Thread記錄(八、理解RT-Thread內(nèi)存管理) 2437次閱讀
- RT-Thread自動(dòng)初始化機(jī)制 2722次閱讀
- RT-Thread 4.1.0的CMake構(gòu)建教程 3415次閱讀
- 如何使用xmake工具來編譯rt-thread工程 2226次閱讀
- RT-Thread v4.1.0中FAL介紹 3900次閱讀
- 如何創(chuàng)建RT-Thread Nano工程 3845次閱讀
- RT-Thread NetUtils的使用方法 8054次閱讀
- 如何創(chuàng)建標(biāo)準(zhǔn)的RT-Thread項(xiàng)目工程?詳細(xì)過程分析概述 9299次閱讀
- RT-Thread軟件包定義和使用 1w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多