FatFs模块程序移植手册(未完待续)
2011-11-18 17:01
239 查看
FatFs模块程序移植手册
1. 如何移植?
基本情况
FatFs模块假设有以下的移植条件
l ANSI C
FatFs模块是用ANSI C(89)书写的中间件。它不依赖于任何平台,只要编译器符合ANSI C就可以。
l Interger类型的大小
FatFs模块假设char/short/long类型的大小分别是8/16/32位并且int是16位或者32位。这些内容定义在integer.h文件中,这对于大多数编译器来说不成问题。当和现有定义发生任何冲突时,你必须要小心处理。
需要处理那些函数?
你只需要提供FatFs模块所需的低级别磁盘I/O函数。如果目标系统中已经存在一个磁盘模块在工作,你仅需要实现对应于FatFs模块的功能函数。否则的话,你需要移植一个磁盘模块并从头实现它。不是所有定义的函数都需要实现。比如,磁盘写入函数在只读模式下就不需要实现。下面的表格列出了根据配置选项哪些函数需要实现。
2. 限制
l FAT子类型:FAT12、FAT16和FAT32。
l 打开文件的数量:无限制,由系统可利用的内存来决定。
l 卷的数量:最多10个。
l 文件大小:依赖于FAT规格。(1-4G字节)
l 卷大小:依赖于FAT规格。(512字节/扇区时最高2T)
l 簇大小:依赖于FAT规格。(512字节/扇区时最高64K)
l 扇区大小:依赖于FAT规格。(最高4K字节)
3. 内存使用情况
一些目标系统的内存使用情况有以下情况。内存大小以字节为单位。V代表挂载的卷的数量,F表示打开文件的数量。所有的示例都在代码大小上进行了优化。
4. 模块大小的减少
下表展示了根据配置选项可以移除的API函数,以减少模块大小。
5. 长文件名
FatFs模块开始从R0.07版本开始支持长文件名。短文件名和长文件名两者的对于文件的区别除了f_readdir函数以外是透明的。设置_USE_LFN为1,2或者3来使能长文件名并且添加ff_convert()和ff_wtoupper()函数到工程中来支持unicode。长文件名特性额外需要一个特定的工作缓冲区。这个缓冲区大小可以根据内存的大小由_MAX_LFN来配置。长文件名的大小可达255个字节,所以_MAX_LFN需要设置为255以支持长文件名所有的特性操作。如果对于给定的文件名,工作缓冲区的大小不足的话,文件函数会返回FR_INVALID_NAME的错误值。当需要设置长文件名的重入特性时,_USE_LFN需要设置为2或者3。这时,文件函数从栈或者堆中申请工作缓冲区。工作缓冲区占用(_MAX_LFN+1)*2个字节。
6. Unicode API
7. 重入
8. 重复的文件访问
9. 有效文件访问的性能
10. 闪存介质的注意事项
11. 临界区
12. FatFs的许可
未完待续.....
1. 如何移植?
基本情况
FatFs模块假设有以下的移植条件
l ANSI C
FatFs模块是用ANSI C(89)书写的中间件。它不依赖于任何平台,只要编译器符合ANSI C就可以。
l Interger类型的大小
FatFs模块假设char/short/long类型的大小分别是8/16/32位并且int是16位或者32位。这些内容定义在integer.h文件中,这对于大多数编译器来说不成问题。当和现有定义发生任何冲突时,你必须要小心处理。
需要处理那些函数?
你只需要提供FatFs模块所需的低级别磁盘I/O函数。如果目标系统中已经存在一个磁盘模块在工作,你仅需要实现对应于FatFs模块的功能函数。否则的话,你需要移植一个磁盘模块并从头实现它。不是所有定义的函数都需要实现。比如,磁盘写入函数在只读模式下就不需要实现。下面的表格列出了根据配置选项哪些函数需要实现。
函数 | 什么时候需要实现 | 注意事项 |
disk_initialize disk_status disk_read | Always | 磁盘I/O 函数。 Ffsample.zip中有示例。 网络上也有好多实现版本。 |
disk_write get_fattime disk_ioctl (CTRL_SYNC) | _FS_READONLY == 0 | |
disk_ioctl (GET_SECTOR_COUNT) disk_ioctl (GET_BLOCK_SIZE) | _USE_MKFS == 1 | |
disk_ioctl (GET_SECTOR_SIZE) | _MAX_SS > 512 | |
disk_ioctl (CTRL_ERASE_SECTOR) | _USE_ERASE == 1 | |
ff_convert ff_wtoupper | _USE_LFN >= 1 | 支持Unicode函数。 |
ff_cre_syncobj ff_del_syncobj ff_req_grant ff_rel_grant | _FS_REENTRANT == 1 | 系统依赖函数。 |
ff_mem_alloc ff_mem_free | _USE_LFN == 3 |
l FAT子类型:FAT12、FAT16和FAT32。
l 打开文件的数量:无限制,由系统可利用的内存来决定。
l 卷的数量:最多10个。
l 文件大小:依赖于FAT规格。(1-4G字节)
l 卷大小:依赖于FAT规格。(512字节/扇区时最高2T)
l 簇大小:依赖于FAT规格。(512字节/扇区时最高64K)
l 扇区大小:依赖于FAT规格。(最高4K字节)
3. 内存使用情况
ARM7 32bit | ARM7 Thumb | Crotex-M3 Thumb-2 | AVR | H8/300H | PIC24 | RL78 | V850ES | SH-2A | RX62N | IA-32 | |
Compiler | GCC | GCC | GCC | GCC | CH38 | C30 | CC78K0R | CA850 | SHC | RXC | VC6 |
_WORD_ACCESS | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
Text (Full, R/W) | 10459 | 7201 | 6623 | 12646 | 10686 | 11466 | 12967 | 7732 | 8752 | 5747 | 7545 |
Text (Min, R/W) | 6503 | 4745 | 4297 | 8306 | 6986 | 7440 | 8745 | 4938 | 5576 | 3746 | 4923 |
Text (Full, R/O) | 4535 | 3181 | 2869 | 5960 | 4876 | 5286 | 6060 | 3554 | 3804 | 2659 | 3450 |
Text (Min, R/0) | 3303 | 2493 | 2171 | 4366 | 3770 | 3984 | 4604 | 3684 | 2940 | 2025 | 2664 |
Bss | D*4 + 2 | D*4 + 2 | D*4 + 2 | D*2 + 2 | D*4 + 2 | D*2 + 2 | D*2 + 2 | D*4 + 2 | D*4 + 2 | D*4 + 2 | D*4 + 2 |
Work area (_FS_TINY == 0) | V*560 + F*550 | V*560 + F*550 | V*560 + F*550 | V*560 + F*554 | V*560 + F*550 | V*560 + F*554 | V*560 + F*554 | V*560 + F*554 | V*560 + F*554 | V*560 + F*550 | V*560 + F*550 |
Work area (_FS_TINY == 1) | V*560 + F*36 | V*560 + F*36 | V*560 + F*36 | V*560 + F*32 | V*560 + F*36 | V*560 + F*32 | V*560 + F*32 | V*560 + F*36 | V*560 + F*36 | V*560 + F*36 | V*560 + F*36 |
_FS_READONLY 0 (R/W), 1 (R/O) _FS_MINIMIZE 0 (Full function), 3 (Minimized function) _USE_STRFUNC 0 (Disable string functions) _USE_MKFS 0 (Disable f_mkfs function) _USE_FORWARD 0 (Disable f_forward function) _USE_FASTSEEK 0 (Disable fast seek feature) _CODE_PAGE 932 (Japanese Shift-JIS) _USE_LFN 0 (Disable LFN) _MAX_SS 512 (Fixed sector size) _FS_RPATH 0 (Disable relative path) _VOLUMES D (Number of logical drives to be used) _MULTI_PARTITION 0 (Single partition per drive) _FS_REENTRANT 0 (Disable reentrancy) _FS_SHARE 0 (Disable shareing control)
4. 模块大小的减少
下表展示了根据配置选项可以移除的API函数,以减少模块大小。
Function | _FS_MINIMIZE | _FS_READONLY | _USE_STRFUNC | _FS_RPATH | _USE_MKFS | _USE_FORWARD | _MULTI_PARTITION | ||||||||||
0 | 1 | 2 | 3 | 0 | 1 | 0 | 1/2 | 0 | 1 | 2 | 0 | 1 | 0 | 1 | 0/1 | 2 | |
F_mout | |||||||||||||||||
F_open | |||||||||||||||||
F_close | |||||||||||||||||
F_read | |||||||||||||||||
F_write | X | ||||||||||||||||
F_sysn | X | ||||||||||||||||
F_lseek | X | ||||||||||||||||
F_opendir | X | X | |||||||||||||||
F_readdir | X | X | |||||||||||||||
F_stat | X | X | X | ||||||||||||||
F_getfree | X | X | X | X | |||||||||||||
F_truncate | X | X | X | X | |||||||||||||
F_unlink | X | X | X | X | |||||||||||||
F_mkdir | X | X | X | X | |||||||||||||
F_chmod | X | X | X | X | |||||||||||||
F_utime | X | X | X | X | |||||||||||||
f_rename | X | X | x | X | |||||||||||||
F_chidir | X | ||||||||||||||||
F_chdrive | X | ||||||||||||||||
F_getcwd | X | x | |||||||||||||||
F_mkfs | X | X | |||||||||||||||
F_fdisk | X | X | x | ||||||||||||||
F_forward | x | ||||||||||||||||
F_putc | X | x | |||||||||||||||
F_puts | X | X | |||||||||||||||
F_printf | X | X | |||||||||||||||
F_gets | X |
FatFs模块开始从R0.07版本开始支持长文件名。短文件名和长文件名两者的对于文件的区别除了f_readdir函数以外是透明的。设置_USE_LFN为1,2或者3来使能长文件名并且添加ff_convert()和ff_wtoupper()函数到工程中来支持unicode。长文件名特性额外需要一个特定的工作缓冲区。这个缓冲区大小可以根据内存的大小由_MAX_LFN来配置。长文件名的大小可达255个字节,所以_MAX_LFN需要设置为255以支持长文件名所有的特性操作。如果对于给定的文件名,工作缓冲区的大小不足的话,文件函数会返回FR_INVALID_NAME的错误值。当需要设置长文件名的重入特性时,_USE_LFN需要设置为2或者3。这时,文件函数从栈或者堆中申请工作缓冲区。工作缓冲区占用(_MAX_LFN+1)*2个字节。
6. Unicode API
7. 重入
8. 重复的文件访问
9. 有效文件访问的性能
10. 闪存介质的注意事项
11. 临界区
12. FatFs的许可
未完待续.....
相关文章推荐
- 开源Jpeg解码模块,ChaN(FatFs 作者)又一力作,代码精炼,体积小巧,很容易移植(有图有 http://www.amobbs.com/thread-5255634-1-1.html
- fatfs模块程序移植手册
- 章节5 目标板程序SystemView模块的实现 - Segger SystemView使用手册(译文)
- linux device driver II 的模块程序在linux kernel 2.6.x 上的移植
- STM32F103至STM32F407程序移植参考手册
- Quartus Ⅱ 15.1 将Verilog模块程序封装
- 发布MVC项目到服务器上时候遇到的 模块 DirectoryListingModule 通知 ExecuteRequestHandler 处理程序 StaticFile 错误代码 0x00000000
- flappy pig小游戏源码分析(4)——核心pig模块(未完待续)
- asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 关于QT4中程序移植到QT5中报“undefined reference to”问题
- CC2541程序向CC2540移植
- 实现内核驱动程序模块
- PC机上移植FatFs文件系统
- 嵌入式开发-iMX6开发板移植移动4G模块第二部分
- [转载]手把手教你用C#打包应用程序(安装程序)【卸载模块已添加】
- (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块
- 如何将QT程序移植到开发板上运行
- 编写可移植C/C++程序的要点
- MSP430F5438A单片机基于SPI的FatFs移植笔记(二)
- PHP程序开发参考手册