当我在普天工作时,有一件印象很深刻的事情.
那时我刚进去,领导就分给我一项任务,就是负责写download 工具的PS端.说实话,对于硬件驱动,我一直没多少信心,这次接到这个任务,心里也有点打鼓.因为不象桌面软件,可以用VC调试,而我也一直用VC的.
我们用的是Toshiba的平台,这个平台在PHS中算是老大吧,好象UTStar com 也是用这个平台.编译器,我忘记了它的名称.
我开始研究下载的流程,还好,流程不复杂.大致分3个阶段,{BANNED}中国第一阶段,先传一小段程序到内存中,该程序段大小固定,大概是256个字节吧,然后进入第2阶段,main program , main program中包含有flash 的驱动等,{BANNED}最佳后是第3阶段,和PC进行交互,把文件写入flash中.
没几天程序就写完了,然后下载下去,调试,可是怎么没反应啊?奇怪... 程序看了一遍又一遍,怎么也找不到问题所在.
我大脑有点发晕,一周了,还没结果,怎么办?虽然Toshiba有ICE ,可是由于程序是在内存中,没法用ICE来调试啊?
想了好久,终于想出了一个方法,把程序写到flash中,用ICE来调试.
终于发现原来是编译器的一个bug .... 由于我用了一个switch 语句,也许是case 太多了吧,居然在返回的时候pop 出错, 在入口Push 6个,而出口Pop 5个.当然程序不对了.哎,用 asm语言吧,自己来搞定,不用傻傻的compiler 了.
后来我到了Giant,记得有一次我们修改BS版本号,原来版本定义是 uint8 GiantSWV[] = "A1_AV1.0"; 当版本越来越高的时候,uint GiantSWV[] = "A1_AV1.10"; 时,出现了很奇怪的现象,有时候声音不对,奇怪啊?上一个版本还好好的,于是我们开始了{BANNED}最佳原始的方法,把这个版本和上一个版本全面比较,每一处都check,没看出什么不对啊?好象前几天还好好的呢?大家一时没了头绪,我提议,大家一点点倒退,结果终于发现就就改了版本号不行.原来版本号要是偶数的时候才可以,奇数就不行了,也许是编译器IAR有问题,还是启动文件没写好?项目匆忙,大家也没多想了...
上面的2个编译器都是嵌入式编译器,对于他们的质量和稳定性,我一直没有信心.做无绳电话,{BANNED}最佳担心的就是空间问题,RAM小,ROM也小,怎么在小的空间中塞入尽可能多的功能对一个产品关系重大.IAR编译器压缩有9级,目前用的是第3级,如果改为Z 9的话,可以压出50多K的空间,50多K啊,在我们的Apollo1中,总的大小才300多K,太诱人了,但对这块大面包,却没人敢去啃一口,怕,不知道编译器是怎么压的?会不会有问题?有什么side effect ...
说起VC,大名鼎鼎的microsoft,无人不知,它的编译器应该是{BANNED}最佳好的吧?可是{BANNED}最佳近发生的一些事情却让我对他大跌眼镜.
为了顺应潮流,我把VC 6.0升级为2003.net.前一段时间老大要我去研究mp3 decoder,特别看看VLC media player ,想在ARM 7里做一个MP3的播发器,于是在网上到处找啊找,把VLC ,libmad 还有一个不知道谁写的mp3 decoder拉下来,VLC用.net就编译不了,libmad呢,可以编译,好不容易自己写了一个测试一个程序,用cool edit一放,却发现怎么全是noise,改来改去,还是不行.而那个不知名的mp3程序却可以.怎么回事呢?难道是libmad 不好,可是很多open source都是用它做的啊?也许是环境不同?后来我转到linux下,却发现libmad 可以用,声音很好.
更气人的是,以前用VC 6.0编译好的simulator ,用2003.net编译后,发现运行异常.哎,真受不了.microsoft 软件老大啊... 还是把2003.net卸掉吧,可把我害苦了.前几天加班加点调试libmad....
过几天装上2005.net ,这次,编译器,可别让我再失望...