SV040iG5-2
---- 线程的基本概念可详见VC++参考书目,Windows内部的抢先调度程序在活动的线程之间分配CPU时间,Win 32
区分两种不同类型的线程,一种是用户界面线程UI(User Interface
Thread),它包含消息循环或消息泵,用于处理接收到的消息;SV040iG5-2另一种是工作线程(Work
Thread),它没有消息循环,用于执行后台任务。用于监视串口事件的线程即为工作线程。
LS 产电 代理
程先生 139 188 64473
----
多线程通信类的编写在端口的配置,连接部分与单线程通信类相同,SV040iG5-2在端口配置完毕后,Zui重要的是根据实际情况,建立多线程之间的同步对象,如信号灯,临界区,事件等,相关细节可参考VC++
中的同步类。
SV040iG5-2
---- 一切就绪后即可启动工作线程:
CWinThrea *CommThread = AfxBegin
Thread(CommWatchThread, // 线程函数名
(LPVOID) m_pTTYInfo, // 传递的参数
THREAD_PRIORITY_ABOVE_NORMAL, // 设置线程优先级
(UINT) 0, // Zui大堆栈大小
(DWORD) CREATE_SUSPENDED , // 创建标志
(LPSECURITY_ATTRIBUTES) NULL); // 安全性标志
SV040iG5-2
---- 同时,在串口事件监视线程中:
if(WaitCommEvent(pTTYInfo->idComDev,&dwEvtMask,NULL))
{
if((dwEvtMask & pTTYInfo->dwEvtMask )==
pTTYInfo->dwEvtMask)
{
WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF);
ResetEvent(pTTYInfo->hPostEvent); // 置同步事件对象为非信号态
::PostMessage(CSampleView,ID_COM1_DATA,0,0); // 发送通知消息
}
}
----
用PostMessage()向指定窗口的消息队列发送通知消息,相应地,需要在该窗口建立消息与成员函数间的映射,用ON_MESSAGE将消息与成员函数名关联。
BEGIN_MESSAGE_MAP(CSampleView, CView)
//{{AFX_MSG_MAP(CSampleView)
ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data)
ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)
.....
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
----
然后在各成员函数中完成对各串口数据的接收处理,但必须保证在下一次监测到有数据到来之前,能够完成所有的中间处理工作。否则将造成数据的捕捉错误。
----
多线程的实现可以使得各端口独立,准确地实现串行通信,使串口通信具有更广泛的灵活性与严格性,且充分利用了CPU时间。但在具体的实时监控系统中如何协调多个线程,线程之间以何种方式实现同步也是在多线程串行通信程序实现的难点。
CPU与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器接口。存储器通常在CPU的同步控制下工作,接口电路比较简单;而I/O设备品种繁多,其相应的接口电路也各不相同,因此,习惯上说到接口只是指I/O接口。
一、I/0接口的概念
1.接口的分类
I/O接口的功能是负责实现CPU通过系统总线把I/O电路和
外围设备联系在一起,按照电路和设备的复杂程度,I/O接口的硬件主要分为两大类:
1)I/O接口芯片
这些芯片大都是集成电路,通过CPU输入不同的命令和参数,并控制相关的I/O电路和简单的外设作相应的操作,常见的接口芯片如定时/计数器、中断控制器、DMA控制器、并行接口等。
2)I/O接口控制卡SV040iG5-2
有若干个集成电路按一定的逻辑组成为一个部件,或者直接与CPU同在主板上,或是一个插件插在系统总线插槽上。
按照接口的连接对象来分,又可以将他们分为串行接口、并行接口、键盘接口和磁盘接口等。
2.接口的功能
由于计算机的外围设备品种繁多,几乎都采用了机电传动设备,因此,CPU在与I/O设备进行数据交换时存在以下问题:
速度不匹配:I/O设备的工作速度要比CPU慢许多,而且由于种类的不
同,他们之间的速度差异也很大,例如硬盘的传输速度就要比打印机快出很多。
时序不匹配:各个I/O设备都有自己的定时控制电路,以自己的速度传 输数据,无法与CPU的时序取得统一。
信息格式不匹配:不同的I/O设备存储和处理信息的格式不同,例如可以分
为串行和并行两种;也可以分为二进制格式、ACSII编码和BCD编码等。
信息类型不匹配:不同I/O设备采用的信号类型不同,有些是数字信号,而
有些是模拟信号,因此所采用的处理方式也不同。
基于以上原因,CPU与外设之间的数据交换必须通过接口来完成,通常接口有以下一些功能:
1)设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度差异,接口通常由一些寄存器或RAM芯片组成,如果芯片足够大还可以实现批量数据的传输;
2)能够进行信息格式的转换,例如串行和并行的转换;
3)能够协调CPU和外设两者在信息的类型和电平的差异,如电平转换驱动器、数/模或模/数转换器等;
4)协调时序差异;
5)地址译码和设备选择功能;
6)设置中断和DMA控制逻辑,以保证在中断和DMA允许的情况下产生中断和DMA请求信号,并在接受到中断和DMA应答之后完成中断处理和DMA传输。
3.接口的控制方式
CPU通过接口对外设进行控制的方式有以下几种:
1)程序查询方式
这种方式下,CPU通过I/O指令询问指定外设当前的状态,如果外设准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询。
这种方式的优点是结构简单,只需要少量的硬件电路即可,缺点是由于CPU的速度远远高于外设,因此通常处于等待状态,工作效率很低。
2)中断处理方式SV040iG5-2
在这种方式下,CPU不再被动等待,而是可以执行其他程序,一旦外设为数据交换准备就绪,可以向CPU提出服务请求,CPU如果响应该请求,便暂时停止当前程序的执行,转去执行与该请求对应的服务程序,完成后,再继续执行原来被中断的程序。
中断处理方式的优点是显而易见的,它不但为CPU省去了查询外设状态和等待外设就绪所花费的时间,提高了CPU的工作效率,还满足了外设的实时要求。但需要为每个I/O设备分配一个中断请求号和相应的中断服务程序,此外还需要一个中断控制器(I/O接口芯片)管理I/O设备提出的中断请求,例如设置中断屏蔽、中断请求优先级等。
此外,中断处理方式的缺点是每传送一个字符都要进行中断,启动中断控制器,还要保留和恢复现场以便能继续原程序的执行,花费的工作量很大,这样如果需要大量数据交换,系统的性能会很低。
相关产品:SV040iG5-2 , LS变频器SV040iG5-2