windows平台模拟测试FATFS
2017-03-23 17:02
405 查看
由于项目中需要从SD卡中读取文件,为了方便操作,需要移植文件系统,源码比较容易获取的两个文件系统为FATFS和znFAT,看了一下FatFS文旦比较丰富,同时接口清晰,所以优先选择FatFS进行测试,这样在了解FatFS移植的关键点后再移植到STM32平台会比较有把握,网上也有windows平台移植文件系统的Demo,但是大家要么直接读写本机的磁盘,要么读写U盘,本人不建议这么弄,要是程序有问题把磁盘搞坏了,这个就比较郁闷了。
工欲善其事必先利其器,首先准备我们需要的工具,这里我准备了两个工具,一个创建FAT12格式镜像的工具,此工具是我从网上COPY一个朋友代码制作的,还有一个是从ADT工具包中拷贝的模拟SD卡创建工具mksdcard,此工具创建的镜像为FAT32格式,这两个工具我会共享,共享地址见文章底部,另外我们还需要一个镜像查看工具,本人推荐UltraISO。
第一步创建测试镜像,使用mksdcard创建一个128M的虚拟SD卡文件
使用UltraISO打开查看如下,此时SD空白
第二步移植FATFS,使用VS2010创建Console项目,不要使用Unicode,否则会出现路径问题,拷贝FatFS到项目目录,添加相关文件,如果你不使用长文件名option目下的文件不用添加,FatFS本人使用的是V12C,项目的组织结构本人就不描述了,每个人的习惯不同,组织习惯也不同,项目源码最终会共享,共享地址在文章的末尾,现在说移植重点,对于ffconf.h的配置,每一项的说明都很清楚,因为测试,本人一行没改,修改diskio.c,重新实现磁盘读写函数,其实就是读写镜像文件,本人使用的是C语言的方式,
#ifdef _MSC_VER
#include <Windows.h>
#include "adaptor.h"
#include <stdio.h>
#define SECTOR_SIZE 512
#endif
FILE *fpImg = 0;
disk_status函数实现
if (pdrv == 0 && fpImg)
{
return RES_OK;
}
return STA_NOINIT;disk_initialize函数实现
if (pdrv == 0)
{
if (!fpImg)
{
char strImgName[0xff];
memset(strImgName, 0, 0xff);
GetSimFilePath(strImgName, 0xff);
fpImg = fopen(strImgName, "rb+"); //open file for read/write
if (fpImg == NULL)
return STA_NOINIT;
}
return RES_OK;
}disk_read函数实现
disk_write函数实现
if (pdrv == 0)
{
BYTE *pOut = buff;
int i = 0;
if (!fpImg)
return RES_ERROR;
fseek(fpImg, SECTOR_SIZE*sector, SEEK_SET);
for (i = 0; i < count; i++)
{
//fread(pOut, SECTOR_SIZE, 1, fpImg);
fwrite(pOut, SECTOR_SIZE, 1, fpImg);
pOut = pOut + SECTOR_SIZE;
}
result = RES_OK;
return result;
}
disk_ioctl函数实现
switch (cmd)
{
case CTRL_SYNC:
{
break;
}
case GET_SECTOR_COUNT:
{
DWORD fz = 0;
if (!fpImg)
return;
fseek(fpImg,0,SEEK_END);
fz = ftell(fpImg);
*(DWORD*)buff = (fz / SECTOR_SIZE);
break;
}
case GET_SECTOR_SIZE:
{
break;
}
case GET_BLOCK_SIZE:
{
break;
}
case CTRL_TRIM:
{
break;
}
default:
break;
} 第三部,测试
FATFS fs;
FRESULT res;
FIL fil;
UINT read = 0;
memset(fs.win, 0, 512);
res = f_mount(&fs, _T("0"), 1);
if (res != FR_OK) return 1;
/*
res = f_open(&fil, _T("config.h"), FA_OPEN_ALWAYS | FA_READ);
BYTE msg[128];
memset(msg, 0, 128);
res = f_read(&fil, msg, 128,&read);
*/
res = f_open(&fil, _T("config.h"), FA_CREATE_NEW | FA_WRITE);
char* str = "Hello From FATFS";
res = f_write(&fil, str, strlen(str), &read);
f_close(&fil);
使用UltraISO打开查看如下
将文件CONFIG.H拖出来,打开如下
同样,也可以进行读取测试,这里就不在赘述,还可以使用FAT12Tool创建软盘镜像进行测试,
写这篇文章一是为了记录,二是为了给需要的朋友提供一个切入点,在完成基本的读写测试后,有兴趣的朋友可以进行格式化,创建文件夹等测试,也可以基于FATFS做一个虚拟SD卡管理工具(如果哪位朋友做了,给我发一个),更高级的可以阅读FAT系统规范,写属于自己的FAT文件系统,用以上介绍的知识进行测试。
镜像创建工具,内附说明
测试工程源码
工欲善其事必先利其器,首先准备我们需要的工具,这里我准备了两个工具,一个创建FAT12格式镜像的工具,此工具是我从网上COPY一个朋友代码制作的,还有一个是从ADT工具包中拷贝的模拟SD卡创建工具mksdcard,此工具创建的镜像为FAT32格式,这两个工具我会共享,共享地址见文章底部,另外我们还需要一个镜像查看工具,本人推荐UltraISO。
第一步创建测试镜像,使用mksdcard创建一个128M的虚拟SD卡文件
使用UltraISO打开查看如下,此时SD空白
第二步移植FATFS,使用VS2010创建Console项目,不要使用Unicode,否则会出现路径问题,拷贝FatFS到项目目录,添加相关文件,如果你不使用长文件名option目下的文件不用添加,FatFS本人使用的是V12C,项目的组织结构本人就不描述了,每个人的习惯不同,组织习惯也不同,项目源码最终会共享,共享地址在文章的末尾,现在说移植重点,对于ffconf.h的配置,每一项的说明都很清楚,因为测试,本人一行没改,修改diskio.c,重新实现磁盘读写函数,其实就是读写镜像文件,本人使用的是C语言的方式,
#ifdef _MSC_VER
#include <Windows.h>
#include "adaptor.h"
#include <stdio.h>
#define SECTOR_SIZE 512
#endif
FILE *fpImg = 0;
disk_status函数实现
if (pdrv == 0 && fpImg)
{
return RES_OK;
}
return STA_NOINIT;disk_initialize函数实现
if (pdrv == 0)
{
if (!fpImg)
{
char strImgName[0xff];
memset(strImgName, 0, 0xff);
GetSimFilePath(strImgName, 0xff);
fpImg = fopen(strImgName, "rb+"); //open file for read/write
if (fpImg == NULL)
return STA_NOINIT;
}
return RES_OK;
}disk_read函数实现
if (pdrv == 0) { BYTE *pOut = buff; int i = 0; if (!fpImg) return RES_ERROR; fseek(fpImg, SECTOR_SIZE*sector, SEEK_SET); for (i = 0; i < count; i++) { fread(pOut, SECTOR_SIZE, 1, fpImg); pOut = pOut + SECTOR_SIZE; } return RES_OK; }
disk_write函数实现
if (pdrv == 0)
{
BYTE *pOut = buff;
int i = 0;
if (!fpImg)
return RES_ERROR;
fseek(fpImg, SECTOR_SIZE*sector, SEEK_SET);
for (i = 0; i < count; i++)
{
//fread(pOut, SECTOR_SIZE, 1, fpImg);
fwrite(pOut, SECTOR_SIZE, 1, fpImg);
pOut = pOut + SECTOR_SIZE;
}
result = RES_OK;
return result;
}
DWORD get_fattime(void) { #ifdef _MSC_VER return GetTickCount(); #endif return 0; }
disk_ioctl函数实现
switch (cmd)
{
case CTRL_SYNC:
{
break;
}
case GET_SECTOR_COUNT:
{
DWORD fz = 0;
if (!fpImg)
return;
fseek(fpImg,0,SEEK_END);
fz = ftell(fpImg);
*(DWORD*)buff = (fz / SECTOR_SIZE);
break;
}
case GET_SECTOR_SIZE:
{
break;
}
case GET_BLOCK_SIZE:
{
break;
}
case CTRL_TRIM:
{
break;
}
default:
break;
} 第三部,测试
FATFS fs;
FRESULT res;
FIL fil;
UINT read = 0;
memset(fs.win, 0, 512);
res = f_mount(&fs, _T("0"), 1);
if (res != FR_OK) return 1;
/*
res = f_open(&fil, _T("config.h"), FA_OPEN_ALWAYS | FA_READ);
BYTE msg[128];
memset(msg, 0, 128);
res = f_read(&fil, msg, 128,&read);
*/
res = f_open(&fil, _T("config.h"), FA_CREATE_NEW | FA_WRITE);
char* str = "Hello From FATFS";
res = f_write(&fil, str, strlen(str), &read);
f_close(&fil);
使用UltraISO打开查看如下
将文件CONFIG.H拖出来,打开如下
同样,也可以进行读取测试,这里就不在赘述,还可以使用FAT12Tool创建软盘镜像进行测试,
写这篇文章一是为了记录,二是为了给需要的朋友提供一个切入点,在完成基本的读写测试后,有兴趣的朋友可以进行格式化,创建文件夹等测试,也可以基于FATFS做一个虚拟SD卡管理工具(如果哪位朋友做了,给我发一个),更高级的可以阅读FAT系统规范,写属于自己的FAT文件系统,用以上介绍的知识进行测试。
镜像创建工具,内附说明
测试工程源码
相关文章推荐
- FatFs在windows平台上的移植并测试(VC6)
- Windows平台下的多线程编程
- 利用键盘钩子在Windows平台下捕获键盘动作
- 一些在windows平台下从声卡录音的资源,参考本文。
- 闲着无事,写了一个检测内存越界访问的工具(windows平台)
- Windows平台下程序日志的设计和实现(上:设计、实现和应用)
- windows平台上的数据库访问技术
- 编写可以在所有WINDOWS平台上运行的应用软件
- Windows+Maven+Eclips 开发平台的构建
- 软件设计深度挖掘(二)(仅针对windows平台)实现杂谈篇
- AWStats: Apache/IIS的日志分析工具——在GNU/Linux和Windows平台上的使用简介
- Windows平台下的多线程编程
- Windows平台下的多线程编程
- 在Windows平台上安装SGI版的OpenGL
- [HOW-TO] Windows平台如何编译MySQL代码
- MySQL安装指南(Windows平台)
- 集成软件化解冤家 Linux 平台跑 Windows 程序
- 标准配置的Windows平台上潜在可用屏幕区域
- PostgreSQL 8.0上手(Windows平台)