FATFS在嵌入式操作系统FreeRTOS中的移植与应用

高兆强 王绍举 徐伟 代书博 李治根



摘 要: FreeRTOS作为一款免费的实时操作系统,系统内核小、裁剪方便、移植性好,广泛应用于对成本敏感的小型嵌入式系统中,但是FreeRTOS本身不带文件管理功能,不便于很多需要经常进行文件存储与读写的应用。为了提高该操作系统易用性,介绍一款免费、小巧并且读写高效的文件管理系统,即FATFS,详细说明FATFS在FreeRTOS上的移植与注意事项,重点说明了FATFS在FreeRTOS中如何解决重入的问题,最后在STM32F4平台上对U盘进行读写来验证其文件管理的效果。结果表明,其可以很好地完成文件管理的功能。
关键词: 嵌入式操作系统; FATFS; FreeRTOS; 文件管理系统
中图分类号: TN911?34; TP319 文献标识码: A 文章编号: 1004?373X(2017)06?0065?03
Abstract: As a free real?time operating system, FreeRTOS is widely used in cheap system due to its small system kernel, convenent trim and good portability. However, FreeRTOS itself does not have any file management function, so it is not inconvenient for some applications of often writing and reading files. To make it easy to use, a free?charge, small and efficient file management system, FATFS is introduced in this paper. The FATFS transplantation and matters needing attention on FreeRTOS are illustrated in detail. The method that how to solve the problem of FATFS′s re?entry in the FreeRTOS is described emphatically. A test to read and write something in a U?disk on the platform STM32F4 was conducted to verify its effect. The result shows that it can realize the function of file management.
Keywords: embedded operating system; FATFS; FreeRTOS; file management system
随着信息技术的发展,当今社会的信息量越来越大,以往由单片机系统简单地对存储媒介按地址、按字节的读/写已经无法满足人们实际应用的需要,利用文件系统对存储媒介进行管理成了今后单片机系统的一个发展方向[1]。目前常用的文件系统主要有微软的FAT12,FAT16,FAT32,NTFS,以及Linux 系统下的EXT2,EXT3 等。由于FAT高效、灵活的特点,在当前的消费类电子产品中,用得最多的还是FAT 文件系统,如U 盘,MP3,MP4,数码相机等,因此本文介绍了一款易于移植和使用、占用硬件资源相对较小而功能又强大的FAT 开源文件系统——FATFS[2]。
嵌入式操作系统FreeRTOS的内核不带文件系统,虽然提供了带文件系统的例子,但是需要授权[3],这势必会增加嵌入式开发的成本;因此本文在FreeRTOS中引进了免费、开源的文件管理系统FATFS,使得FreeRTOS的使用更加方便快捷。同时由于FATFS是一款高效、免费、资源占用率低的文件管理系统,使得在只占用很少资源的情况下增加开发FreeRTOS嵌入式产品的效率,并且没有增加成本。
1 FreeRTOS
FreeRTOS是一款非常优秀的嵌入式操作系统,非常适合对成本敏感的小型嵌入式设备,但是为了精简,FreeRTOS内核并没有提供文件管理、网络以及GUI等功能,当需要这些功能的时候就需要移植第三方的软件包[4]。其中文件管理系统在一些需要频繁存储、处理数据的嵌入式设备中尤其重要,因此本文将一款精简但是功能强大的文件管理系统FATFS移植到FreeRTOS中[5]。
2 FATFS
FATFS是一款完全免费开源的FAT文件系统模块,專门为小型的嵌入式系统而设计。它完全用标准的C语言编写,所以具有良好的硬件平台独立性,可以非常方便地移植到8051,PIC,AVR,SH,Z80,ARM等系列单片机上且只需要做简单的修改。它支持FAT12,FAT16,FAT32,支持多个存储媒介,有独立的缓冲区,可以对多个文件进行读写操作,并特别对8位单片机和16位单片机进行优化,增加其读写效率[6]。
FATFS的代码量非常小,大小总共不到200 KB,应用时可以把字库存放到外部存储中,运行时占用内存不到1 KB,因此FATFS并不会对硬件增加太多的额外负担。同时FATFS功能非常强大,它能支持多卷,多个ANSI/OEM或者Unicode,支持多种扇区大小,只读、最小化的API和I/O缓冲区,并且支持RTOS,这使得FATFS非常适合移植到FreeRTOS的系统中去。
FATFS设计的读写方式非常巧妙,这使得它拥有非常高的读写效率,扇区局部的数据通过文件I/O缓冲区来传输;对于长数据的传输,中间的或多个扇区的数据直接传输到应用程序缓冲区;扇区对齐的整块数据传输的情况下,不使用文件I/O缓冲区。在直接传输时disk_read函数一次会最大程度的读取更多的扇区,但是多扇区传输不会跨越簇边界,即使它们是相邻的。因此使用扇区对齐的方式进行读写访问可以避免缓冲区数据传输,并且读写效率将会大大提升[7]。
3 FATFS在FreeROTS上的移植与重入问题
3.1 FATFS在FreeROTS上的移植
这里使用的FATFS是非常完善的R0.10b版本,移植FATFS主要分为三步:
(1) 数据类型。在integer.h 里面定义数据的类型。这里需要了解使用的编译器的数据类型,并根据编译器定义好数据类型。使用的编译器是MDK[8?9],需要转换的类型有:
typedef unsigned char BYTE;
typedef short SHORT;
typedef unsigned short WORD;
typedef unsigned short WCHAR;
typedef int INT;
typedef unsigned int UINT;
typedef long LONG;
typedef unsigned long DWORD;
(2) 配置。打开 ffconf.h,文件系统的配置裁剪等均在此头文件中进行定义配置,具体配置如表1所示。
表1 ffconf.h需要配置的参数
(3) 函数编写。打开diskio.c,进行底层驱动编写,需要根据具体的磁盘编写6 个接口函数,具体如表2所示,其中读写函数实现的方式如图1所示。
表2 需要编写的函数
3.2 重入问题
操作系统中一般是多进程的,对于不同的文件操作总是可以同时工作,这与重入无关,而对于同一个文件的重入访问则要考虑重入,如果一个文件函数调用时其他访问的文件被一个线程使用,则此访问将阻塞,直到该文件解锁。
在FreeRTOS中是利用互斥信号量来完成这个功能的,使能_FS_REENTRANT选项,此时,ff.c中的与平台相关的锁定函数必须为每个RTOS重新编写,同时_SYNC_t选项要相应的写为FreeRTOS对应的信号量结构体xSemaphoreHandle。同时需要加入这四个函数:int ff_cre_syncobj(BYTE vol,_SYNC_t*sobj);int ff_req_grant(_SYNC_t sobj);void ff_rel_grant(_SYNC_t sobj);int ff_del_syncobj(_SYNC_t sobj)。分别对应创建信号量,请求信号量,释放信号量和删除信号量。
函数f_mount挂载磁盘同时创建信号量sobj,函数f_open会请求信号量,然后打开/创建文件,然后释放信号量[9]。这样就保证同一个时间点只有一个任务可以打开同一个文件,这样就保证重入功能的实现,具体如图2所示。
4 文件传输应用
4.1 多任务情况下文件传输
创建三个任务,任务一和任务二的优先级为最高和次高,只是简单的进行LED灯的闪烁,任务三优先级最低[10],进行文件的传输,具体情况如图3所示。
在任务不断调度的情况下,传输大小为50 MB的文件,耗时2 min 22 s,这时只用了64 KB的内存作为缓冲区,如果加大内存,速度则会更快。
4.2 多任务对同一文件操作
下面创建两个相同优先级的任务,利用信号量[11?12],任务一和任务二分别对同一文件进行复制,来验证在操作系统下的多任务对同一文件的操作。具体情况如图4所示。
实验结果如图5所示。
这说明相同优先级的任务一和任务二都完成了对文件1.caj的复制工作,这表明在FreeRTOS中移植文件管理系统FATFS后,利用信号量多个任务可以同时对同一个文件进行读写操作。
5 结 语
本文针对FreeRTOS的特点,选择FATFS作为文件管理系统,修改选项并且编写与操作系统相关的函数,成功移植到操作系统FreeRTOS中,实现了多任务情况下文件存取功能,增加了FreeRTOS的易用性,通过实验验证,证明其可以很好地完成文件管理的功能。
参考文献
[1] 洪岳炜,王百鸣,谢超英.一种易于移植和使用的文件系统FATFS Moule[J].单片机与嵌入式系统应用,2008(5):29?31.
[2] 张涛,左谨平,马华玲.FATFS在32位微控制器STM32上的移植[J].电子技术,2010(3):25?27.
[3] 何小庆.谈谈FreeRTOS极其授权方式[J].单片机与嵌入式系统应用,2015(10):3?4.
[4] 宋华鲁,闫银发,张世福,等.基于STM32和FreeRTOS的嵌入式太阳能干燥实时监测和控制系统设计[J].现代电子技术,2013,36(23):103?106.
[5] Real Time Engineers Ltd. FreeRTOS [EB/OL]. [2015?12?11] . http://www.freertos.org.
[6] Anon. FatFs?Generic FAT file system module [EB/OL]. [2015?10?20]. elm?chan.org/fsw/ff/00indes_e.htl.
[7] Anon. FatFs module application note [EB/OL]. [2015?10?30]. elm?chan.org/fsw/ff/en/appnote.htl .
[8] 李宁.基于MDK的STM32处理器开发应用[M].北京:北京航空航天大学出版社,2008:398?410.
[9] 李宁.ARM开发工具Real View MDK使用入门[M].北京:北京航空航天大学出版社,2008:266?280.
[10] 李志明,檀永,徐石明.STM32嵌入式系统开収实战指南[M].北京:机械工业出版社,2013.
[11] 张龙彪,张果,王剑平,等.嵌入式操作系统FreeRTOS的原理与移植实现[J].信息技術,2012(11):31?34.
[12] 任慰,何顶新,赵金.一种新型嵌入式实时操作系统的移植研究[J].计算机工程,2013(5):284?287.