wince驱动异常调试方法(作者:wogoyixikexie@gliet)
?//-----------------------------------------------------------------------------------------------------------
// 作者:wogoyixikexie@gliet
// 版權:桂林電子科技大學一系科協wogoyixikexie@gliet
// 平臺:wince5.0 2440 5.0 BSP
// 發布日期:2009年3月23日 10:49:43
// 最后修改:2009年3月25日 10:03:40
// 注意事項:未經作者同意,不得在轉載的時候擅自修改、刪除文章的任何部分
//-----------------------------------------------------------------------------------------------------------
???
?????今天調試2440 串口驅動(把4.2BSP下的2440自帶串口和擴展串口驅動),經過一番修改,終于弄成了0錯誤和0警告,但是郁悶的是在加載驅動的過程中會出現異常,導致加載驅動失敗。加載注冊表直接和串口MDD的com_init函數相關,該函數里面調用了一些中間層以及PDD層的函數。哈哈,現在看看異常信息。
?????這個郁悶的問題終于解決了,最后用驅動調試助手+串口打印信息輕松解決。是我在GetSerialObject使用指針不當,嗚嗚,以后怎么辦?已經有兩次使用指針造成這樣的錯誤了。 使用博客園wince.he的驅動調試助手,激活卸載,相當方便。強烈推薦使用。
GetSerialObject0
GetUartSysIRQ!
INFO: Mapped UartIrq 0x1c to UartSysIntr 0x22.
Data Abort: Thread=9882f550 Proc=81d36340 'device.exe'
AKY=00000405 PC=01e24b74(ser2440.dll+0x00004b74) RA=01e24b5c(ser2440.dll+0x00004b5c) BVA=03f90d84 FSR=0000000f
RaiseException: Thread=9882f550 Proc=81d36340 'device.exe'
AKY=00000405 PC=03f8dfec(coredll.dll+0x0001dfec) RA=802135e8(NK.EXE+0x000135e8) BVA=00000001 FSR=00000001
就在GetSerialObject加了這么點代碼就OK了
// Allocate space for the HWOBJ.
? ? pSerObj=(PHWOBJ)LocalAlloc( LPTR ,sizeof(HWOBJ) );
? ? if ( !pSerObj )
? ? ? ? return (NULL);
——————————————————————————
GetSerialObject0
GetUartSysIRQ!
INFO: Mapped UartIrq 0x1c to UartSysIntr 0x23.
GetSerialObject DeviceArrayIndex=0 OK!!!!
SerInit - !!!
SerInit 1- !!!
Try to open Drivers\Active\46
SerInit - Devindex 0, IRQ 19, IOB 50000000, IOLen 2C
SerInit 3- !!!
+ Ser_InternalMapRegisterAddresses : HalTranslateBusAddress
SerInitxxx - !!!
SerInit 11111- !!!
SerInit4 - !!!
SerInit - IRQ 19 = SYSINTR 35
+SerSetOutputMode
-SerSetOutputMode
GetSerialObject1
GetUartSysIRQ!
INFO: Mapped UartIrq 0x17 to UartSysIntr 0x24.
SerInit - !!!
SerInit 1- !!!
Try to open Drivers\Active\47
SerInit - Devindex 1, IRQ 37, IOB 50004000, IOLen 2C
SerInit 3- !!!
+ Ser_InternalMapRegisterAddresses : HalTranslateBusAddress
SerInitxxx - !!!
SerInit 11111- !!!
SerInit4 - !!!
SerInit - IRQ 37 = SYSINTR 36
+SerSetOutputMode
-SerSetOutputMode
————————————————————————————————————————
?????有人說看驅動的map文件可以直接找出造成異常的函數,現在我來倒推驗證一下。
把程序復原到能產生異常的狀態。
---------uart0
GetSerialObject0
GetUartSysIRQ!
INFO: Mapped UartIrq 0x1c to UartSysIntr 0x1e.
Data Abort: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=01e24b70(ser2440.dll+0x00004b70) RA=01e24b5c(ser2440.dll+0x00004b5c) BVA=06000008 FSR=00000007
RaiseException: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=03f8dfec(coredll.dll+0x0001dfec) RA=802135e8(NK.EXE+0x000135e8) BVA=00000001 FSR=00000001
---------uart1
GetSerialObject1
GetUartSysIRQ!
INFO: Mapped UartIrq 0x17 to UartSysIntr 0x20.
Data Abort: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=01e24c1c(ser2440.dll+0x00004c1c) RA=01e24b98(ser2440.dll+0x00004b98) BVA=06000000 FSR=00000007
RaiseException: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=03f8dfec(coredll.dll+0x0001dfec) RA=802135e8(NK.EXE+0x000135e8) BVA=00000001 FSR=00000001
----------uart2
GetSerialObject2
GetUartSysIRQ!
INFO: Mapped UartIrq 0xf to UartSysIntr 0x21.
Data Abort: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=01e24c1c(ser2440.dll+0x00004c1c) RA=01e24bb8(ser2440.dll+0x00004bb8) BVA=06000000 FSR=00000007
RaiseException: Thread=98831000 Proc=81d36340 'device.exe'
AKY=00000405 PC=03f8dfec(coredll.dll+0x0001dfec) RA=802135e8(NK.EXE+0x000135e8) BVA=00000001 FSR=00000001
現在來看看ser2440.map文件,看有什么聯系
0001:00003860? ? ? GetUartSysIRQ? ? ? ? ? ? ? 10004860 f? SER2440_SER.obj
0001:00003b28? ? ? GetSerialObject? ? ? ? ? ? 10004b28 f? SER2440_SER.obj
0001:00003d84? ? ? ReadLSR? ? ? ? ? ? ? ? ? ? 10004d84 f? ser2440_hw.obj
哦,明白了,由于前面有Preferred load address is 10000000
所以10004b28-10000000=00004b28和0x00004c1c、0x00004b70最接近,各位,我的理解合理嗎?這個東西搞懂了以后就不用那么郁悶了,請大家多指教!希望后來的人走更少彎路。?
?????我的理解是正確的。我以前看過一篇老外的文章,人家也是這么做的http://wogoyixikexie.blog.163.com/blog/static/88778624200882651021866/
?????現在已經能使用應用程序打開串口,但是出現了嚴重問題:當發送完一次數據的時候很耗CPU,2440像PC機子中了毒,運行超級慢,串口應用程序無法動彈,點擊按鈕無法再響應,我推測是發送之后啟動了串口中斷,并且該中斷沒有被禁止,造成不停的發生中斷,非常郁悶。明天把MDD的代碼移植到BSP下,調試一番,我想一定可以解決。哈哈,我這么忙,還抽空寫博客,大家要頂啊。快下班了,要想想今天買什么菜來做了。哈哈,我想做個優秀的IT廚男。
?
轉載于:https://www.cnblogs.com/wogoyixikexie/archive/2009/02/18/1393330.html
總結
以上是生活随笔為你收集整理的wince驱动异常调试方法(作者:wogoyixikexie@gliet)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET学习5--N层代码示例
- 下一篇: 【转】在你的博客中添加Google地图(