一种基于SylixOS的多任务间数据通信方法探究

2021-03-18 06:53
科学与信息化 2021年7期
关键词:多任务数据通信队列

南京科瑞达电子装备有限责任公司 江苏 南京 211100

引言

随着芯片制造工艺的持续进步和计算机技术的快速发展,嵌入式操作系统作为信息社会很重要的基础支撑已被广泛用于各类电子设备中,并发挥了极其重要的作用。嵌入式实时操作系统是一类特殊的嵌入式操作系统,它能够在外界事件或数据产生时迅速反应,并以足够快的速度处理事件,以保证系统能够在确定的时间内对处理结果做出快速响应,同时控制所有实时任务协调一致运行。目前在工业控制、军事设备、航空航天等对系统响应时间有严苛要求的领域中都有着非常广泛的应用。

在一个中大型嵌入式软件应用中,通常需要建立一个复杂的多任务环境,系统运行时通过任务间交换消息来实现某些特定的系统功能。在这些任务信息交互过程中,普遍存在一个任务往多个任务发送消息的场景,同时也存在某一个任务会接收来自多个其他任务发送过来的消息的场景。这些任务间数据通信交错复杂,并且任务间通信的数据长度各不相同。因此需要研究一种高效的、实时的、通信数据可变长的,且无任何中转机制的多任务间点对点的数据通信方法。

1 嵌入式实时操作系统SylixOS简介

SylixOS操作系统是一种基于抢占式多任务硬实时操作系统,兼容IEEE1003(ISO/IEC9945)操作系统接口规范,兼容POSIX 1003.1b(ISO/IEC 9945-1)实时编程的标准,具有优秀的实时性能,能够支持无限多任务,抢占式调度支持256个任务优先级,支持虚拟进程,支持优先级继承及防止优先级反转功能。同时支持二进制信号量、计数型信号量、互斥信号量、消息队列等资源共享方式。由于兼容POSIX标准,同样一个Linux下的符合POSIX标准的应用程序,无须任何修改可以在SylixOS下完美运行。另外,VxWorks也是一款符合POSIX标准的实时操作系统,因此,SylixOS可以使VxWorks开发者能够很快地适应SylixOS的程序开发,并提供了VxWorks兼容接口。

SylixOS是一款大型嵌入式实时操作系统,经过多年开发,目前已经成为一个功能完善、性能卓越、可靠稳定的嵌入式系统软件开发平台,在设计思路上借鉴了众多实时操作系统的设计思想,使得SylixOS在功能和具体性能上达到或超过了众多实时操作系统的水平,成为国内实时操作系统的最优秀代表之一,目前在工业自动化、军事、通信、民用等领域都有较为广泛的应用[1]。

2 传统多任务间通信方式存在的问题

SylixOS作为大型实时操作系统,支持的多任务间通信方式主要有以下几种:共享内存、信号量和消息队列。同时为了实现多任务对临界资源的互斥访问,SylixOS也提供了很多种方法,主要包括读写锁、条件变量、自旋锁、原子量及信号量等。

在一个大型的嵌入式软件应用中,可能同时运行有十几个甚至几十个软件任务,并且任务之间的消息交互非常频繁,通信的数据长度较大。共享内存的方式需要开辟很大一个内存空间来存储中间数据,同时需要对共享区域数据的读写操作做好互斥。一方面,虽然操作系统内核提供了读写锁、信号量等机制可以在一定条件下解决共享资源的互斥访问问题,但是在一些任务间通信较为复杂的多任务环境中,势必会引起数据发送端的任务大量排队等待的现象,从而降低了系统的运行效率。另一方面,消息队列机制虽然可以通过异步消息传送模型来避免由于信号量引起的排队问题,但是当任务数较多时,需要的消息队列个数将会非常多,而且消息队列中单个消息的数据长度将会要求很大,势必会造成大量的系统内存资源耗费。下面介绍的多任务间通信方法在克服这些问题方面有着一定的优势。

3 基于SylixOS的多任务间数据通信设计

在SylixOS操作系统环境下,每一项系统功能的完成往往由多个任务或者多个任务与中断服务程序共同完成。鉴于此,本文设计了一种新的任务间数据交互方式,采用的是点对点的消息机制,每个任务都有一个类似地址的代号(ID),发送的数据被封装为一个消息,发送消息的任务(信源)指定接收消息任务(信宿)的代号后将消息发出,可以直接通过互斥信号量保护机制将数据压入到信宿的环形队列中,再计数信号量同步机制由消息接收任务进行数据处理。

第一步,由于任务间通信的消息长度和内容都是用户自己定义,可以是数据、指令或指针等,因此,我们在创建每一个任务时,需要创建一个与之关联的用于存储消息的环形队列,环形队列缓冲区总大小由用户根据实际任务交互的消息大小和数量来确定,环形队列的结构如下图 1所示。同时为保证任务间通信时的同步与互斥,需要分别创建一个与任务相关联的二进制信号量与计数信号量[2]。

图1 任务的环形队列示意图

每个任务的环形队列和信号量的创建过程如下:

以上程序段在系统中创建并启动Task1、Task2、Task3,Task1建立一个缓存大小为RNG_SIZE1的环形队列,同时创建一个二进制信号量和一个计数信号量,名称分别为“semB1”和“semC1”。Task2建立一个缓存大小为RNG_SIZE2的环形队列,同时创建一个二进制信号量和一个计数信号量,名称分别为“semB2”和“semC2”。Task3建立一个缓存大小为RNG_SIZE3的环形队列,同时创建一个二进制信号量和一个计数信号量,名称分别为“semB3”和“semC3”。

第二步,需要发送消息的任务将消息送入接收任务的消息环形队列中。消息发送任务对需要发送的数据进行消息头封装,消息结构如下表 1所示。在发送数据时,根据接收方ID获取接收任务ID,然后发送任务直接将数据消息压入接收任务的环形队列中,同时释放同步信号量[3]。任务消息发送处理流程图如下图 2所示:

表1 任务间通信消息结构表

表2 消息控制字定义表

图2 任务消息发送处理流程图

第三步,消息接收任务获取同步信号量之后首先读取消息长度,然后根据消息长度读取环形队列缓冲区的消息内容进行相对应的处理[4]。任务消息接收处理流程图如下图3所示:

图3 任务消息接收处理流程图

4 实验证明

在CSP2020双核处理器上,创建一个基于SylixOS的软件应用。按照上述任务间数据通信的方法,应用中分别创建并激活三个软件任务,任务名分别为Task1、Task2、Task3。测试三个任务之间互相发送和接收不同数据长度(128字节、1K字节、4K字节)的消息(消息格式按照上述表1进行封装),分别测试1000次,最后计算得到数据从发送到成功接收的最大时间、最小时间和平均时间[5]。测试结果如下所示:

5 结束语

上述基于SylixOS的多任务间数据通信方法,解决了大型复杂嵌入式系统中任务间一对多、多对一的数据通信问题,满足其对于嵌入式实时操作系统中多任务间通信效率高、实时性强、通信数据可变长等要求,目前该方法已经在某型电子对抗装备应用软件中得到了成功的应用。

猜你喜欢
多任务数据通信队列
数字时代的注意困境:媒体多任务的视角*
结合自监督学习的多任务文本语义匹配方法
面向多任务的无人系统通信及控制系统设计与实现
队列队形体育教案
队列里的小秘密
基于多队列切换的SDN拥塞控制*
在队列里
数据通信网络维护与网络安全问题探讨
基于EDA技术的通用异步收发器设计
基于Reworks操作系统的信息交互软件设计