windows平台模拟测试FATFS

2024-04-12 02:38

本文主要是介绍windows平台模拟测试FATFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于项目中需要从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函数实现
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文件系统,用以上介绍的知识进行测试。

镜像创建工具,内附说明

测试工程源码
————————————————
版权声明:本文为CSDN博主「liangjiapei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liangjiapei/article/details/65444536

这篇关于windows平台模拟测试FATFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895878

相关文章

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入