打印
[znFAT的实现与FAT技术]

znFAT一个小瑕疵的修正。

[复制链接]
2520|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzp3520265|  楼主 | 2013-8-22 08:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lzp3520265 于 2013-8-22 08:18 编辑

最近在调试STM32的web服务,需要从SD卡读取数据,然后发送,所以需要FAT32文件系统。
一开始自己写了一个简易的读取函数,后来发现要实现文件系统的所有功能真是一件大工程。然后有人推荐我用znFAT,写的真的很厉害。不过使用的时候发现了一个瑕疵,当然不影响使用。
版本为znFAT V10.89.
瑕疵在UINT8 znFAT_Init(void)函数中。
UINT8 znFAT_Init(void)
{
struct DBR *pdbr;

znFAT_Device_Read_Sector(MBR_SECTOR,znFAT_Buffer);
   
if(znFAT_Buffer[0]!=DBR_MARK) //检测0扇区是否为DBR扇区
{
  pInit_Args->BPB_Sector_No=Bytes2Value(((((struct MBR *)(znFAT_Buffer))->Part[0]).StartLBA),4);
}
else
{
  pInit_Args->BPB_Sector_No=0;
}
znFAT_Device_Read_Sector((pInit_Args->BPB_Sector_No),znFAT_Buffer); //读取DBR扇区,瑕疵在此。

pdbr=(struct DBR *)znFAT_Buffer;
...
}
函数首先读取SD的0扇区,然后判断是MBR还是DBR或者什么都不是。
如果是MBR则需要从MBR中提取DBR扇区地址,然后读取DBR。
如果是DBR,则再读取一次0扇区。
判断是否是DBR。
问题就在这里,如果不是MBR,则会重复读取一次0扇区。
所以可以改为
UINT8 znFAT_Init(void)
{
struct DBR *pdbr;

znFAT_Device_Read_Sector(MBR_SECTOR,znFAT_Buffer);
   
if(znFAT_Buffer[0]!=DBR_MARK) //检测0扇区是否为DBR扇区
{
  pInit_Args->BPB_Sector_No=Bytes2Value(((((struct MBR *)(znFAT_Buffer))->Part[0]).StartLBA),4);
  znFAT_Device_Read_Sector((pInit_Args->BPB_Sector_No),znFAT_Buffer); //读取DBR扇区,修正于此。
}
else
{
  pInit_Args->BPB_Sector_No=0;
}

pdbr=(struct DBR *)znFAT_Buffer;
...
}
当然,这个瑕疵称不上BUG,不影响使用,甚至对效率几乎没有影响。但是写程序总会留下一下吹毛求疵的毛病,所以还是贴出来吧。

相关帖子

沙发
旭日东起| | 2013-8-29 15:27 | 只看该作者
这也是为了安全起见的啊!!没什么的

使用特权

评论回复
板凳
JKM99| | 2015-8-19 14:29 | 只看该作者
写在外面和写在里面难道不是一样的吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

0

粉丝