多核下QNX任务调度机制的应用研究

2013-08-14 08:03任宁宁杨斌
单片机与嵌入式系统应用 2013年6期
关键词:任务调度线程车载

任宁宁,杨斌

(西南交通大学 信息科学与技术学院,成都610031)

任宁宁(硕士研究生),研究方向为嵌入式系统软件开发;杨斌(教授),研究方向为单片机及嵌入式系统应用。

引 言

多核体系结构正在发挥其巨大的实际应用价值,多核环境下的任务调度是整个计算机体系结构中的关键之一。对任务进行合理的分配,可以有效地提高处理器的运算能力。随着轿车的普及,智能车载设备在行驶过程中,对系统的实时性要求非常高,而且系统在运行过程中需要同时处理信号采集、轨迹跟踪、摄像头采集、数据通信等任务。任务之间需要协调工作,系统中任何一个实时任务调度存在问题,若不能在截止期前完成,就可能造成灾难性后果。QNX是实时操作系统中实时性最好的操作系统,在以往的车载控制研究中,针对任务调度还未进行过深入的讨论。因此,以车载为模型对实时系统QNX多任务调度的研究具有十分重要的价值,而且十分有挑战性。

1 智能车载控制系统功能

智能车载控制系统主要完成实时控制、信号检测和数据通信等功能,结构如图1所示。

实时控制是整个系统的关键,主要任务是动力传动系统和安全系统,控制系统包括:发动机控制、自动变速控制、动力转向控制、制动控制、巡航控制和安全气囊控制等。

信号检测的主要任务是完成所有信号(包括数字量、模拟量)的输入和输出,读取整个系统所有的传感器信号和视频信号。它需要不断地探测内外环境,如路面状况、车载运动轨迹、轨迹调整任务、与周围物体的距离、物体的运动速度、本车的参数、各个子系统的运行情况等。系统会通过自身正确的控制,给驾驶员提供及时的帮助,达到减少交通事故、减轻事故造成的损失。

2 车载控制系统任务划分

由于车载控制软件系统中任务多,重要性不同,对执行时间的需求也有所不同,因此,软件任务的合理划分显得尤为重要,甚至直接影响整个软件的质量。该软件结构的核心部分就是如何合理调度这些多任务,达到多核处理器资源最优分配。

图1 车载控制系统结构图

多核处理器的任务分配应根据任务特点进行,既要保证每个核任务分配的合理性,也要保证每个周期任务的执行时间和调度周期合理。车载四核任务分配如图2所示,每个核均需要完成一定的数据采集功能,4个核都将建立信号采样任务。车载控制处理器要完成车载车轮轨迹跟踪和方向盘监控,因此将轨迹跟踪、图像采集、方向盘转角、胎压监测和左右轮速度监测都安排在核1上;核2主要是完成智能车载防撞防火控制、动力转向控制、制动控制、巡航控制和轨迹调整任务;车载运行过程中,车载娱乐和GPS需要占用处理器执行时间很长,所以安排在核3执行该任务,从不同的核采集的信号在核3上进行数据分析;核4主要用来处理车载安全任务,包括故障诊断、危险报警以及紧急制动和安全气囊等。采集核3分析处理后的结果后输入给故障诊断,强实时性保证车载安全性能。4核的任务分配原则既要保证任务分配合理性又能够提高系统实时性。

图2 车载4核任务分配图

3 基于优先级表的智能车载系统多任务调度

所有任务分配指定到固定的核后,每个核上具有一定数量的任务需要进行调度,任务调度策略针对每个核采用单核处理器的调度算法。在4个核之间,需要尽量避免核之间任务的关联问题。因此,任务分配的过程中,将考虑核间的任务同步问题以减少耦合,采用优先级表调度算法调度对象是每个单核上的多任务。

基于优先级表的调度算法综合考虑任务价值和截止期两个特征参数,在分配任务优先级的过程中,需要同时考虑这两个特征参数,然后设置任务初始优先级。

首先需要建立任务价值序列和任务截止期序列,然后根据任务在序列中的位置确定任务的优先级,应用程序则根据确定的优先级对任务进行调度。任务价值和截止期序列表如表1所列。

任务价值的数值根据任务在智能车载控制过程中对于系统的重要性而确定,然后将价值的数值分配到每个序列中。周期任务的截止期序列根据任务的周期确定,根据实际任务的执行情况设置周期,然后按照表1的要求分配到每个序列中。系统针对每个任务的特征参数在序列中的位置,按照基于优先级表的调度算法设置每个任务的优先级。在车载设备正常运行的过程中,任务调度按照优先级顺序进行。当出现危险事故以及要求处理危险时,系统根据处理器的运算能力适当停止部分任务的调度。

表1 任务价值和截止期序列表

基于优先级表调度算法确定的每个任务的优先级具有唯一性,满足QNX实时操作系统的调度要求。同时,操作系统建立任务优先级数量有限,每个处理器的任务的优先级如表2~5所列。

如表2所列,核1的主要任务是负责采集轨迹和图像,以及加速度和胎压等,核1的核心任务是完成轨迹调整。

表2 核1任务优先级分配表

如表3所列,核2的主要任务是防撞防火控制和紧急制动控制,以及车载自动巡航控制,主要是处理强实时性任务。

表3 核2任务优先级分配表

如表4所列,核3的主要任务是处理车载的娱乐功能和集中处理其他3个核采集的信号,处理后的结果返回给核4进行故障诊断。

表4 核3任务优先级分配表

在智能车载正常行驶过程,操作系统根据建立的任务的优先级顺序对该核上所有的任务进行合理调度,保证系统控制具有实时性和正确性。由于车载的特殊性,其运行过程出现故障处理等情况时,系统的调度不能按照常规调度对所有任务进行调度,这样会造成处理器利用率低,重要任务得不到充分执行。针对这种情况出现,系统要求作出合理的调度策略。

如表5所列,核4的主要任务是处理危险紧急情况,保证其高安全性。故障处理的运算量要求对处理器占用率大,虽然在核4中,安全气囊的优先级最高,但系统发生任务间切换和调度其他任务时仍需要占用一定处理器,这时要求整个处理器用来运行危险评估和危险报警任务,因此系统调度策略是停止其他非实时任务,腾出整个处理器处理故障任务,保证行驶的安全性。出现故障时,要求通信处理器停止当前关于智能车载的控制任务,保证能确定当前的运行参数和位置信息。由于故障诊断算法占用处理器执行时间长,同时由于智能车载行驶的特殊性,要求缩短通信时间以保证系统安全。

表5 核4任务优先级分配表

4 车载控制任务的实现

4.1 软件实现流程

车载控制软件在QNX下作为独立的进程运行。当进程启动后,由Neutrino进程管理模块分配合适的进程地址空间,并开始运行进程内的所有任务线程。图3是QNX下车载软件实现的总体流程图,其中所有的任务线程在主线程中创建,并按照设计的调度策略和优先级大小调用相关函数进行设置,在各子线程中按照设计的运行周期完成各任务的具体实现。

在主线程中,需要完成系统初始化和任务线程的实现两个主要内容。其中系统初始化主要包括数据结构的初始化,任务线程的实现主要包括线程属性的设置和线程的创建等内容。

图3 总体流程

4.2 任务线程初始化

由于车载控制线程的优先级存在差异,所以在任务线程创建之前,需要对线程属性进行设置。线程创建的函数原型如下:

在对车载任务线程属性进行设置时,需要完成以下工作:① 设置线程的调度策略为SCHED_RR或SCHED_FIFO;②设置线程的调度参数,主要是指优先级大小。由于车载控制软件同一功能模块内部线程优先级和调动策略均相同,所以每个功能模块只需设置一个线程属性供模块内线程共用。

pthread_create()创建的线程不具备主线程同样的执行序列,而是运行关联函数。原型中参数*start routine()即为线程关联函数,当线程创建成功之后,就自动转向此函数并运行。在车载控制软件中,各功能模块的子任务均在关联函数中实现,采用while(1)语句实现无限循环,通过调用sleep对线程进行暂停,以实现其固定执行周期。

4.3 车载任务多核的绑定

QNX下默认的配置为支持单核处理器,若想在多核处理器上开发应用,要建立多核镜像。建立好多核镜像后,多核处理器的任务并没有绑定,线程按照优先级别均衡分布在4个核上执行。若要实现本文的智能车载多任务的绑定,则需要绑定线程的执行。

建立多核镜像,修改/boot/build中镜像:

添加硬件平台可支持的多核类型,在/proc/boot中查看支持的多核处理器类型。本文的硬件平台支持多对称处理器,在qnxbasedma_multicore.build中找到procnto所在行,修改为:opt/lib procnto-smp-instr

生成启动映像文件,重启系统,构建Buildfile,系统就设置为QNX下支持多核的应用。

在图2中划分好4核的任务。实现任务绑定到QNX操作系统上需要设置ThreadCtl()的_NTO_TCTL_RUNMASK。runmask是一个简单的位图,每一位位置显示一个特定的处理器。QNX下的Thread affinity,当线程运行时,该线程的affinity mask设置为可以运行在4核上,若想绑定在固定的核上,则需要设置ThreadCtl()的_NTO_TCTL_RUNMASK。

核1的任务绑定为:

信号采集在4个核上都要运行,不具体划分任务。int mask=0x0000000f;

默认情况下mask的设置就为全1,表明可以运行在4核上。除了图2中对任务的具体划分,没有划分的任务就默认为4核动态分配执行。

5 测试分析

QNX Momentics系统分析器是一种系统跟踪工具。经检测的内核会记录所有系统调用和事件,从而允许确定何时创建线程、线程运行多久以及何时结束工作,包括多核结构下每个CPU的使用率等。这种日志功能提供了高分辨率的时间戳,以保证实际的定时信息,便于分析车载实时任务的运行过程。首先把车载任务初步划分给4个核,任务调度运行后,通过QNX性能分析器查看CPU分配情况,然后调整每个核的任务分配,直到任务均衡为止。

通过性能分析器可知,CPU1idle为24.792%,CPU2 idle为20.038%,CPU3idle为18.765%,CPU4idle为19.069%,负载基本满足均衡原理,符合车载系统的控制要求。

结 语

本文对多核平台下QNX强实时操作系统的调度机制进行了研究。以智能车载控制系统任务为调度模型,首先从智能车载控制功能基本要求出发,确定系统软件设计思想和结构安排,尽量减少软件各部分之间的耦合,保证系统控制软件的最高执行效率。在此设计思想下将实时系统的任务划分在4核处理器上进行任务调度。通过性能测试,发现4个核负载均衡,达到要求。

[1]Getting Started with QNX Neutrino:A Guide for Realtime Programmers[OL].[2013-01].http://www.qnx.com.

[2]QNX Neutrino RTOS Multicore Processing Users Guide[OL].[2013-01].http://www.qnx.com.

[3]OpenQNX中文论坛.http://www.openqnx.com/chinese/.

[4]多核系列教材编写组.多核程序设计[M].北京:清华大学出版社,2007.

[5]开源中国社区.嵌入实时操作系统 QNX[OL].[2013-01].http://www.oschina.net/p/qnx.

猜你喜欢
任务调度线程车载
一种车载可折叠宿营住房
基于C#线程实验探究
高速磁浮车载运行控制系统综述
基于国产化环境的线程池模型研究与实现
奔驰S级48V车载电气系统(下)
基于改进NSGA-Ⅱ算法的协同制造任务调度研究
基于时间负载均衡蚁群算法的云任务调度优化
浅谈linux多线程协作
智能互联势不可挡 车载存储需求爆发
云计算环境中任务调度策略