来源于《Windows CE工程实践完全解析》
串口驱动程序PDD层的PostInit成员函数在COM_Init函数最后被执行,CPdd2416Uart类的继承类没有对PostInit函数重新实现。所以COM_Init函数执行的是CPdd2416Uart类的PostInit成员函数。代码如下:
void CPdd2416Uart::PostInit()
{
DWORD dwCount=0;
m_HardwareLock.Lock();
m_pReg2416Uart->Write_UCON(0); // Set to Default;
DisableInterrupt(S2416UART_INT_RXD | S2416UART_INT_TXD | S2416UART_INT_ERR);
// Mask all interrupt.
while ((GetInterruptStatus() & (S2416UART_INT_RXD | S2416UART_INT_TXD | S2416UART_INT_ERR))!=0 &&
dwCount <MAX_RETRY) { // Interrupt.
InitReceive(TRUE);
InitLine(TRUE);
ClearInterrupt(S2416UART_INT_RXD | S2416UART_INT_TXD | S2416UART_INT_ERR);
dwCount++;
}
ASSERT((GetInterruptStatus() & (S2416UART_INT_RXD | S2416UART_INT_TXD | S2416UART_INT_ERR))==0);
// IST Start to Run.
m_HardwareLock.Unlock();
CSerialPDD::PostInit();
CeSetPriority(m_dwPriority256);
#ifdef DEBUG
if ( ZONE_INIT )
m_pReg2416Uart->DumpRegister();
#endif
ThreadStart(); // Start IST.
}
来源于《Windows CE工程实践完全解析》
m_HardwareLock是从CSerialPDD类继承得来的ClockObject类型的数据成员。用来对串口的控制与状态寄存器进行临界保护。所以这两个数据成员m_HardwareLock和
m_pReg2416Uart在代码中总是同时出现,前者对后者实施临界区保护。
被PostInit成员函数调用的是InitReceive函数功能是用户按照自己的要求写串口的UART控制器UCON和FIFO控制器UFCON。并且清除错误状态寄存器UERSTAT.InitLine
函数则写行控制器ULCON,被CPdd2416Uart类的PostInit成员函数调用的CSerialPDD类的同名函数会以虚拟函数的方式调用CPdd2416Uart类的InitModem成员函数以初始化串
口的MODEM控制寄存器UMCON。但是在while循环中调用InitReceive和InitLine两个函数的目的是初始化与串口有关的中断,为IST线程的启动运行做准备。真正的设定串口
的收发工作模式的工作在CPdd2416Uart类的Open成员函数中进行。
PostInit函数最后一步也是最重要的一步是调用ThreadStrat函数启动IST线程。