SmartARM2000移植uC/FS调试时候出错问题求助【求助】

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

原因已经找到

求助帖子所示问题已经解决。原因是我SD卡驱动程序中,有一个函数调用中,对传递的一个参数进行了错误处理。现在可以读取到SD卡中的FAT表,可以在SD卡里面建立新的文件和文件夹。<br /><br />发现新问题如下:(在修改错误后,可以对SD卡操作的程序上测试)<br />1.对某些卡可以初始化,可以建立新的文件和文件夹!但是对某些SD卡不能读取FAT表,不能新建文件等操作。<br />2.不能读取FAT表的SD卡,在其他机器上用SDIO接口可以识别,可以对其进行文件拷贝操作!<br />3.&nbsp;不能读取FAT表的SD卡,使用市面上的“SD读卡器”通过USB接口和PC机进行连接,PC机不能检测到SD卡。(PC机上有“新插入卷”的盘符,但是点击时候,弹出“请插入磁盘”之类提示)<br /><br />我的问题:<br />1.&nbsp;对于此类SD卡,发生以上现象的原因是什么呢?<br />2.&nbsp;是否有些SD卡类型不同,FAT表的读取指令不同呢?在驱动程序中,有什么改进方法吗?<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

51

帖子

0

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

35

主题

51

帖子

0

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