消息通信过程可以采取轮询或者中断两种方式,本文尝试对轮询法的一个缺陷做出分析。
一般轮询法的框架:
在一般小程序中采取该方法并没有任何问题,但是,在一个复杂系统中担负底层通信任务的通讯库如果设计成这种方式,则会为编程带来很多困难。
在一个复杂系统中,多线程技术会被广泛采用。显然,上面的循环遇到某个消息就处理某个消息,属于单线程的工作模式。如何使得上面的程序适合多线程处理呢?可以考虑使用信号灯。我们将上面接收数据的线程成为接收线程,使用数据的线程为工作线程。首先工作线程在信号灯上睡眠等待数据,接收线程收到数据后将数据挂入工作线程消息队列,然后唤醒工作线程。到目前为止,我们已经可以发现第一个问题
了:系统中需要维护若干信号灯和若干消息队列。这些工作必须由通信库使用者来维护。随着通信库的用户量越来越大,用户的维护开销也会越来越大。
关于第一个问题,也许还可以苟且忍受。但是,接下来的第二个问题
会让问题更加复杂。考虑这样一种场景:type1和type2两种消息具有依赖关系,而某个功能的实现需要先接收到type1消息,然后接收到type2消息。我们可以让实现次功能的工作线程依次等待两个信号灯即可。但是,如果系统中还存在第三个线程,它也需要使用type1消息呢?此时单一的信号灯已经不能解决问题了!当type1消息到达时,type1消息队列上的信号灯是唤醒原来的工作线程呢还是唤醒第三个线程?这个问题不解决,要么会丢包,要么会让代码内部逻辑混乱。那么,有补救办法吗?有!在上面的消息接收线程中进一步细分消息类型,比如,将type1细分成type1_for_thread_work, type1_for_thread_third。此时,接收线程趋向于混杂。一旦系统中类似情况很多的时候,无论是效率还是代码可维护性,都会受到极大挑战。
解决上面问题的方法有2种:
1、互斥、阻塞地收发数据包
2、采用多端口,不同的while(1){}针对不同的端口。上层应用通过使用不同的端口来避免消息混杂。
下图描述了单一端口发存在的问题,以及多端口的优势。
分享到:
相关推荐
在实践中,时间片轮询法可以通过以下步骤来实现: 1. 设计一个结构体来定义任务,包括任务的运行标记、计时器、任务函数等信息。 2. 初始化任务结构体数组,设置每个任务的初始值。 3. 设计一个任务列表,用于...
消息推送、轮询和消息通知是互联网应用中用于实时数据交互的重要技术,它们在提高用户体验、保持用户活跃度以及提供即时服务方面起着至关重要的作用。以下是对这些概念的详细阐述: **消息推送** 消息推送是指应用...
在近年来的IT领域中,轮询法作为一种基础且广泛应用的技术手段,被广泛地用在了各种系统设计和编程实践中。轮询法,简单来说,就是一种周期性检查状态变化的方法,通过不断地询问某个对象或系统,以检测是否有新的...
在MODBUS网络中,轮询是一种常见的通信方式,主站通过依次向各个从站发送请求,询问其状态或读取/写入数据。这种方式确保了每个从站都有机会响应,避免了冲突。S7-1200 PLC的MODBUS轮询库文件正是为了实现这种通信...
例如,我们可以关注MB10寄存器的值,这个值在正常轮询中应该是不断变化的。我们可以在程序中设置一个变量VB200来存储MB10的上一次值,然后比较当前MB10的值和VB200的值。如果两者相等,说明MB10的值在一定时间内没有...
3. **通信轮询**:在Modbus网络中,主站通过轮询方式依次与各个从站通信,询问并获取它们的状态或写入控制命令。轮询是一种控制策略,确保每个从站都有机会响应。 4. **主站读写**:主站负责发起通信请求,读取从站...
此压缩包“Modbus RTU 协议的多站点轮询(CP341,RS485).rar”包含了与Modbus RTU协议相关的资源,尤其是针对多站点轮询的实现,这在需要控制多个从站设备的系统中非常常见。 **Modbus RTU协议** Modbus RTU是...
本文将详细介绍如何在S7-200SMART PLC的MODBUS RTU轮询过程中实现插队写入和条件写入,这是一种优化通信效率、提高系统响应速度的重要策略。 首先,理解轮询的概念。轮询是一种通信机制,PLC按照预设顺序对多个设备...
该工程基于Ajax技术,采用客户端轮询服务器实现即时通信的简单Demo。 其中,com.gis.lp.webim.CClient作为主要的服务器端类,实现对信息的存储以及插入和读取:客户端发送的新信息通过该类的insertNews方法,将信息...
在“原生jQuery,轮询滚动消息代码”这个主题中,我们将深入探讨如何利用jQuery来实现一种常见的用户界面功能:轮询滚动消息。 首先,轮询滚动消息是一种动态显示更新信息的技术,常见于新闻网站或者实时聊天应用中...
在本文档中,我们将深入探讨如何在S7-200SMART PLC进行MODBUS通信轮询时,针对写操作进行插队处理的具体方法。 首先,我们要理解MODBUS轮询的基本概念。轮询是通信系统中的一种控制策略,PLC通过依次询问每个设备来...
MSP432P401R学习例程(包含一系列基础功能的实现,如点亮LED、按键轮询和中断、串口通信、定时器A中断和PWM等).zipMSP432P401R学习例程(包含一系列基础功能的实现,如点亮LED、按键轮询和中断、串口通信、定时器A中断和...
在每次轮询中,应包括等待响应的时间,以确保从站有足够时间处理请求。 4. 数据处理:收到从站响应后,解析MODBUS报文,提取有效数据,并将其存储到PLC的内部变量中。如果需要写入数据,根据功能码0x06的流程发送写...
在IT行业中,轮询是一种常见的通信机制,常用于客户端从服务器获取实时数据的场景。本文将深入探讨如何使用轮询的方式从服务器拉取消息,并结合`AlarmManager`和`Thread`在Android环境中实现这一功能。 轮询是...
单片机实践中的时间片轮询法是一种任务调度策略,用于在多个并发任务间分配CPU资源。这种方法简单易行,尤其适用于那些没有操作系统或者实时操作系统(RTOS)的嵌入式系统。时间片轮询法的基本思想是将CPU的执行时间...
2. 轮询时序:在轮询通信中,主站首先发送启动命令,随后接收从站返回的数据,这一过程涉及到发送作业和接收作业的完成位标记(如DONE位和NDR位)。 3. 轮询流程设计:设计初始化流程,包括CP模块的参数化、轮询...
标题 "200PLC与2个仪表自由口通讯轮询.rar" 描述的是一个关于西门子S7-200 PLC(可编程逻辑控制器)通过自由口通信协议与两个MODBUS仪表进行轮询通信的实践案例。在这个场景中,S7-200PLC扮演了主设备的角色,它周期...
在本压缩包"300PLC(博途V13)多个仪表MODBUS通讯轮询.rar"中,我们关注的是如何使用西门子的编程软件TIA博途V13来实现S7-300PLC与多个支持MODBUS协议的仪表进行通信轮询。 首先,MODBUS是一种开放的通信协议,最初由...
这种策略主要依赖于正和负轮询事件,这两种事件是通信系统中用于管理和调度数据传输的关键元素。 首先,理解“正轮询事件”和“负轮询事件”的概念。正轮询事件通常指的是系统主动地、周期性地检查某个或某些设备的...
同时,提供的使用说明文档将指导你如何配置通信参数,如波特率、奇偶校验等,并解释如何在程序中集成轮询和优先级管理代码。 在实际应用中,要注意以下几点: 1. 确保所有设备的Modbus地址和波特率设置一致。 2. ...