WinCE6.0长时间运行,系统出错并复位,请指教

tanghuihuayyc 2017-05-16 03:01:04
我用Tiny6410核心板做的系统,ARM和FPGA之间用SPI通讯。操作系统跑的WinCE6.0。

客户反映某些板在系统长时间运行的时候会崩溃导致WinCE重启。在家测试,3台设备同时开启,跑一样的程序一样的内核。其中一台接有传送带上的旋转编码器,在长时间运行的时候,接编码器的设备在运行16小时后会崩溃重启(也不是一定会,有时运行20几小时出现,有时运行2天也不出现),其他两台未接编码器的连续运行7天也没有问题。

崩溃复位前,内核发出如下信息:
Exception 'Raised Exception' (-1): Thread-Id=070a0002(pth=856b5240), Proc-Id=004
00002(pprc=830c9308) 'NK.EXE', VM-active=04f0001a(pprc=853b4000) 'LaserApp.exe'
PC=c003bc40(k.coredll.dll+0x0001bc40) RA=801174c8(kernel.dll+0x000064c8) SP=d428
f9b0, BVA=ffffffff

现在头疼的是根本无法着手查找问题。因为出问题的时间间隔太长。

大家能否给点建议或者排查方向?
...全文
430 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanghuihuayyc 2017-06-14
  • 打赏
  • 举报
回复
已解决,驱动中缓冲区溢出导致的。 结贴。
  • 打赏
  • 举报
回复
如果你操作FPGA代码没问题就好好看看SPI驱动是否有问题了
91program 2017-05-25
  • 打赏
  • 举报
回复
引用 7 楼 tanghuihuayyc 的回复:
改进测试方法。测试结果如下: 重新写一个软件,这个软件只是开一个线程,然后不停和FPGA通过SPI通讯,FPGA和WinCE都不做任何其他操作。 这样测试,2到5小时系统抛出异常后复位。 发现一个现象。我测试的4台设备中,有一台设备,不管怎么测都没有重启过。
如果能调试,将容易出问题的设备直接使用 VS2008 Debug 在线调试。 看看 VS2008 会不会报错?如果会,VS2008 会自动定位到出错的代码。当然,如果是驱动层的问题,VS2008 就无能为力了。
tanghuihuayyc 2017-05-19
  • 打赏
  • 举报
回复
改进测试方法。测试结果如下: 重新写一个软件,这个软件只是开一个线程,然后不停和FPGA通过SPI通讯,FPGA和WinCE都不做任何其他操作。 这样测试,2到5小时系统抛出异常后复位。 发现一个现象。我测试的4台设备中,有一台设备,不管怎么测都没有重启过。
tanghuihuayyc 2017-05-18
  • 打赏
  • 举报
回复
重新编译内核并用新的内核测试,经过20几小时测试,故障重现,通过MAP文件定位: Exception 'Raised Exception' (-1): Thread-Id=065b000a(pth=8803f2c0), Proc-Id=004 00002(pprc=82f19308) 'NK.EXE', VM-active=061f0002(pprc=85225048) 'LaserApp.exe' PC=c003bce8(k.coredll.dll+0x0001bce8) RA=801172c8(kernel.dll+0x000062c8) SP=d4d9 f9b0, BVA=ffffffff 是在k.coredll.dll中的CaptureDumpFileOnDevice中出错了: 0001:0001aba4 TlsGetValue 1001bba4 f k.coredll_ALL:apis.obj 0001:0001abe4 TlsSetValue 1001bbe4 f k.coredll_ALL:apis.obj 0001:0001ac28 CaptureDumpFileOnDevice 1001bc28 f k.coredll_ALL:apis.obj 0001:0001ad44 ReportFault 1001bd44 f k.coredll_ALL:apis.obj 0001:0001ad78 IsForcePixelDoubling 1001bd78 f k.coredll_ALL:apis.obj 0001:0001ae40 sndPlaySoundW 1001be40 f k.coredll_ALL:mmsnd.obj 通过RA定位上层调用是kernel.dll的PrefetchAbort或PrefetchAbortEH: 0001:000051f4 MDSwitchToUserCode 100061f4 f kern_ALL:armtrap.obj 0001:00005200 PrefetchAbortEH 10006200 f kern_ALL:armtrap.obj 0001:00005200 PrefetchAbort 10006200 f kern_ALL:armtrap.obj 0001:000053c8 CommonHandler 100063c8 f kern_ALL:armtrap.obj 0001:000053d4 SaveAndReschedule 100063d4 f kern_ALL:armtrap.obj 但是,我搜遍了整个WinCE600文件夹下所有的代码,也没有找到任何调用PrefetchAbort或PrefetchAbortEH的地方。难道是在微软未公开的代码中出错了? 另外,有谁能解释下出错信息里面的那两个pprc是什么意思吗?
  • 打赏
  • 举报
回复
如果没有办法定位到自己出问题的函数,建议缩减代码进行测试。多弄几个设备,屏蔽不同代码段,尽量缩小范围。边测试边查代码,个人经验就是你指针哪里越界了。
tanghuihuayyc 2017-05-17
  • 打赏
  • 举报
回复
感谢大家留言。 内存泄露应该是不存在的,用几种方法验证过。 我觉得奇怪的在于,一般程序崩溃,都会出现两个Exception,系统也不会重启。但现在我这个只有一个Exception并且导致系统重启。
91program 2017-05-16
  • 打赏
  • 举报
回复
另外,根据测试样机的差别,可以重点查一查与“旋转编码器”相关的功能代码。
91program 2017-05-16
  • 打赏
  • 举报
回复
LaserApp.exe 程序的错误,导致内核出错,所以从分析 LaserApp.exe 这个程序的代码开始吧。 因为串口输出的信息,只有当前 PC 的位置,并没有出错时的调用堆栈,所以较难分析。最好是能有办法获取到出错的函数调用堆栈,这样就可以定位到是 LaserApp.exe 源代码中的某个函数出错。这样分析的方向就比较明确! 当然,一般来说原因最后不外乎内存泄露、指针越界。 内存泄露,可以通过一个简单的内存使用监测程序来处理; 指针越界,就比较麻烦。
  • 打赏
  • 举报
回复
先看内存运行变化情况,确认是否内存泄漏造成。 根据错误信息感觉是你使用指针越界了。 如果能利用PC指针和MAP文件定位到大概的位置,相信对你查找BUG有很大的帮助。

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧