+++++++++现象: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
//