二、将SD卡格式化成具有两个分区的磁盘。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1、目的
(1)深入理解MBR、DPT等概念。
(2)修改ff.c中的f_mkfs函数,得到一个新函数,f_format(u8 partition,u16 allocsize),前一个参数是指磁盘等分的个数,接受 1、2、3、4四个参数,默认为1,最大为4。后一个参数是指 每簇占用的字节数。
(3)添加命令fdisk,调用上述函数。执行完成后,用读卡器在PC上读取该SD卡,应该显示两个可移动磁盘。
2、f_format()函数的编写
首先新建一个文件fext.c,该文件就实现一个函数 f_format.c,首先将f_mkfs()函数复制过来,在此基础上修改。
编译后,首先解决警告和错误:包含头文件ff.h和diskio.h。引用了ff.c中的静态函数mem_set()和mem_clr(),复制过来。定义Null为0。将FATFS * FatFs[_Drives]做外部声明。
同时发现,不同c源文件中 #define 同样的宏相互之间是不影响的。说明预处理的时候是一个一个文件处理的,不检查相互之间的关联。但同一个文件中,一个宏不能两次定义。
#ifndef NULL
#define NULL 0
#endif //采取这种方式,主要是防止其他 包含的头文件也对NULL进行了定义。
函数中主要修改的地方就是:
n_part = n_part /drv; //进行drv等分。每个磁盘的扇区总数就是这么多。
在DPT对应增加的分区部分,填好分区表16个字节。特别重要的是四个地方:0字节写为00或0x80,第四字节写入0xc0表示FAT32系统。(第一次调试找不到新磁盘,就是由于这个字节默认为0)。第8-11写入分区引导扇区的线性扇区地址。第12-15写入该磁盘分区的大小。
for ( i="0"; i<drv; i++){ //每个分区都要做一次,DBR的写入,FAT分配表初始化,根目录初始化。
b_part+= i*n_part; //调整该分区引导扇区和FAT表起始地址。
b_fat=b_part + n_rsv;
3、其它修改的地方
定义 _DRIVE为2,定义_MULTI_PARTITION为1,表示支持多分区。同时初始化磁盘 物理驱动与分区号转换结构体(每个逻辑磁盘对应一个结构体)。
主程序中也要定义两个文件系统结构体,每个对应一个磁盘。然后分别调用f_mount()函数。
4、调用执行
void UartCmdFdisk(u8 argc,void **argv)
{
FRESULT res;
res=f_format( 2, 2048 ); /2表示格式化成两个磁盘。一簇是4个扇区、2048字节。
执行完这个函数后,磁盘被分成两个分区。
实际结果是,命令界面上可以查询到两个分区。但是利用读卡器放到PC上,却只看到<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />250M的第一分区,不知什么原因。
用户421333 2013-1-18 09:27