四极管:串口驱动的具体开发(四)

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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值