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打开并访问。