一种嵌入式双机同步方法
技术领域
本发明涉及一种嵌入式双机同步方法。
背景技术
网络的出现,极大的改变了人们的生活方式,从工作、学习到休闲娱乐,处处都可以见到网络的身影。从早期的低速有线网络,到现今的高速无线网络,网络应用的普及度越来越高,人们对网络应用的依赖程度同样也变得越来越高。我们经常使用的办公用的NetMeeting,网络管理用的Symantec pcAnywhere,休闲娱乐用的WinKawaks等等都是很好的代表。
这些优秀的应用软件均是基于C/S(客户端/服务器)架构和TCP/IP(传输控制协议/互联网协议)实现的。在这种模式下,应用程序虽然可以利用系统提供的各种网络接口,但是监听、建立连接、传输数据、数据同步和数据纠错等的工作都必须由应用软件自身来处理。这就使得基于这种模式开发的应用程序存在以下几点不足:
1)各种应用实现的网络功能不具备通用性。因为各种应用程序按照自己的需求来实现各自私有的网络协议,所以各种应用程序之间是无法利用其它应用的现有成果的,只能自己再开发一套。
2)开发周期长。由于第一点所述的不足,直接导致了大量的重复工作。每开发一个新的应用,开发人员均需要实现一套可行的网络传输方案,增加了开发周期和开发成本。
3)跨平台性差。因为没有统一的系统平台,以及各个平台之间的差异,开发人员往往需要做部分的移植工作,才能使应用程序在相应的平台上正常运行。
4)数据传输量较大。以Symantec pcAnywhere为例,其传输的数据是打包后的屏幕数据,而非用户的操作命令。类似的应用将无法在带宽和处理能力都很有限的嵌入式设备上正常运行。
5)对TCP/IP网络依赖度高。上面所述的各种网络应用都依赖于TCP/IP网络,而嵌入式设备往往没有固定的网络连接,当两个设备需要进行连接的时候,也许一条USB线就足够了,所以底层协议无关性对嵌入式设备来说更有意义。
发明内容
本发明的目的是提供一种无需修改应用程序,且不受具体网络传输方式影响的嵌入式双机同步方法,该方法具有通用性,可以方便地扩展到其他应用平台。
本发明的目的可以采用以下方案实现,一种嵌入式双机同步方法,
对于主机,系统根据定时器所控制的时间分片来决定应用程序何时获得系统运行时间;当应用程序获得运行权的时候,会从按键信息队列中获取相应的按键信息,根据当前的运行状态以及按键信息,整理成帧数据,并保存在主机队列缓冲区中,准备发送;同时将已经获得的按键信息传递给应用程序,并执行;
对于从机,应用始终处于一种循环等待的状态,等到来自主机的同步信号后,才开始执行真正的处理;当从机获得同步信号后,将在从机队列缓冲区中获取按键信息,将其传递给从机的应用程序,并执行;然后继续等待下一个同步信号;从机接收帧数据的部分为中断触发式,当有网络数据到达时,该函数将被触发;如果接收到的数据正确,则将其处理后保存在从机队列缓冲区中。
本发明当双向同步时,主机端的接收部分由中断触发,当有网络数据到达的时候,会自动调用相关的函数来接收按键信息,并将其保存在按键信息队列中,供以后调用;
本发明当单向同步时,主机端不需要设置接受远程的中断处理。
本发明中从机的按键信息发送部分由一个定时器控制,定时的将从机的按键信息发送给主机。
为了保证双机同步数据的准确性,本发明同步过程的传输的数据中,每帧数据都会有一个唯一的帧编号,从机通过检查连续接收到的两个帧编号是否连续来判断;若两个连续收到的帧编号不是连续的,即判断出现掉包,并要求主机重发相应数据包。
本发明从机除了检查是否出现掉包外,还会检查数据包中是否包含错误数据,若包含了错误数据,则要求主机重发相应数据包。
本发明若主机的发送队列中存在从机所请求的数据,则直接发送相应的数据包给从机,而无需中断当前的程序处理,而当从机请求的数据在主机上已经不存在的时候,则需要暂停主机程序的运行,并将现有的状态传送给从机,进行重新同步。
本发明如果从机正常接收,并且校验正确,则不会返回任何信息,亦即没有确认帧,这样做主要是为了节约带宽。
本发明相对现有技术的优点在于:
1)由于所有的修改均在系统层实现,所以无需修改应用,即可实现双机同步,大大减少了应用程序的开发周期和应用程序复杂度。同时可以为没有网络同步功能的应用增加双向同步或单向同步的功能;
2)网络无关性,由于同步机制实现在系统层,所以对于应用程序来讲,并不需要过多的关心该使用什么样的传输协议,也无需关心具体的同步,就好像使用本地应用一样。而系统层则可以选择任何适合的数据传输方式,如:TCP/IP、串口、并口、USB、红外等;
3)数据传输量小,因为传输的仅仅是同步信息,并不需要传输类似全屏图片一样的数据,所以可以大大的降低对网络带宽的要求。即便是在苛刻的网络条件下,也能有较好的执行效果。
4)可移植性和可复用性强,使用本发明可以对现有的任何系统在简单修改下,实现双机同步的功能。
附图说明
图1是本发明的单机系统应用模型;
图2是本发明的同步双机系统应用模型;
图3是本发明的单机系统应用流程图;
图4是本发明的双机系统应用流程图;
图5是本发明的双机双向同步流程图;
图6是本发明的FCSIM的应用实例流程图;
图7是本发明的双机单向同步流程图;
图8是本发明的DEMO的应用实例流程图;
具体实施方式
如图1、2所示,应用系统为整个系统环境,用于实现各个程序之间的调度,以及时间分片。应用程序本身相对独立,每个应用程序从输入设备中获得数据,处理后输出数据,比如刷新到LCD或写入文件等。
为了实现双机同步,需要修改系统中对于每个应用程序的时间分片,以使其能够在双机间保持同步。此外,还要将两台设备之间输入的信息互相传递,所以也需要修改输入设备部分的代码。由于系统平台提供给每个应用程序的输入接口和输出接口是一致的,所以对底层代码的修改,对应用程序来说,是完全透明的。
要实现双机同步,只需要修改应用系统层对于应用程序的时间控制,同时对原来的输入函数进行封装,即可实现。
如图3、4所示,单机系统与双机系统的主要区别就在于时间分片的控制(同步信息的控制),和对底层部分键盘输入的简单修改。
单机系统调用时,其系统的C代码框架大致如下:
while(TRUE)
{
//System Pre-Process
system_preproc();
//User program
user_program();
//System Post-Process
system_postproc();
}
while循环不停地执行,进行系统的前处理和后处理,在此中间调用用户程序。
假设应用程序调用的输入接口函数名为getInput,则一个双机同步系统的C代码框架大致如下:
while(TRUE)
{
//System Pre-Process
system_preproc();
//Sync
system_sync();
if(bSync)
{
//User program
user_program();
}
//System Post-Process
system_postproc();
}
输入函数的C代码大致如下:
getInputEx()
{
//Get local input
getInput();
//Get remote input
getRemoteInput();
}
上面第一段代码与单机系统的区别在于多了一个同步处理的过程,bSync是一个标志位,表示是否已经同步。当其值为真的时候,则表示双机已经同步成功,则执行相应的时间分片,实现双机同步。第二段代码则描述了对于按键响应的改变,新的getInputEx将可以获得从远程网络发送过来的按键信息和本地得到的按键信息,再根据主机和从机的区别,映射不同的按键。只需要在系统层将所有的getInput替换为getInputEx,即可实现无缝替换。
但要真正实现双机同步,仅仅依靠以上的修改点还是不够的,还需要在真正执行双机应用程序之前,建立好网络连接。至于网络连接,则可以利用任何现有网络来实现,比如TCP/IP、串口、并口等等。
至于网络传输协议,各个设备可以根据自身的情况来选择,没有强制性要求,但是联机的两个设备必须支持同一种协议,并且在传输速率上保持一致。在系统层上实现一个硬件抽象层,则可以更好的兼顾可移植性。
具体的步骤包括:
1)在主机上创建监听服务,等待其他设备接入;
2)从机通过设备可支持的网络,如TCP/IP、串口、并口连接到主机;
3)双机连接后,由系统控制开始同步执行相同的程序;
4)执行同步数据的工作;
5)处理程序本身的应用逻辑;
6)输出处理结果;
7)检查是否结束程序;
8)若步骤7中返回的结果为否,则返回步骤4;
9)若步骤7中返回的结果为是,则退出程序,系统接管;
10)断开相应的网络连接。
其中上述步骤4的同步过程包括:
1)发送并接收远程主机或客户端的数据;
2)检测数据是否正确;
3)若步骤2中返回的值为否,则返回步骤1;
4)若步骤2中返回的值为是,继续处理同步流程;
5)检查是否获得正确的同步信息;
6)若步骤5中返回的值为否,则返回步骤1;
7)若步骤5中返回的值为是,则程序处理本身的逻辑应用,完成同步。
实施例1:
FCSIM的同步应用,如图5、6所示,对于主机,系统根据定时器所控制的时间分片来决定FCSIM何时获得系统运行时间。当FCSIM获得运行权的时候,会从按键信息队列中获取相应的按键信息。根据当前的运行状态以及按键信息,整理成帧数据,并保存在主机队列缓冲区中,准备发送。同时将已经获得的按键信息传递给FCSIM应用程序,并执行。主机端的接收部分主要由中断触发,当有网络数据到达的时候,会自动调用相关的函数来接收按键信息,并将其保存在按键信息队列中,供以后调用。
对于从机,应用始终处于一种循环等待的状态,等到来自主机的同步信号后,才开始执行真正的处理。当从机获得同步信号后,将在从机队列缓冲区中获取按键信息,将其传递给从机的FCSIM应用,并执行。然后继续等待下一个同步信号。从机接收帧数据的部分与主机类似,也是中断触发式的,当有网络数据到达时,该函数将被触发。如果接收到的数据正确,则将其处理后保存在从机队列缓冲区中,如果数据错误则通知主机进行数据重传。从机的按键信息发送部分由一个定时器控制,定时的将从机的按键信息发送给主机。
为了保证双机同步数据的准确性,同步过程的传输的数据中,每帧数据都会有一个唯一的帧编号,从机通过检查连续接收到的两个帧编号是否连续来判断;若两个连续收到的帧编号不是连续的,即判断出现掉包,并要求主机重发相应数据包。从机除了检查是否出现掉包外,还会检查数据包中是否包含错误数据,若包含了错误数据,则要求主机重发相应数据包。
若主机的发送队列中存在从机所请求的数据,则直接发送相应的数据包给从机,而无需中断当前的程序处理,而当从机请求的数据在主机上已经不存在的时候,则需要暂停主机程序的运行,并将现有的状态传送给从机,进行重新同步。
如果从机正常接收,并且校验正确,则不会返回任何信息,亦即没有确认帧,这样做主要是为了节约带宽。
实施例2:
DEMO应用,如图7,8所示。对于主机,系统根据定时器所控制的时间分片来决定DEMO何时获得系统运行时间。当DEMO获得运行权的时候,会从按键信息队列中获取相应的按键信息。根据当前的运行状态以及按键信息,整理成帧数据,并保存在主机队列缓冲区中,准备发送。同时将已经获得的按键信息传递给DEMO应用程序,并执行。因为是单向同步,所以主机端不需要设置接受远程的中断处理。
对于从机,应用始终处于一种循环等待的状态,等到来自主机的同步信号后,才开始执行真正的处理。当从机获得同步信号后,将在从机队列缓冲区中获取按键信息,将其传递给从机的DEMO应用,并执行。然后继续等待下一个同步信号。从机接收帧数据的部分为中断触发式,当有网络数据到达时,该函数将被触发。如果接收到的数据正确,则将其处理后保存在从机队列缓冲区中,如果数据错误则通知主机进行数据重传。
上述两种实例的应用方向:
1)双向同步:主要应用在交互性较强的情况。比如聊天室应用,手机游戏对战等情况;
2)单向同步:主要用于演示性质的情况。比如远程协助,远程教学,远程演示等。