串口--=中断机制分析

来源:互联网 发布:主流社交软件 编辑:程序博客网 时间:2024/06/16 00:49

一般的中断处理机制是:从物理中断号,申请系统中断号,然后把系统终端号和一个事件绑定,然后在线程中等待中断发生,

串口也是同样的:

以下3个步骤都在CreateSerialObject函数或该函数调用的函数中实现的

1:得到系统中断号

// //在 CPdd2440Uart::Init()中有如下代码GetIsrInfo(&ddi);//直接从注册表查询系统中断号,

m_dwSysIntr = ddi.dwSysintr;

//,该函数在CreateSerialObject中被调用

//:pSerialPDD->Init(),pSerialPDD是一个指向CPdd2440Serial0实例的指针,CPdd2440Serial0的init函数是虚函数,

//他会调用父类的init函数return CPdd2440Uart::Init();

2:绑定中断和事件

 //在 CPdd2440Uart::Init()中有如下代码:

 m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);//创建事件,

 InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0);//绑定事件和系统中断号,

3:线程中等待事件发生

//启动线程过程如下:

在com_init函数中会调用SerInit,该函数又会调用CreateSerialObject会new CPdd2440Serial1(lpActivePath,pMdd, pHwObj);然后返回一个CSerialPDD类指针(实际上是CSerialPDD的子类),

在这个过程中构造函数会创建一个线程然后运行他:ThreadRun()/

//串口类CPdd2440Uart实现了CMiniThread线程类的虚函数ThreadRun()//当构造CMiniThread类的时候 ,CMiniThread就会创建一个线程,线程运行下面这个函数,

//这个函数不断的检测中断事件,然后处理中断事件

DWORD CPdd2440Uart::ThreadRun()
{
    while ( m_hISTEvent!=NULL && !IsTerminated()) {
        if (WaitForSingleObject( m_hISTEvent,m_dwISTTimeout)==WAIT_OBJECT_0) {

 

类继承关系:

class CSerialPDD : public CRegistryEdit

class CPdd2440Uart: public CSerialPDD, public CMiniThread  {

class CPdd2440Serial0 : public CPdd2440Uart

函数调用关系:

COM_init()  ->SerInit()-> CreateSerialObject()  ->pSerialPDD=new CPdd2440Serial0()  和pSerialPDD->Init(),