打印

[有奖征文活动]客串贴:睬上数据类型自动转换的雷区

[复制链接]
2419|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古道热肠|  楼主 | 2009-8-24 12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题提出:
  测试MP3过程中,发现用小容量(32M)的的SD卡能正常工作,换上一个2G的SD卡,测试时发现无**常播放。哈哈,朋友开玩笑说,穷苦人家吃上一顿大鱼大肉还会消化不良的,肯定是虫子在里面作怪。

问题分析:
  根据故障现象,可以断定软件的基本流程是可行了,小容量与大容量的区别就在于某些变量的取值的不一样,于是查找软件定义的全局变量是否符合规范。打开FAT文档对照全局变量进行检查
//文件系统用全局变量
UINT32 BootSector;  /* 逻辑盘的起始绝对扇区号LBA */
UINT8 SecPerClus;  /* 逻辑盘的每簇扇区数 */
UINT8 RsvdSecCnt;  /* 逻辑盘的保留扇区数 */
UINT16 FATSz16;  /* FAT16逻辑盘的FAT表占用的扇区数 */
UINT32  FATStartSecotr;  /*FAT表起始扇区号*/
UINT32  BootDirStart; //根目录的起始扇区号
UINT32  DiskDataStart; /*存放数据的起始扇区号*/
还真找到了一个变量定义的不符合规范,立马仿真调试跟踪,发现高兴得太早,这个BUG不是致命BUG,是个良性的BUG。
  变量检查完了,开始查找功能函数,从前往后扫了一遍。发现如下函数
/* 将簇号转换为绝对LBA扇区地址 */
UINT32 mClusterToLba( UINT16 iCluster )
{
return( DiskDataStart + (( iCluster - 2 ) * SecPerClus );  /* 将簇号转换为LBA,得当前操作的起始LBA */
}
根据过去的经验,数据类型转换是个危险地带,此函数表面上看似乎能用,但是是短整型数X字节再加长整型数,最后的结果是长整形数。十有**就是在这儿碰上地雷了。

问题解决:
  采用如下写法,编译链接下载后,插2G的卡验证是否能正常使用
/* 将簇号转换为绝对LBA扇区地址 */
UINT32 mClusterToLba( UINT16 iCluster )
{
return( DiskDataStart + ((UINT32)( iCluster - 2 )) * SecPerClus );  /* 将簇号转换为LBA,得当前操作的起始LBA */
}
一切正常,哈哈,穷苦人吃鱼的确得小心,鱼刺有时不容易发现的。

小结:
此类BUG的根本原因是Keil c51开发系统中短整型数(UINT16)相乘时不会自动转换成长整型。所以要先进行类型转换,也可以在数值后面加L来指时,以前在使用AT45DB161D进行地址计算时也出过错。此次软件因为是从其它地方找来改的,所以存在BUG也是很正常的,但利用过去的经验很快就排雷成功。
所以大家在写软件时,遇到此类运算,务必提前作好强制类型转换的声明,就能避免犯错。

相关帖子

沙发
古道热肠|  楼主 | 2009-8-24 12:34 | 只看该作者
考一考大家,有谁能找出关于FAT16文件系统变量定义不规范的地方?
UINT32 BootSector; /* 逻辑盘的起始绝对扇区号LBA */

UINT8 SecPerClus; /* 逻辑盘的每簇扇区数 */
UINT8 RsvdSecCnt; /* 逻辑盘的保留扇区数 */
UINT16 FATSz16; /* FAT16逻辑盘的FAT表占用的扇区数 */
UINT32 FATStartSecotr; /*FAT表起始扇区号*/
UINT32 BootDirStart; //根目录的起始扇区号
UINT32 DiskDataStart; /*存放数据的起始扇区号*/

使用特权

评论回复
板凳
古道热肠|  楼主 | 2009-8-24 12:38 | 只看该作者
看着大家登台表演,俺也心痒痒,上来客串客串,大家珍惜良机,继续努力,力争把“匠人手机”搬回家。

使用特权

评论回复
地板
程序匠人| | 2009-8-24 12:44 | 只看该作者
哈哈,欢迎客串!

使用特权

评论回复
5
lhj200304| | 2009-8-26 17:17 | 只看该作者
1# 古道热肠
要是用pc—lint检查一下。这些问题统统能够找出来的,特别是变量没有初始化的问题,我写完程序有事没事就lint一下

使用特权

评论回复
6
古道热肠|  楼主 | 2009-8-26 17:22 | 只看该作者
哈哈,您说的那软件第一次听说,俺去找找看。

使用特权

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

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝