打印

uC/FS移植之后异常请教[求助]

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

相关帖子

沙发
armecos| | 2009-1-14 13:42 | 只看该作者

SmartARM2000上有现成的FAT12/16/32文件系统,

标准UNIX I/O接口,支持RAM/ROM/FLASH/CF/SD......
建议初学者先使用稳定系统,熟悉后再考虑自行移植。
你可以使用www.armecos.com上的免费测试程序测试硬件是否配置正确。

至于这个程序,你一步步调试就能找到问题所在了,不用问任何人,只要问计算机就可以了,要学会调试方法。
驱动啥的都有详细文档,看下面资料。

上述文档可能不完整或已被更新,想获得该资料的最新最全版本,请访问:www.armecos.com

更多内容,详见:
我的培训中心
我的研发团队
我的技术顾问
    文件系统整体解决方案咨询套餐
    IP协议栈整体解决方案咨询套餐
    USB整体解决方案咨询套餐
    BootLoader整体解决方案咨询套餐

使用特权

评论回复
板凳
swordlife|  楼主 | 2009-1-16 14:21 | 只看该作者

谢谢armecos 答复

谢谢armecos 答复!
求助帖子所示问题已经解决。原因是我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

粉丝