阅读:1424回复:4
请教:固件更新程序98/2k下稳定,xp下经常出错。
我受命调试一个基于VC6.0的mp3固件升级程序,据说在Win98/2K中相对稳定,但是在WinXP下经常出错。
整个流程大致如下: 开始: 测试MCU存在; 传输Boot Block; 等待MCU重启; 传输Main Block; 结束。 后经过试验、跟踪,发现问题出现的方式都大致如此: 板子上电(独立电源),接上USB传输线,打开此程序,正常传输完毕; 板上硬复位,程序重启,Boot Block正常传输完毕,Main Block传输到第n块(Boot和Main都是分块传输,每块4096B,Boot4块,Main506块,0<=n<=8)时出错; 再次板上硬复位,程序重启,Boot Block正常传输到第n块(1<=n<=2)时出错; 第三次板上硬复位,程序重启,Boot Block正常传输到第0块时出错,以后再复位结果不变。 跟踪后确认,所有Main Block中都是在CreatFile()时出错,打开的是PIPE00,最后错误代码87,查表为The parameter is incorrect ERROR_INVALID_PARAMETER。问题是前几个块都没问题,所以我觉得不应该是参数错误。 Boot Block中都是在执行WriteFileEx()方法后失去响应。 两个Block的写入方法相同,流程如下: { 读取文件到缓冲区; Decode(); GetUsbDeviceFileName(); CreatFile(); //PIPE00,ERROR EraseFlashBlock(); WriteFileEx();//ERROE } 我刚到,请前辈们多多指教。 先行谢过。 |
|
|
沙发#
发布于:2005-03-21 08:36
送20分,请指教,不胜感激。
|
|
|
板凳#
发布于:2005-03-21 14:20
配合Bus Hound跟踪程序,发现在Downloader中出问题是因为MCU没有响应(USTS 05 00 00 c0 no response,请求挂起),除非冷启动,否则一直没有响应,所以这里的问题暂时不再考虑。
而Main Block中,Bus Hound的最后显示,到上一个块的WriteFileEx方法产生的URB为止,即上一个块正常结束,本块还未有总线信息产生。我看到的CreatFile方法并不产生总线信息。 请有经验人士给与提示,谢谢。 |
|
|
地板#
发布于:2005-03-21 16:59
又消除一个可能同时打开PIPE00和PIPE01的错误。
现在只剩下某次传输时可能产生的CreatFile(\"\\\\...\\PIPE00\")错误了。在每块传输完毕后延时一段时间,可以稍微减少故障概率,但是没有质的变化。还是返回INVALID_HANDLE_VALUE,最后错误代码87。 苦恼啊。 |
|
|
地下室#
发布于:2005-03-22 15:07
呵呵,看来这个帖子要我自己终结了 :)
问题基本解决,虽然还没有找到根本原因。 其实解决方法很简单,就是在CreateFile失败时,延时重试。我延时100ms,设置最大重试次数20,实际试验时一般不超过5次。而且正常情况下一般失败都在开始的几个块,开头正常的话,后面问题就不多了。 猜测一下,既然返回无效参数的错误,应该是第一个参数,就是文件名,其他的可能性不大。估计是MCU忙,无法响应,故系统一时找不到。 依然期望知道真实答案,希望不吝赐教,依然给分 :) |
|
|