本帖最后由 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,不影响使用,甚至对效率几乎没有影响。但是写程序总会留下一下吹毛求疵的毛病,所以还是贴出来吧。 |