wince驱动异常调试方法(作者:wogoyixikexie@gliet)
?//-----------------------------------------------------------------------------------------------------------
// 作者:wogoyixikexie@gliet
// 版權(quán):桂林電子科技大學(xué)一系科協(xié)wogoyixikexie@gliet
// 平臺(tái):wince5.0 2440 5.0 BSP
// 發(fā)布日期:2009年3月23日 10:49:43
// 最后修改:2009年3月25日 10:03:40
// 注意事項(xiàng):未經(jīng)作者同意,不得在轉(zhuǎn)載的時(shí)候擅自修改、刪除文章的任何部分
//-----------------------------------------------------------------------------------------------------------
???
?????今天調(diào)試2440 串口驅(qū)動(dòng)(把4.2BSP下的2440自帶串口和擴(kuò)展串口驅(qū)動(dòng)),經(jīng)過一番修改,終于弄成了0錯(cuò)誤和0警告,但是郁悶的是在加載驅(qū)動(dòng)的過程中會(huì)出現(xiàn)異常,導(dǎo)致加載驅(qū)動(dòng)失敗。加載注冊(cè)表直接和串口MDD的com_init函數(shù)相關(guān),該函數(shù)里面調(diào)用了一些中間層以及PDD層的函數(shù)。哈哈,現(xiàn)在看看異常信息。
?????這個(gè)郁悶的問題終于解決了,最后用驅(qū)動(dòng)調(diào)試助手+串口打印信息輕松解決。是我在GetSerialObject使用指針不當(dāng),嗚嗚,以后怎么辦?已經(jīng)有兩次使用指針造成這樣的錯(cuò)誤了。 使用博客園wince.he的驅(qū)動(dòng)調(diào)試助手,激活卸載,相當(dāng)方便。強(qiáng)烈推薦使用。
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加了這么點(diǎn)代碼就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
————————————————————————————————————————
?????有人說看驅(qū)動(dòng)的map文件可以直接找出造成異常的函數(shù),現(xiàn)在我來倒推驗(yàn)證一下。
把程序復(fù)原到能產(chǎn)生異常的狀態(tài)。
---------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
現(xiàn)在來看看ser2440.map文件,看有什么聯(lián)系
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最接近,各位,我的理解合理嗎?這個(gè)東西搞懂了以后就不用那么郁悶了,請(qǐng)大家多指教!希望后來的人走更少?gòu)澛贰?
?????我的理解是正確的。我以前看過一篇老外的文章,人家也是這么做的http://wogoyixikexie.blog.163.com/blog/static/88778624200882651021866/
?????現(xiàn)在已經(jīng)能使用應(yīng)用程序打開串口,但是出現(xiàn)了嚴(yán)重問題:當(dāng)發(fā)送完一次數(shù)據(jù)的時(shí)候很耗CPU,2440像PC機(jī)子中了毒,運(yùn)行超級(jí)慢,串口應(yīng)用程序無法動(dòng)彈,點(diǎn)擊按鈕無法再響應(yīng),我推測(cè)是發(fā)送之后啟動(dòng)了串口中斷,并且該中斷沒有被禁止,造成不停的發(fā)生中斷,非常郁悶。明天把MDD的代碼移植到BSP下,調(diào)試一番,我想一定可以解決。哈哈,我這么忙,還抽空寫博客,大家要頂啊。快下班了,要想想今天買什么菜來做了。哈哈,我想做個(gè)優(yōu)秀的IT廚男。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wogoyixikexie/archive/2009/02/18/1393330.html
總結(jié)
以上是生活随笔為你收集整理的wince驱动异常调试方法(作者:wogoyixikexie@gliet)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET学习5--N层代码示例
- 下一篇: 【转】在你的博客中添加Google地图(