电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>带有RT-Thread的更好的SD库

带有RT-Thread的更好的SD库

2023-06-14 | zip | 0.00 MB | 次下载 | 免费

资料介绍

描述

背景

Arduino IDE 附带的 SD 库很方便,但缺少 exFAT、LFN(长文件名)和非英文字符支持等功能。本文介绍了一种替代 SD 卡驱动程序(基于 RT-Thread)来解决这些问题。

RT-线程

RT-Thread是一个免费的开源(Apache 许可证 2.0)RTOS,并以 Arduino 库的形式提供还有另一篇文章 ( Multitasking on Arduino ) 可用于了解 RT-Thread 的基本概念。

让我们从通过 Arduino IDE 的库管理器安装库开始。(本文基于 RT-Thread 库版本 0.4.4 。)

SD 卡驱动程序 (TL;DR)

(如果您对实现不感兴趣,只想知道如何使用它,请跳过本节。)

RT-Thread 库中的 SD 卡支持采用DFS(设备文件系统)的形式,它是 RT-Thread 架构的一部分。FAT 是 RT-Thread 支持的文件系统之一。(在 RT-Thread 库的 0.4.4 版本中,FAT 是唯一支持的文件系统。)

FAT DFS 本​​身就是基于ChaN 的 FatFs 项目的优秀作品

标准的 RT-Thread DFS 提供以下文件系统和文件接口

/* 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);
}

一个特定的 DFS 可能会实现它们的全部或部分。当挂载DFS时,例如dfs_mount("SD", "/", "elm", 0, 0),特定的DFS会绑定到一个设备上。在这种情况下,DFS "elm" (FatFs) 绑定到设备 "SD"。

标准的 RT-Thread 设备提供以下接口:

/* 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);
};

一个特定的设备可以实现它们的全部或全部(将函数指针设置为 NULL)。

在库中,名为“SD”的设备实现了与SD卡访问相关的功能,在MKRZERO板的情况下,它涉及到一个名为“SPI1”的低级设备。而 SPI 设备最终涉及到了 Arduino SPI 库。

数据记录器示例

Arduino SD 库提供了一个名为“Datalogger”的示例。RT-Thread 库中也提供了相同的示例,如下面的代码部分所列。

不同之处在于,在下面的示例代码中,采样间隔为 1 秒,并且只执行 10 次。

您可能已经注意到上面的注释open()功能。要打开现有文件并删除其所有内容,只需O_APPENDO_TRUNC标志替换即可。

当使用 MKRZERO 板运行以下示例时,您可能会观察到串行监视器的以下输出

\ | /
- 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 进行操作

使用 RT-Thread 库的真正优势在于它使您能够使用 (FinSH) shell 命令来操作文件。

串行监视器或其他串行终端工具中,输入ls()命令将显示当前目录(在本例中为“/”)中的文件列表,如下所示。

ls()
Directory /:
DATALOG.TXT         240
HI_UTF8.TXT         35
A_REAL~1.TXT        22
       0, 0x00000000 

文件名后面的数字是以字节为单位的文件大小。在上面的屏幕截图中,“datalog.txt”的大小为 240 字节,因为我运行了该示例两次。

输入cat("datalog.txt")命令会显示“datalog.txt”的内容,确认有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

要列出所有可用命令,请输入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 和非英文字符支持

默认情况下不启用 ExFAT、LFN(长文件名)和非英文字符支持(以使示例更小)。在“ 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表示文件名的最大长度,可以在 12 到 255 的范围内。

RT_DFS_ELM_CODE_PAGE默认设置为 437 用于美国,更改为 936 将启用简体中文支持,如下所示。

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(即将推出)

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费