当前位置:首页 期刊杂志

基于串口的心跳监听设计及其在QNX中的实现

时间:2024-07-28

李煦侃

(1.中国自动化学会发电自动化专业委员会,北京 100000;2.浙江浙能兴源节能科技有限公司,浙江 杭州 310013)

0 引言

随着信息化技术的不断发展和普及,许多核心业务系统构建在信息系统上,对信息系统的安全及稳定性提出了更高的要求。这些业务系统包括一系列互相联络的应用,催生了大量的应用间相互交流的技术需求。许多应用需要通过发送消息,将目前状态或需要完成的工作告知另一个应用。

应用间互相发送消息的方式有许多种,一般可以分为两大类别:采用时间同步方式发送消息的称为同步消息传递方式,采用时间不同步方式发送消息的称为异步消息传递方式[1]。其中,同步消息传递方式要求收发双方的运行步调严格匹配,一般情况下较难达到。因此,异步消息传递方式的应用范围更为广泛[2]。

心跳监听是一种非常重要的异步消息传递方式,是在实现高可用性和高可靠性的同时,保证系统应用正常运行和服务不中断的关键技术[3]。为及时掌握应用的实时运行状态、及时发现偶发异常情况、在发生故障时及时处理,心跳监听技术在消除局部故障、提高全系统可靠性上发挥越来越重要的作用。因此,研究如何实现心跳监听具有非常重要的意义。

QNX操作系统是一种十分重要的分布式实时操作系统。本文主要基于该系统进行研究。

1 心跳监听和串口

1.1 心跳监听

心跳监听,通常指的是在任意两个有联系的系统(互相称为主系统和备用系统)之间,相互按照约定的时间间隔发送心跳信号,通过能否收到心跳信号、收到心跳信号情况,判断对方系统健康状况。在主备系统环境中,当处于备用角色的系统接收到心跳信号并核对正确,表示处于主角色的系统运行正常;当处于备用角色的系统连续若干次(可根据需求自定义)未收到心跳信号,或者收到的心跳信号错误,则备用系统判断主系统异常,并切换为主系统,避免失效的主系统所执行的任务中断,以提高整体系统的可靠性[4]。

为研究并实现心跳监听的功能,考虑到系统的通用性,可通过串口等标准通信接口来传递心跳信号。此外,还可以在传递心跳信号的同时传递其他相关信息,既提高了硬件使用的效率,又降低了心跳监听技术的实现成本。

1.2 串口

串口即串行通信接口,一般包括RS-232-C、RS-422、RS-485、USB等。不同的电气标准,所采用的通信协议也有所区别。其中RS-232-C标准提出时间较早,应用较为广泛,是目前常用的一种串行通信接口。其全名为“数据终端设备(data terminal eqipment,DTE)和数据通信设备(data communication eqipment,DCE)之间串行二进制数据交换接口技术标准”[5],又称标准串口。RS-232-C接口标准初期一般使用22线制,采用25芯D型插头座;后进行了简化,可使用3线制(包括TX、RX、COM),采用9芯D型插座,使用较为简便。

本文以RS-232-C接口为应用间通信接口,在此基础上介绍心跳监听的设计方法,并给出其在QNX操作系统中的实现实例。

2 心跳监听的原理

一般来说,可在主系统和备用系统或任意两个有联系的系统的应用之间,通过串口,对独立心跳信号的周期性收发及处理,实现基本的心跳监听。因此,心跳监听的实现过程主要包括心跳信号发送、心跳信号接收与处理两部分。负责心跳信号发送的为发送方,负责心跳信号接收与处理的为接收方。为实现心跳监听的功能,一般发送方同时也是接收方。

2.1 心跳信号发送

心跳信号的发送由发送方完成。发送方如何发送心跳信号,需要根据整体系统的需求进行设计,主要包括心跳消息、心跳周期、异常处理等。

心跳消息是系统约定的文本、数字或其他可为系统识别的数据类型。根据需要,也可定义多组心跳消息,以实现不同的功能。

心跳周期又称心跳频率,用于控制心跳信号的发送频率,需要根据系统所执行的工作和系统处理速度确定。若系统所执行的工作时间要求高,则心跳频率要提高;若系统处理速度相对较慢,则心跳频率要相应降低,不得影响系统正常运行。心跳频率可采用定时器控制[6]。

异常处理即心跳信号发送错误时的处理措施,可按照系统需求定义。

2.2 心跳信号接收与处理

心跳信号的接收与处理由接收方完成。接收方如何发送心跳信号,同样需要根据整体系统的需求进行设计,主要包括心跳消息、心跳周期、异常处理等。

接收方的心跳消息、心跳周期需要和发送方一致。

异常处理是指在接收不到心跳信号、接收到异常心跳信号或接收到特定心跳信号时的处理措施。一般在接收不到心跳信号或接收到异常心跳信号时,可按照对方系统故障处理;在接收到特定心跳信号时,可按照约定方式处理,以实现系统特殊功能。在接收心跳信息时,应设置心跳状态,并记录有关数据。

3 QNX操作系统及串口通信的实现

3.1 QNX操作系统简介

QNX操作系统是使用十分广泛的实时操作系统(real-time operation system,RTOS)[7],已有39年的历史。QNX是一个微内核实时平台,可使用QNX Momentics对目标系统在Windows等平台下进行图形可视化开发,广泛应用于X86、PowerPC、MIPS等众多硬件环境。遵循POSIX基本标准,不论是从其他平台移植到QNX平台、在不同硬件环境的QNX平台之间移植,还是从QNX平台移植到其他平台,都十分方便[8],且性能强大、具有良好的实时性。

操作系统的实时性,是指确保时钟信号能够准确地定时,各处的时钟能够达到一致,QNX操作系统在不同的场合可达到微秒级。QNX操作系统基于优先级抢占式调度策略[9],区别于Windows等分时操作系统采用的时间片管理方式。QNX操作系统中高优先级的任务一旦就绪,即可立即占用CPU资源。同优先级的任务按照时间片方式管理(时间片可自定义),可在限定时间内对外来事件作出反应。

3.2 基于QNX的串口通信构建

QNX操作系统在实现串口通信时,与Windows等分时操作系统不同。QNX操作系统在启动时,需要加载一个包含操作系统、可执行程序以及任何与有关数据的文件[10]在内的系统映像文件。QNX的系统映像文件需要通过编写包括启动脚本、启动引导脚本和文件列表三个部分的Build file文本后,由内置的mkifs工具编译生成。通过加载系统映像文件,QNX操作系统用启动脚本中的参数注册硬件资源、配置硬件参数[11],QNX的串口就在此时进行配置。

3.3 QNX串口通信的特点及实现方法

QNX对硬件的访问非常简便。对用户而言,对硬件的操作即对文件的操作。硬件文件存储在QNX操作系统的“/dev”目录。QNX通过对硬件资源的虚拟,极大地方便了用户,简化了应用开发。QNX对设备文件的访问可通过内置标准化函数实现。

串口通信要求双方的速度、消息格式一致,速度参数主要是波特率,消息格式主要包括数据位、停止位及校验位等。在QNX操作系统中,这些参数包含在“termios.h”头文件中,可通过位运算(置位、清零等)设置这些参数。

QNX通过对串口文件的访问实现对串口的操作,串口文件命名规则为“ser+编号”,例如“/dev/ser0”。操作串口0的函数及示例如下。

①打开串口0。

int fd=open (“/dev/ser0”,O_RDWR);

②设置串口。

//设置串口波特率

speed_t ispeed=19800;

speed_t ospeed=19800;

cfsetispeed (&termios_p,ispeed);

cfsetospeed (&termios_p,ospeed);

//设置串口变量参数

Termios_p·c_iflag&= (IXOFF|IXON);

Termios_p·c_oflag&= (OPOST);

Termios_p·c_lflag&=(ECHONL|ICANON|IEXTEN);

③接收数据。

intsizeofReadbyte=read (fd,buffer,sizeof (buffer));

④发送数据。

int sizeofWritebyte=write (fd,buffer,sizeof (buffer));

⑤关闭串口。

close (fd);

QNX操作系统的串口通信流程如图1所示。

图1 串口通信流程图Fig.1 Serial communication flowchart

4 QNX操作系统的心跳监听实现

4.1 心跳监听模块

在基于QNX操作系统串口通信的心跳监听系统中,包含心跳发送模块、心跳接收与处理模块。两个模块协同工作,组成一个有机的整体。

4.1.1 心跳发送模块

心跳发送模块按照心跳频率持续向串口写预定义的心跳消息。在发送数据的同时,必须保证每次发送成功,并做好异常处理,记录日志。相应地,发送异常时需要具备一定的故障诊断能力。

心跳发送模块工作流程如图2所示。

图2 心跳发送模块工作流程图Fig.2 Working flowchart of heartbeat sending module

4.1.2 心跳接收与处理模块

心跳接收与处理模块持续尝试接收数据,一旦接收到数据,就和预定义的数据比较。若结果一致,就判定接收到心跳信号;若超过规定的时间未接收到任何数据,则执行一个预定的任务,比如将备站切为主站。

同样地,心跳接收与处理模块需要具备一定的故障诊断能力,及时做好异常处理,记录日志。

心跳接收与处理模块工作流程如图3所示。

图3 心跳接收与处理模块工作流程图Fig.3 Working flowchart of heartbeat receiving and processing module

4.2 心跳协调定时器

在QNX操作系统串口通信的心跳监听系统中,心跳信息的发送、接收与处理都需要定时器来协调[12],可采用QNX操作系统提供的定时器实现。以下给出一个实例。

main()

{

……

event.sigev_code = MY_PULSE_CODE;

timer_settime(timer_id,0,&itime,NULL);

//每隔3.5 s收到一个脉冲(itime.it_value)

//每隔3.5 s收到另一个脉冲(itime.it_interval)

for (;;)

{

rcvid = MsgReceive(chid,&msg,sizeof(msg),NULL);

if (rcvid == 0)

{

//we got a pulse

if (msg.pulse.code == MY_PULSE_CODE)

{

printf("从计时器得到一个脉冲信号 ");

……

}

//else other pulses ...

}

//else other messages ...

}

……

}

每收到一次脉冲,心跳协调定时器就完成一次计时,以实现心跳信号发送、接收和处理的调度。

4.3 心跳监听的验证

为验证心跳监听的实现,搭建了试验平台。该平台包括2套系统。每套系统均包含一颗独立的CPU,可运行QNX操作系统。系统间用一根RS-232-C连接线互相连接。心跳监听试验平台流程如图4所示。

图4 心跳监听试验平台流程图Fig.4 Flowchart of heartbeat monitoring

通过将心跳监听程序编译入两套系统的QNX系统映像文件,使心跳监听程序随QNX操作系统启动。心跳监听程序启动后,系统开始从RS-232-C接口接收心跳信号。若未收到信号,置为主系统;反之,则置为从系统。主从系统确定后,主系统不断发送心跳信号,从系统不断接收心跳信号。当从系统连续若干次接收不到心跳系统时,则自动切换为主系统,并向主系统发送重置信号。

5 结束语

当前条件下,各种业务系统对信息系统的依赖与日俱增,信息系统能否实现全时段无故障工作已经受到广泛关注。心跳监听技术实现的成本较低,在提高整体的系统安全、可靠性方面效果较好。

本文主要讨论了基于串口通信的心跳监听方法,并在QNX操作系统中,通过串口实现了基本的心跳监听,给出了部分实例。相关工程技术人员在实际应用中,可以在此基础上结合具体情况,设计应急措施和恢复处理程序,从而尽可能提高整体系统的应急处理能力和可靠性,或利用心跳监听系统实现所需的特定功能。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!