打印

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

[复制链接]
1656|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
swordlife|  楼主 | 2009-1-14 12:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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;
}

请教各位,这种问题一般是什么地方设置错了?还是程序调用错误?

相关帖子

沙发
swordlife|  楼主 | 2009-1-16 14:23 | 只看该作者

原因已经找到

求助帖子所示问题已经解决。原因是我SD卡驱动程序中,有一个函数调用中,对传递的一个参数进行了错误处理。现在可以读取到SD卡中的FAT表,可以在SD卡里面建立新的文件和文件夹。

发现新问题如下:(在修改错误后,可以对SD卡操作的程序上测试)
1.对某些卡可以初始化,可以建立新的文件和文件夹!但是对某些SD卡不能读取FAT表,不能新建文件等操作。
2.不能读取FAT表的SD卡,在其他机器上用SDIO接口可以识别,可以对其进行文件拷贝操作!
3. 不能读取FAT表的SD卡,使用市面上的“SD读卡器”通过USB接口和PC机进行连接,PC机不能检测到SD卡。(PC机上有“新插入卷”的盘符,但是点击时候,弹出“请插入磁盘”之类提示)

我的问题:
1. 对于此类SD卡,发生以上现象的原因是什么呢?
2. 是否有些SD卡类型不同,FAT表的读取指令不同呢?在驱动程序中,有什么改进方法吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

51

帖子

0

粉丝