来源于《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线程。