zoukankan      html  css  js  c++  java
  • wince驱动异常调试方法(作者:wogoyixikexie@gliet)

    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厨男。

  • 相关阅读:
    挖矿是如何产生比特币的?
    影响世界的100个管理定律
    震撼人心的战争类背景音乐
    一个美国女警的工作记录(转载
    李昌镐:苍老的青春(转载)
    博主简介
    python 中判断变量是否定义
    Reading geometries
    Writing geometries
    Accessing data using cursors
  • 原文地址:https://www.cnblogs.com/gooogleman/p/1869737.html
Copyright © 2011-2022 走看看