首 页       用户登录  |  用户注册
设为首页
加入收藏
联系我们
按字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
按声母检索 A B C D E F G H J K L M N O P Q R S T W X Y Z 数字 符号
您的位置: 5VAR论文频道论文中心理工论文电子通信
   在Windows2000下用多线程实现1394串行总线通信      ★★★ 【字体: 】  
在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,打开发送,接收使能位等。

    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:


文章转载请注明来源于:5VAR论文频道 http://paper.5var.com。本站内容整理自互联网,如有问题或合作请Email至:support@5var.com
或联系QQ37750965
提供人:佚名
  • 上一篇文章:TCM-2通用时间比对模块及其应用

  • 下一篇文章:设计具有ARQ功能的全双工数据电台
  • 返回上一页】【打 印】【关闭窗口
    中查找“在Windows2000下用多线程实现1394串行总线通信”更多相关内容 5VAR论文频道
    中查找“在Windows2000下用多线程实现1394串行总线通信”更多相关内容 5VAR论文频道
    最新热点 最新推荐 相关新闻
  • ››嵌入式系统的通信规约管理平台设计...
  • ››一种基于七号信令的局间话单采集系...
  • ››对于变频器的制动技术分析
  • ››电子文件管理元数据宏观结构多维分...
  • ››浅论卫星电视接收机的常见故障的检...
  • ››信息时代网络用户信息检索焦虑的心...
  • ››论GIS在高校房产管理中的实际应用
  • ››关于电力通信发展战略的思考 金李莎...
  • ››2G、3G切换精细化优化分析思路探讨...
  • ››光纤自动化生产的需求与时机
  • ››在Windows2000下用多线程实现1394串...
  • ››在Windows中显示多幅彩色图像的技术...
  • ››在Windows系统中用VC++实现钩子机制...
  •   文章-网友评论:(评论内容只代表网友观点,与本站立场无关!)
    关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图
    Copyright © 2006-2033 5Var.Com. All Rights Reserved .