用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

在Windows2000下用多线程实现1394串行总线通信

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:15:47
开发时间,所以ISA接口卡的驱动程序在WinDriver下开发。驱动程序主要完成对ISA接口卡的I/O地址读写及对硬件中断的处理。该ISA卡的I/O端口地址为:0x300~0x510;中断号为9。

    3.3.2初始化程序

    在开始通信前,首先要对串口资源、链路层寄存器及程序设置进行初始化,其中包括链路层寄存器初始化、打开驱动设备、打开硬件中断、定义临界区对像及收发缓冲区等工作。

   CCriticalSection  m_cs;    file://定义临界区对像
   bool  ISA_Init()          file://打开驱动设备
   bool  ISA_IntAEnable()    file://打开硬件使能
   List   rBuf,sBuf          file://定义收发缓冲区
void  BusInit()           file://链路层寄存器初始化

    链路层寄存器初始化是1394串行总线能正常工作的基础,下图是链路层寄存器初始化的流图。复位中断寄存器IntFlagReg,使其为零;写中断屏蔽寄存器IntMaskReg,打开中断允许使能位、发送中断位及接收中断位;写FIFO控制寄存器FifoCtrlReg,清除接收和发送FIFO,并设置接收和发送FIFO的大小;写物理层芯片访问寄存器PhyAccessReg,初始化总线复位;写控制寄存器ControlReg,打开发送,接收使能位等。

javascript:window.open(this.src);" style="cursor:pointer;"/>

    3.3.3中断处理程序

    InterruptHandle()是一个全局的中断处理函数,它一直在等待硬件中断,一旦有中断到来就立即响应。具体形式如下:

UINT InterruptHandle (LPVOID wParam)
{ while(1)
  {  ISA_WriteByte(0x502,0x01);        file://开中断
WD_IntWait(hWD,&Intrp);          file://等待中断
……                            file://判断中断类型,复位中断寄存器
if(RxDta)                        file://接收中断
{  Data   =  QuadletReadLLC(GRFStatusReg);    file://读GRF状态寄存器
WriteCount  =  (BYTE)Data & 0xff;            file://获得接收数据包的大小
  pt  = (PLISTBLOCK)malloc(sizeof(LISTBLOCK)); file://申请节点pt存放数据包
pd  = (DWORD*)malloc(WriteCount*sizeof(DWORD));
pt->pdata  = pd;
pt->next   = NULL;
     for(i=0;i<=WriteCount;i++,pd++)         file://读GRF的数据
     *pd = QuadletReadLLC(GRFReg);
     ps  = &rBuf;                          file://给链表rBuf尾插入数据节点pt
  while(ps->next!=NULL) ps=ps->next;
  ps->next   = pt;
     SendMessage(hWnd,WM_MY_MESSAGE,0,0);  file://发送接收到数据包的消息
}
    if(TxRdy)                              file://发送中断
    {   m_cs.Lock();                       file://锁定临界资源
  p  = &sBuf;
    if(p->next!=NULL)                 file://sBuf不为空
   {  pd = p->pdata;                 
     sBuf->next  =  p->next;          file://删除链表sBuf的第一个节点
  free(p);                         file://释放p                             
        QuadletWriteLLC(ATF_First,  *pd);         file://写第1个Quadlet到ATF
pd++;
  for(i=1;i<=WriteCount-2;i++,pd++)         file://第2~(WriteCount-1)个Quadlet
        QuadletWriteLLC(ATF_Continue, *pd);
     QuadletWriteLLC(ATF_ContinueUpdata, *pd); file://第WriteCount个Quadlet
}
 m_cs.Unlock();          file://解锁临界资源
    }
      return 0;
}

    3.3.4 解释处理程序

    解释处理程序实际上是用户自定义的一个消息处理函数,它一直在等待中断处理程序发来的接收到数据包的消息。如果有消息到达,就从rBuf中取出数据包进行解释。如果是自标识包,将接收到的数据放到自标识缓冲区SelfIDbuf中;如果是读请求包,从dataBuf中取出数据,并根据读请求数据包的包头构造相应的读响应包放到sBuf中;如果是写请求包,从rBuf中取出数据部分放到数据缓冲区dataBuf中等待做进一步的处理,并根据写请求数据包的包头构造相应的写响应包放到sBuf中。

    4 结束语

    本文针对实际应用中对1394串行总线通信实时性和可靠性的要求 ,采用中断的方法来接收和发送数据,并提出了在Windows2000下运用多线程技术来实现1394串行总线异步通信的方法,有效的解决了在串口通信中出现的数据丢失和不稳定问题,提高了系统的执行效率和资源的利用率,实践证明这是一种有效的途径。



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:38,968.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号