在ZLG的SmartARM2000开发板上利用ZLG提供的uCOS2.52的模板移植了uC/FS文件系统,编译成功。文件系统可以初始化,打算在SD卡上新建一个文本文件,调试时候无法在SD卡上进行操作,程序步骤如下:<br />1. 初始化SD卡。(初始化成功,可以读出OCR等寄存器内容)<br />2. 调用FS_MMC_Init()函数.(初始化成功)<br />3.程序调用 FS_FOpen(pName, "w")函数来建立一个新文件。<br />4. 程序调用 FS_FWrite()函数来写内容。<br /><br />问题如下:<br />1. 程序执行FS_FOpen()函数,返回值出错,无法打开文件。<br /><br />出错程序语句:<br />1. 追踪到程序执行FS__fat_checkunit()调用int FS__lb_status()函数,函数FS__lb_status()返回值出错。<br />2. 追踪到FS__lb_status()函数执行出错语句是if (pDriver->dev_status)这条判断语句,条件不成立,直接return -1,导致FS__fat_checkunit()函数出错。<br /><br />调试时候采取的措施:<br />1. 由于我系统中只有一个SD卡作为存储介质,其存储介质编号索引应该是0;<br /> 我将 status = FS__lb_status(FS__pDevInfo[Idx].devdriver, Unit);<br /> 改为 status = FS__lb_status(FS__pDevInfo[1].devdriver, Unit)之后调试,发现if (pDriver->dev_status)这条判断语句通过,但是程序在这条语句之后就跑飞了。<br /><br />现在应该是uC/FS调用FS__lb_status(FS__pDevInfo[Idx].devdriver, Unit)函数时候[Idx]有可能不对造成的!<br /><br />请教各位,这种问题一般是什么地方设置错了?还是程序调用错误?<br /><br /><br /><br />函数如下:<br /><br />int FS__lb_status(const FS__device_type *pDriver, FS_u32 Unit) {<br /> int x;<br /><br /> if (pDriver->dev_status) {<br /> FS_X_OS_LockDeviceOp(pDriver, Unit);<br /> x = (pDriver->dev_status)(Unit);<br />#if FS_USE_LB_READCACHE<br /> if (x != 0) {<br /> _FS_LB_ClearCache(pDriver, Unit);<br /> }<br />#endif /* FS_USE_LB_READCACHE */<br /> FS_X_OS_UnlockDeviceOp(pDriver, Unit);<br /> return x;<br /> }<br /> return -1;<br />}<br /><br />int FS__fat_checkunit(int Idx, FS_u32 Unit) {<br /> int err;<br /> int status;<br /> int lexp;<br /> <br /> //status = FS__lb_status(FS__pDevInfo[Idx].devdriver, Unit);<br /> status = FS__lb_status(FS__pDevInfo[Idx].devdriver, Unit);// adder by Luoxiongjain<br /> if (status < 0) {<br /> return 0;<br /> }<br /> if (status == FS_LBL_MEDIACHANGED) {<br /> /* Mount new volume */<br /> err = _FS_ReadBPB(Idx, Unit);<br /> if (err < 0) {<br /> return 0;<br /> }<br /> }<br /> if (FS__FAT_aBPBUnit[Idx][Unit].Signature != 0xaa55) {<br /> err = _FS_ReadBPB(Idx, Unit);<br /> lexp = (err < 0);<br /> lexp = lexp || (FS__FAT_aBPBUnit[Idx][Unit].Signature != 0xaa55);<br /> if (lexp) {<br /> return 0;<br /> }<br /> }<br /> if (FS__FAT_aBPBUnit[Idx][Unit].NumFATs != 2) {<br /> return 0; /* Only 2 FATs are supported */<br /> }<br /> if (FS__FAT_aBPBUnit[Idx][Unit].FATSz16 == 0) {<br /> if (FS__FAT_aBPBUnit[Idx][Unit].ExtFlags & 0x0080) {<br /> return 0; /* Only mirroring at runtime supported */<br /> }<br /> }<br /> return 1;<br />}<br /><br />请教各位,这种问题一般是什么地方设置错了?还是程序调用错误? |
|