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系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖