- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、通过格式化命令-看磁盘文件系统的建立过程
1、添加format命令,单步调试
所有的底层驱动函数都已经准备好。添加格式化命令format后,编译下载。
Format命令的执行主要是调用f_mkfs()函数,下面进行单步调试。
以下主要列出函数的主要执行步骤:
res=f_mkfs( 0, 1, 4096 ); //1表示不需要引导扇区。4096是8个扇区。
进入f_mkfs()函数,这里只列出主要执行步骤:
if (disk_ioctl(drv, GET_SECTOR_COUNT, n_part) != RES_OK || n_part MIN_SECTOR)
return FR_MKFS_ABORTED;这个函数调用后,n_part=0x000F,3400 = 996 352,这是SD的总块数。
allocsize /= SS(fs); 等于8/* Number of sectors per cluster */
n_clst = n_part / allocsize; //等于0x1E680 = 124 544 簇。
if (n_clst = 0xFFF5) fmt = FS_FAT32; 所以文件系统确定为FAT32类型。
n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表示FAT要占据974个扇区。
n_rsv = 33 - partition; 保留扇区32个。
n_dir = 0;
b_fat = b_part + n_rsv; /* FATs start sector 32扇区*/
b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于FAT表个数设为1个,所以目录区=FAT起始+FAT占用扇区数*/
b_data = b_dir + n_dir; /* Data start sector */
以上三项确定 FAT区域、根目录区、数据区的起始扇区。
disk_ioctl(drv, GET_BLOCK_SIZE, n) != RES_OK,这个函数调用没有正确返回 可擦出扇区的总数。接下来程序会出错,因此退出,修改disk_ioctl()函数后,再次分析。把这个函数返回值直接改为32。并且把FAT表的个数定义为2.
N_FATS改为2后,根目录区、数据区的起始扇区的起始扇区变为0x7BC=1980扇区。继续往下执行。
n = (b_data + n - 1) ~(n - 1);
n_fat += (n - b_data) / N_FATS;这两句话对fat所占扇区数进行了修正,保证擦除时,以32个扇区为一个单位。
n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; =0x1E588。
tbl = fs-win; /* Clear buffer */
mem_set(tbl, 0, SS(fs)); 清零文件系统缓冲区。
mem_set(tbl, 0, SS(fs));
ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */
ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */
tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */
ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */
上面的工作主要是填充 引导扇区缓冲区,也就是常说的DBR扇区缓冲,等所有的参数写好,就可以写回磁盘。
ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */
if (disk_write(drv, tbl, b_part+0, 1) != RES_OK)
return FR_DISK_ERR; //这就是在写有效引导标志 sec[510]=0x55, sec[511]=0xAA。
if (fmt == FS_FAT32)
disk_write(drv, tbl, b_part+6, 1); //FAT32在第六扇区有个备份引导扇区。
for (m = 0; m N_FATS; m++) {
mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */
if (fmt != FS_FAT32) {
n = (fmt == FS_FAT12)
文档评论(0)