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