⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ——基于usb和多线程的实时数据采集系统.htm

📁 网上收集的关于嵌入式开发的文档。拿来共享!
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            style="TEXT-INDENT: 30px">80C52将A/D采集的数据经PDIUSBD12的并行接口送入FIFO存储器。当USB的传输速率达到12Mbps时,MMU(存储器管理单元)和集成RAM作为USB之间速度差异的缓冲区,这就允许单片机以它自己的速率对USB信息包进行读写。若FIFO中数据已满,SIE会立即对数据做处理:同步模式的识别、并行/串行转换、位填充/解除填充、CRC校验/产生、PID校验/产生、地址识别和握手评估/产生。SIE实现了全部的USB协议层,完全由硬件实现而不需要固件的参与。数据经处理后由收发器通过数据线D+、D-传送到主机。对一个单片机而言,PDIUSBD12看起来就像1个带8位数据总线和1个地址位的存储器件。</P>
            <P style="TEXT-INDENT: 30px">2.2 软件结构</P>
            <P 
            style="TEXT-INDENT: 30px">USB的软件系统包括三部分:客户应用软件、设备固件以及USB设备驱动程序。其中,设备固件和USB设备驱动程序又被称为主机软件。软件层次如图4所示。</P>
            <P style="TEXT-INDENT: 30px">2.2.1 固件设备</P>
            <P 
            style="TEXT-INDENT: 30px">设备固件(firmware)是储存在程序内存中的代码。它使得USB接口芯片与主机和外设中其它电路能够通信。固件由USB驱动程序(USBD)、主控制器驱动程序(HCD)两部分组成。USBD的功能可以概括为:配置管理、总线管理、数据传输管理、提供客户服务。USBD把IRP划分为USB和设备需要大小的块,确保每一个设备能分配到它所要求的USB资源,这样它就可以支持USB设备配置。USBD提供了一个编程接口USBDI(USB驱动程序接口),给客户驱动程序一种方式,用于传输请求,传输的方向可以是来自或发往USB的功能单元。大量的客户服务是由USB的驱动程序提供的,它帮助USB的客户控制和访问它们的功能单元。HCD提供了对USB的低级支持,通过把IRP转换成为单独的事务处理后在USB上执行。<BR><IMG 
            height=378 hspace=10 src="——基于USB和多线程的实时数据采集系统.files/15c.gif" 
            width=549 vspace=10 border=0><BR></SPAN><FONT 
            size=3>&nbsp;&nbsp;&nbsp; </FONT><SPAN 
            class=main1>本系统固件设计的目标是使PDIUSBD12达到最高的传输速度。微处理器主要忙于多路数据的采集及处理,PDIUSBD12的固件设计成完全的中断驱动。USB的传输可在后台进行,这确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。它的基本思想是:后台ISR(中断服务程序)和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现。当PDIUSBD12从USB收到一个数据包时,就对单片机产生一个中断请求,单片机立即响应中断。在ISR中,固件将数据包从FDIUSBD12内部缓冲区移到循环数据缓冲区,并在随后请求清零PDIUSBD12的内部缓冲区,以使其能接收新的数据包。然后返回到主循环,检查循环缓冲区内是否有新的数据并开始其它的前台任务。</P>
            <P 
            style="TEXT-INDENT: 30px">基于这种结构,主循环不关心数据是来自USB、串口还是并口,只检查循环缓冲区内需要处理的新数据。这样,主循环程序专注于数据的处理而ISR能够以尽可能高的可能高的速度进行数据的传输。</P>
            <P style="TEXT-INDENT: 30px">这部分程序结构可包括:</P>
            <P style="TEXT-INDENT: 30px">主循环程序——发送USB请求,处理USB总线事件和用户功能处理等;</P>
            <P style="TEXT-INDENT: 30px">硬件提以层——对单片机的I/O口、数据总线等硬件接口进行操作;</P>
            <P 
            style="TEXT-INDENT: 30px">PDIUSBD12命令接口——对PDIUSBD12器件进行操作的模块子程序集;</P>
            <P 
            style="TEXT-INDENT: 30px">请求处理程序——对USB的标准设备请求进行处理和对用户添加的厂商请求进行处理;</P>
            <P 
            style="TEXT-INDENT: 30px">中断服务程序——当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志和Setup包数据缓冲区,传输给主循环。</P>
            <P style="TEXT-INDENT: 30px">2.2.2 USB设备驱动设计</P>
            <P 
            style="TEXT-INDENT: 30px">在Windows下,与USB外设的任何通信必须通过USB设备驱动,这个驱动知道如何与系统的USB驱动和访问设备的应用程序通信。设备驱动是保证应用程序访问硬件设备的软件组件,使得应用程序不必知道物理连接、信号和与一个设备通信需要的协议等的细节,可以保证应用程序代码只通过外设名字访问外设或端口目的地。应用程序不需要知道外设连接端口的物理地址,不需要精确监视和控制外设需要的交换信号。</P>
            <P 
            style="TEXT-INDENT: 30px">设备驱动通过在应用层和硬件专用代码之间的转化来完成它的任务。应用层代码一般使用一套操作系统支持的函数,硬件代码则处理那些访问外设电路的必要协议。设备驱动能与应用程序之间相互通信是通过Windows提供的API函数,这些函数使应用程序能够控制显示器、处理信息、访问存储器、读写磁盘和其它设备。对于一些标准设备,<IMG 
            height=342 hspace=1 src="——基于USB和多线程的实时数据采集系统.files/15d.gif" 
            width=319 align=right vspace=1 
            border=0>Windows提供通用驱动;不过,这个实时数据采集系统是自定义的设备,对此Windows并不提供通用的驱动,需要对设备编写自定义的驱动,并且必须遵循微软在Windows98和更新版本中为用户定义的Win32驱动模式。Windows98和Windows2000中,USB总线驱动是WDM驱动,扩展名为.sys。编写USB设备驱动需要使用Visual 
            C++,此外还需要Windows 
            98或2000设备开发包(98DDK/NTDDK)。USB设备驱动的编写通常不是一项简单的任务,驱动开发包就提供一种途径,通过做尽可能多的工作为跳过驱动开发,这些开发库有Blue 
            Water Systems的WinDK和Compuware NuMega的DriverWorks。这些工具包能够集成到Visual 
            C++编程环境中。运用这些工具包只需很少的时间就能生成一个高效的驱动程序。</P>
            <P 
            style="TEXT-INDENT: 30px">这一部分可以包括4个模块:初始化模块、即插即用管理模块、电源管理模块和I/O功能模块。初始化模块提供一个DriverEntery入口点来执行大量的初始化函数。即插用模块实现USB设备的动态插拔及配置。当硬件检测到USB设备接入时,Windows查找相应的驱动程序,并且调用它的DriverEntery例程,PnP(即插即用)管理器调用驱动程序的AddDevice例程,通知它添加了一个设备。驱动程序会收到一个包含有设备分配资源信息的启动设备的IRP,在对设备进行正确配置后,开始与硬件的对话。在运行过程中,如果设备被拔除,PnP会发出相应的IRP,驱动程序会进行盯应处理。USB设备的挂起和唤醒是由电源管理模块进行管理的。I/O功能模块完成I/O请求的工作。</P>
            <P style="TEXT-INDENT: 30px">2.2.3 应用程序设计</P>
            <P 
            style="TEXT-INDENT: 30px">固件程序和USB设备驱动程序的设计是USB设备开发者的工作,对于广大用户而言,与系统的交互是通过应用程序实现,而且整个实时采集系统的主要数据处理都是在这里完成的。因此,运行效率高、界面友好、具有强大数据分析和处理的应用程序的设计,也是系统设计上一个不容忽视的关键因素。应用程序的主要功能有:启动/关闭USB设备,检测USB设备,设置USB数据传输管道/端口,设置A/D,采集数据,显示/分析数据。这里,我们采用Visual 
            C++6.0作为程序的开发环境,并且充分运用了多线程的编程思想。</P>
            <P 
            style="TEXT-INDENT: 30px">在这个设备中,设置4个线程:首先是1个主线程,负责用户界面,并保持中枢地位。它的生存周期也就是整个用户程序的主存期,用户的动作(例如鼠标事件、键盘事件)都会触发主线程的消息机制,从而完成对用户的响应;而3个分离的辅助线程分别负责数据的采集、数据的分析处理以及数据的显示这3个不同的任务。辅助线程是在主线程运行过程中产生的,它的生命就是线程函数本身,函数一旦return,线程就结束了。因此,辅助线程的生存周期只是整个程序生存期的一部分。</P>
            <P 
            style="TEXT-INDENT: 30px">MFC程序只会有一个CwinApp对象,而CwinApp派生自CwinThread,即产生了应用程序的主线程。每当需要一个额外的线程时,应先产生一个CwinThread对象,再调用全局函数AfxBeginThread(),将线程产生出来。</P>
            <P style="TEXT-INDENT: 30px">对于辅助线程(worker 
            thread),要为它准备一个线程函数,然后调用AfxBeginThread()。例如:CWinThread* 
            pThread=AfxBeginThread(ThreadFunc,&amp;param);</P>
            <P style="TEXT-INDENT: 30px">UINT ThreadFunc(LPVOID pParam); 
            //线程函数</P>
            <P style="TEXT-INDENT: 30px">对于用户界面线程(UI 
            thread),不能够光由一个线程函数来代表,因为它要处理消息,它需要一个消息循环。应该先从CWinThread派生一个自己的类,再调用AfxBeginThread()产生一个CWinThread对象。具体程序见本刊网站(http://www.dpj.com.cn)。</P>
            <P style="TEXT-INDENT: 0px"><B>结语</B></P>
            <P 
            style="TEXT-INDENT: 30px">基于USB技术的实时数据采集系统,在编程上运用了多线程思想;从硬件和软件两方面录求较佳的解决途径,并将二者结合起来,在实际中取得了良好的运行效果。</P></SPAN>
            <P></P></DIV></TD></TR>
        <TR>
          <TD align=middle height=15>
            <TABLE cellSpacing=0 cellPadding=0 align=center border=0>
              <TBODY>
              <TR>
                <TD>
                  <DIV></DIV></TD></TR></TBODY></TABLE></TD></TR>
        <TR>
          <TD align=right height=2>
            <TABLE cellSpacing=0 cellPadding=0 width="80%" border=0>
              <TBODY>
              <TR>
                <TD width=75>【<A href="javascript:doPrint();">打印本稿</A>】</TD>
                <TD width=8></TD>
                <TD width=75>
                  <P>【<A 
                  href="http://www.21ic.com/new_info/news/review.asp?title=基于USB和多线程的实时数据采集系统target=" 
                  _blank?>发表评论</A>】</P></TD>
                <TD width=10></TD>
                <TD width=79>【<A 
                  href="http://www.21ic.com/new_info/news/sendmail.asp?num=基于USB和多线程的实时数据采集系统">推荐</A>】</TD></TR></TBODY></TABLE></TD></TR>
        <TR>
          <TD align=right height=2></TD></TR>
        <TR>
          <TD align=right height=2><A href="javascript:window.close();"><IMG 
            height=20 src="——基于USB和多线程的实时数据采集系统.files/close_c.gif" width=77 
            border=0 name=Image161></A><FONT 
        color=#ffffff>----</FONT></TD></TR></TBODY></TABLE><BR><BR>
      <TABLE cellSpacing=0 cellPadding=0 width=520 align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=bottom align=middle width=114 bgColor=#999a76 
            height=1><IMG height=1 src="——基于USB和多线程的实时数据采集系统.files/blank.gif" 
            width=1></TD>
          <TD width=466 height=1></TD></TR>
        <TR>
          <TD align=middle width=114 bgColor=#ece8db height=19>相关新闻</TD>
          <TD width=466 height=19></TD></TR>
        <TR bgColor=#999a76>
          <TD colSpan=2 height=1><IMG height=1 
            src="——基于USB和多线程的实时数据采集系统.files/blank.gif" width=1></TD></TR>
        <TR>
          <TD colSpan=2 height=1></TD></TR></TBODY></TABLE>
      <TABLE borderColor=#000000 cellSpacing=0 cellPadding=0 width=520 
      align=center border=0>
        <TBODY>
        <TR>
          <TD vAlign=top>
            <TABLE class=RelatedTable width="100%" border=0>
              <TBODY>
              <TR class=RelatedTr>
                <TD class=RelatedTd>
                  <SCRIPT language=javascript 
                  src="——基于USB和多线程的实时数据采集系统.files/about.htm"></SCRIPT>
                </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR></TD>
    <TD vAlign=top align=middle width=150 bgColor=#ece8db height=2>
      <TABLE cellSpacing=0 cellPadding=1 width="100%" border=0>
        <TBODY>
        <TR>
          <TD bgColor=#000000>
            <TABLE cellSpacing=0 cellPadding=2 width=150 bgColor=#ece8db 
            border=0>
              <TBODY>
              <TR>
                <TD>
                  <META content="Microsoft FrontPage 5.0" name=GENERATOR>
                  <META content=FrontPage.Editor.Document name=ProgId>
                  <P><A href="http://www.21ic.com/custom/tek/tek.htm"><IMG 
                  src="——基于USB和多线程的实时数据采集系统.files/tek.gif" 
              border=0></A></P></TD></TR>
              <TR>
                <TD 
  height=5></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
  <TBODY>
  <TR>
    <TD vAlign=top colSpan=6></TD></TR>
  <TR>
    <TD vAlign=top colSpan=6 height=10></TD></TR>
  <TR>
    <TD vAlign=top bgColor=#999999 colSpan=6 height=2></TD></TR>
  <TR>
    <TD class=stxt vAlign=center align=middle colSpan=6 
height=6></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
  <TBODY>
  <TR>
    <TD class=s width=973 height=12></TD></TR>
  <TR>
    <TD class=s width=973 height=20>
      <DIV align=center><FONT face="Arial, Helvetica, sans-serif"><!--start copyright-->
      <DIV align=center><FONT color=black>
      <TABLE cellSpacing=0 cellPadding=0 width=600 align=center border=0>
        <TBODY>
        <TR>
          <TD align=middle width="100%" colSpan=2><BR>Better View:800*600 Best 
            View:1024x768 为了本系统能够更好的为您服务,请使用IE4.0或以上版本浏览器 
            <BR><BR>版权所有(C)21IC中国电子网 电话:010-82357510, 82357511 传真: 010-82357512 
          </TD></TR></TBODY></TABLE><!--start copyright--></FONT></DIV></FONT></DIV></TD></TR></TBODY></TABLE><BR></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -