首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

6410 wince debug.c 调试串口的疑义

2013-04-21 
6410 wince debug.c 调试串口的疑问+++++++++现象:SMDK6410.bat(57):里如果把全部debug串口都屏蔽掉@REM s

6410 wince debug.c 调试串口的疑问
+++++++++现象:SMDK6410.bat(57):里如果把全部debug串口都屏蔽掉
@REM set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART1
@REM set BSP_DEBUGPORT=SERIAL_UART2
@REM set BSP_DEBUGPORT=SERIAL_UART3

wince可以正常使用,4个串口可以当做普通串口正常使用。

++++++++++不明白为何是这样:
1、oalib\source里有如下定义,看起来是BSP_DEBUGPORT如果为定义,相应的DEBUG_PORT也就为定义,所有文件里搜索也未发现对该宏的其他定义。

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART0"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=0
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART1"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=1
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART2"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=2
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART3"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=3
!ENDIF

2、debug.c里,如果DEBUG_PORT未定义,应该是编译时出现INVALID_DEBUG_PORT未定义的错误,但是编译通过,且可以正常运行。 
++++++++++疑问1:为何编译时不出现INVALID_DEBUG_PORT未定义的错误
++++++++++疑问2:即使不出现1的错误,那么由于DEBUG_PORT未定义,那么g_pUARTReg的值未修改,仍旧是NULL,为何g_pUARTReg->ULCON等访问不挂掉?
static volatile S3C6410_UART_REG *g_pUARTReg = NULL;
VOID OEMInitDebugSerial()
{
    UINT32 logMask;
    UINT32 DivSlot;
    float Div;

    //OALMSG(TRUE, (TEXT("[OAL] ++OEMInitDebugSerial()\n\r")));

    // At this moment we must suppress logging.
    //
    logMask = dpCurSettings.ulZoneMask;
    dpCurSettings.ulZoneMask = 0;

    // Map SFR Address
    //
    if (g_pUARTReg == NULL)
    {
#if    (DEBUG_PORT == DEBUG_UART0)
        // UART0
        g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART0, FALSE);
#elif (DEBUG_PORT == DEBUG_UART1)
        // UART1
        g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART1, FALSE);
#elif (DEBUG_PORT == DEBUG_UART2)
        // UART2
        g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART2, FALSE);
#elif (DEBUG_PORT == DEBUG_UART3)
        // UART3
        g_pUARTReg = (S3C6410_UART_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_UART3, FALSE);
#else
        INVALID_DEBUG_PORT        // Error
#endif
    }

    if (g_pGPIOReg == NULL)
    {
        g_pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
    }

    if (g_pSysConReg == NULL)
    {
        g_pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
    }
//省略一部分代码
    // Initialize UART
    //


    g_pUARTReg->ULCON = (0<<6)|(0<<3)|(0<<2)|(3<<0);                    // Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data
    g_pUARTReg->UCON = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);    // PCLK divide, Polling Mode


}

3、下面两个函数使用g_pUARTReg前有没有必要进行空指针保护,比如是空指针返回?
++++++++++疑问3:是否需要空指针保护
VOID OEMWriteDebugByte(UINT8 ch)
{
    // Wait for TX Buffer Empty
    //
    while (!(g_pUARTReg->UTRSTAT & 0x2));

    // TX Character
    //
    g_pUARTReg->UTXH = ch;
}
int OEMReadDebugByte()
{
    int ch;

    if (g_pUARTReg->UTRSTAT & 0x1)        // There is received data
    {
        ch = (int)(g_pUARTReg->URXH);
    }
    else        // There no data in RX Buffer;
    {
        ch = OEM_DEBUG_READ_NODATA;
    }

    return ch;
}

4、一旦set BSP_DEBUGPORT=SERIAL_UART0,且注册表里强制开放关于uart0的注册表,则wince在创建串口0时就挂掉了(显示DEBUG: CreateSerialObject 0后就无输出了),冲突在什么地方?
++++++++++疑问4:串口冲突在什么地方。
大致看了下代码,好像和PCLK_GATE以及SCLK_GATE有关,但不确定,请问各位大侠是怎么回事。

;IF BSP_KITL != SERIAL_UART0
;IF BSP_DEBUGPORT != SERIAL_UART0
;--------------- UART0 (Physical COM1 Port) ----------------------------------
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial0]
"DeviceArrayIndex"=dword:0
"Irq"=dword:3D; UART0 Virtual IRQ = 61 (0x3D), Physical IRQ = 37
"MemBase"=dword:7F005000
"MemLen"=dword:40
;"ISTTimeouts"=dword:200; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:1
"Dll"="smdk6410_serial.dll"
"Order"=dword:30
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"=LOC_DISPLAYNAME_COM1
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;--------------------------------------
;ENDIF
;ENDIF
ENDIF


[解决办法]
看样子应该是你的串口驱动有点问题。先检查你串口硬件问题。
[解决办法]
顶一下,同样的配置,第四个问题,串口冲突,在bat文件关掉debug口,开普通串口,系统起不来,推测是串口冲突,不理解哪里冲突了。
[解决办法]
6410的串口0做为普通串口需要修改一点代码,不然有的问题。你可以百度一下,网上有讲。
[解决办法]
DDEBUG_PORT=0
就是DEBUG_PORT=0 的意思啊。

热点排行