接下来给新建目录在当前文件夹中预定一个目录项位置。然后调用creat_chain函数在FAT表中为新建目录找到一个可用的数据簇,再调用move_window(0)同步FAT表到磁盘中。为新建目录的数据簇初始化,并且初始化第一个目录项。最后,填入新建目录的目录项初始值(目录名、属性、创建时间 、数据簇起始位置)到win[]中。然后同步...
由于SD卡读写速度比较慢而这些代码执行速度比较快。在move_window里面是有一段将SD卡里面的DBR读到内存中的执行步骤。这一个步骤是纯硬件的,因此在执行这个读操作的时候CPU早就去执行下面的语句了。 而下面的语句是什么呢?就是那几个判断。于是问题产生了。 在SD卡还没来得及把数据全都读进来的时候,我们的观察...
sect = clust2sect(fp->curr_clust) + fp->csect - 1;/* 如果文件读写指针不在扇区边界,为了读到数据,必须往前走一个扇区 */ if (!move_window(sect)) goto fr_error;/* Move sector window */ rcnt = 512U - (fp->fptr % 512U);* Get partial sector from sector window */ if (rcnt >...
5.move_window move_window专用于操作win[]系统缓冲区。move_window(B);调用前:执行中:调用后:四...
if (move_window(fs, sect) != FR_OK) /* Load boot record */ return 3; if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */ return 2; ...
{ fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ if (move_window(fs, sect) != FR_OK) /* Load boot record */ return 3; if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check boot record signature (always placed at offset 510 even if the sector size...
问题:在做豪华版fatfs实验的时候,发现从综合实验移植过来的fatfs部分,f_mkdir不能正常工作,跟踪调试发现死在move_window函数里面,如下图红线处. 只要执行过红线,就进入hard_fault了... 经验告诉我,这肯定是内存访问有问题. 于是对比成功和失败两个版本的fs,wsect,fs->fatbase,fs->fsize 他们对应值都一样!!!
实际上,move_window的作用是改变文件系统的当前工作扇区,如果要迁移到的是当前扇区,直接返回,如果不是,就将原扇区写回,若是FAT表,还要写进备份区。 熟悉了代码结构后,现在开始作修改了,首先修改ffconf.h文件配置与硬件相关的文件系统特性,然后自己添加一套底层操作即可。先看ffconf.h,里面定义了很多宏,可以根据...
然后进入check_fs函数,发现先进行move_window操作,然后判断结尾是否为0XAA55,开头的跳转指令是否是0XEB...
实际上,move_window的作用是改变文件系统的当前工作扇区,如果要迁移到的是当前扇区,直接返回,如果不是,就将原扇区写回,若是FAT表,还要写进备份区。 熟悉了代码结构后,现在开始作修改了,首先修改ffconf.h文件配置与硬件相关的文件系统特性,然后自己添加一套底层操作即可。先看ffconf.h,里面定义了很多宏,可以根据...