[znFAT的实现与FAT技术] znFAT一个小瑕疵的修正。

[复制链接]
 楼主| lzp3520265 发表于 2013-8-22 08:15 | 显示全部楼层 |阅读模式
本帖最后由 lzp3520265 于 2013-8-22 08:18 编辑

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

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

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

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

  15. pdbr=(struct DBR *)znFAT_Buffer;
  16. ...
  17. }
当然,这个瑕疵称不上BUG,不影响使用,甚至对效率几乎没有影响。但是写程序总会留下一下吹毛求疵的毛病,所以还是贴出来吧。
旭日东起 发表于 2013-8-29 15:27 | 显示全部楼层
这也是为了安全起见的啊!!没什么的
JKM99 发表于 2015-8-19 14:29 | 显示全部楼层
写在外面和写在里面难道不是一样的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

8

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部