2. 格式化存储介质

任务目标

本案例演示如何使用FileX的fx_media_format接口对存储介质执行格式化操作,配置扇区大小、簇大小等关键参数,并通过重新打开介质验证格式化结果。

环境依赖

需要FileX库(建议6.x版本),以及一个已实现底层读写接口的RAM磁盘驱动(本案例使用内存数组模拟)。驱动需提供fx_driver_initialize、读写扇区等回调函数。

关键完整代码

#include "fx_api.h"

/* 模拟存储介质:4MB RAM磁盘 */
#define SECTOR_SIZE     512
#define SECTOR_COUNT    8192        /* 4MB / 512B */
#define CLUSTER_SIZE    4096        /* 8个扇区/簇 */

static UCHAR media_memory[SECTOR_SIZE * SECTOR_COUNT];

/* 驱动读写函数(简化实现) */
static VOID _ram_driver(FX_MEDIA *media_ptr)
{
    /* 根据media_ptr->fx_media_driver_request处理读写请求 */
    switch (media_ptr->fx_media_driver_request)
    {
    case FX_DRIVER_READ:
    case FX_DRIVER_WRITE:
    {
        UCHAR *buffer = media_ptr->fx_media_driver_buffer;
        ULONG sector = media_ptr->fx_media_driver_logical_sector;
        ULONG count = media_ptr->fx_media_driver_sectors;
        memcpy(buffer, media_memory + sector * SECTOR_SIZE, count * SECTOR_SIZE);
        media_ptr->fx_media_driver_status = FX_SUCCESS;
        break;
    }
    case FX_DRIVER_INIT:
    case FX_DRIVER_UNINIT:
    case FX_DRIVER_FLUSH:
    case FX_DRIVER_ABORT:
        media_ptr->fx_media_driver_status = FX_SUCCESS;
        break;
    default:
        media_ptr->fx_media_driver_status = FX_NOT_IMPLEMENTED;
        break;
    }
}

int main(void)
{
    FX_MEDIA ram_disk;
    UCHAR *work_buffer;
    UINT status;

    /* 初始化FileX */
    fx_system_initialize();

    /* 分配格式化工作缓冲区(建议至少1个扇区大小) */
    work_buffer = malloc(SECTOR_SIZE * 16);
    if (work_buffer == NULL) return -1;

    /* 执行格式化:FAT32文件系统 */
    status = fx_media_format(&ram_disk,
                             _ram_driver,           /* 驱动入口 */
                             FX_NULL,               /* 无需额外驱动信息 */
                             media_memory,          /* 介质指针(RAM磁盘用) */
                             work_buffer,           /* 工作缓冲区 */
                             sizeof(work_buffer),   /* 工作缓冲区大小 */
                             "RAM_DISK",            /* 卷标 */
                             SECTOR_COUNT,          /* 总扇区数 */
                             SECTOR_SIZE,           /* 扇区大小(字节) */
                             0,                     /* 保留扇区数(自动计算) */
                             2,                     /* FAT表数量 */
                             0,                     /* 根目录项数(FAT32自动) */
                             0,                     /* 隐藏扇区数 */
                             CLUSTER_SIZE / SECTOR_SIZE,  /* 每簇扇区数 */
                             FX_FAT32,              /* FAT类型 */
                             FX_TRUE);              /* 使能FAT32 */

    if (status != FX_SUCCESS)
    {
        printf("格式化失败: %u\n", status);
        free(work_buffer);
        return -1;
    }
    printf("格式化成功\n");

    /* 验证:重新打开介质 */
    status = fx_media_open(&ram_disk, "RAM_DISK",
                           _ram_driver, FX_NULL,
                           media_memory, work_buffer,
                           sizeof(work_buffer));
    if (status != FX_SUCCESS)
    {
        printf("打开失败: %u\n", status);
        free(work_buffer);
        return -1;
    }

    /* 检查介质参数 */
    printf("介质已打开,总扇区数: %lu\n", ram_disk.fx_media_total_sectors);
    printf("每簇扇区数: %u\n", ram_disk.fx_media_sectors_per_cluster);
    printf("FAT类型: %s\n",
           (ram_disk.fx_media_32_bit_FAT) ? "FAT32" : "FAT16");

    /* 关闭介质 */
    fx_media_close(&ram_disk);
    free(work_buffer);
    return 0;
}

编译与运行

# 假设FileX库已编译为libfilex.a
gcc -o format_demo format_demo.c -I/path/to/filex -L/path/to/lib -lfilex
./format_demo

验证方法

程序执行后观察输出:

  • 若打印格式化成功,说明fx_media_format返回FX_SUCCESS;
  • 随后fx_media_open成功打开介质,并打印总扇区数8192、每簇扇区数8、FAT类型FAT32,即证明格式化参数已正确写入介质;
  • 若格式化失败,检查work_buffer大小是否足够(建议至少4KB),以及驱动读写回调是否正确处理FX_DRIVER_READ/WRITE请求。

关键说明

fx_media_format的参数中,sectors_per_cluster直接决定簇大小(本案例为8×512=4096字节)。FAT32格式下根目录项数参数会被忽略(自动处理)。格式化完成后,介质上已写入引导扇区、FAT表和根目录,因此可以立即用fx_media_open打开并访问。