任寧寧,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都610031)
任寧寧(碩士研究生),研究方向?yàn)榍度胧较到y(tǒng)軟件開發(fā);楊斌(教授),研究方向?yàn)閱纹瑱C(jī)及嵌入式系統(tǒng)應(yīng)用。
多核體系結(jié)構(gòu)正在發(fā)揮其巨大的實(shí)際應(yīng)用價(jià)值,多核環(huán)境下的任務(wù)調(diào)度是整個(gè)計(jì)算機(jī)體系結(jié)構(gòu)中的關(guān)鍵之一。對(duì)任務(wù)進(jìn)行合理的分配,可以有效地提高處理器的運(yùn)算能力。隨著轎車的普及,智能車載設(shè)備在行駛過程中,對(duì)系統(tǒng)的實(shí)時(shí)性要求非常高,而且系統(tǒng)在運(yùn)行過程中需要同時(shí)處理信號(hào)采集、軌跡跟蹤、攝像頭采集、數(shù)據(jù)通信等任務(wù)。任務(wù)之間需要協(xié)調(diào)工作,系統(tǒng)中任何一個(gè)實(shí)時(shí)任務(wù)調(diào)度存在問題,若不能在截止期前完成,就可能造成災(zāi)難性后果。QNX是實(shí)時(shí)操作系統(tǒng)中實(shí)時(shí)性最好的操作系統(tǒng),在以往的車載控制研究中,針對(duì)任務(wù)調(diào)度還未進(jìn)行過深入的討論。因此,以車載為模型對(duì)實(shí)時(shí)系統(tǒng)QNX多任務(wù)調(diào)度的研究具有十分重要的價(jià)值,而且十分有挑戰(zhàn)性。
智能車載控制系統(tǒng)主要完成實(shí)時(shí)控制、信號(hào)檢測(cè)和數(shù)據(jù)通信等功能,結(jié)構(gòu)如圖1所示。
實(shí)時(shí)控制是整個(gè)系統(tǒng)的關(guān)鍵,主要任務(wù)是動(dòng)力傳動(dòng)系統(tǒng)和安全系統(tǒng),控制系統(tǒng)包括:發(fā)動(dòng)機(jī)控制、自動(dòng)變速控制、動(dòng)力轉(zhuǎn)向控制、制動(dòng)控制、巡航控制和安全氣囊控制等。
信號(hào)檢測(cè)的主要任務(wù)是完成所有信號(hào)(包括數(shù)字量、模擬量)的輸入和輸出,讀取整個(gè)系統(tǒng)所有的傳感器信號(hào)和視頻信號(hào)。它需要不斷地探測(cè)內(nèi)外環(huán)境,如路面狀況、車載運(yùn)動(dòng)軌跡、軌跡調(diào)整任務(wù)、與周圍物體的距離、物體的運(yùn)動(dòng)速度、本車的參數(shù)、各個(gè)子系統(tǒng)的運(yùn)行情況等。系統(tǒng)會(huì)通過自身正確的控制,給駕駛員提供及時(shí)的幫助,達(dá)到減少交通事故、減輕事故造成的損失。
由于車載控制軟件系統(tǒng)中任務(wù)多,重要性不同,對(duì)執(zhí)行時(shí)間的需求也有所不同,因此,軟件任務(wù)的合理劃分顯得尤為重要,甚至直接影響整個(gè)軟件的質(zhì)量。該軟件結(jié)構(gòu)的核心部分就是如何合理調(diào)度這些多任務(wù),達(dá)到多核處理器資源最優(yōu)分配。
圖1 車載控制系統(tǒng)結(jié)構(gòu)圖
多核處理器的任務(wù)分配應(yīng)根據(jù)任務(wù)特點(diǎn)進(jìn)行,既要保證每個(gè)核任務(wù)分配的合理性,也要保證每個(gè)周期任務(wù)的執(zhí)行時(shí)間和調(diào)度周期合理。車載四核任務(wù)分配如圖2所示,每個(gè)核均需要完成一定的數(shù)據(jù)采集功能,4個(gè)核都將建立信號(hào)采樣任務(wù)。車載控制處理器要完成車載車輪軌跡跟蹤和方向盤監(jiān)控,因此將軌跡跟蹤、圖像采集、方向盤轉(zhuǎn)角、胎壓監(jiān)測(cè)和左右輪速度監(jiān)測(cè)都安排在核1上;核2主要是完成智能車載防撞防火控制、動(dòng)力轉(zhuǎn)向控制、制動(dòng)控制、巡航控制和軌跡調(diào)整任務(wù);車載運(yùn)行過程中,車載娛樂和GPS需要占用處理器執(zhí)行時(shí)間很長(zhǎng),所以安排在核3執(zhí)行該任務(wù),從不同的核采集的信號(hào)在核3上進(jìn)行數(shù)據(jù)分析;核4主要用來處理車載安全任務(wù),包括故障診斷、危險(xiǎn)報(bào)警以及緊急制動(dòng)和安全氣囊等。采集核3分析處理后的結(jié)果后輸入給故障診斷,強(qiáng)實(shí)時(shí)性保證車載安全性能。4核的任務(wù)分配原則既要保證任務(wù)分配合理性又能夠提高系統(tǒng)實(shí)時(shí)性。
圖2 車載4核任務(wù)分配圖
所有任務(wù)分配指定到固定的核后,每個(gè)核上具有一定數(shù)量的任務(wù)需要進(jìn)行調(diào)度,任務(wù)調(diào)度策略針對(duì)每個(gè)核采用單核處理器的調(diào)度算法。在4個(gè)核之間,需要盡量避免核之間任務(wù)的關(guān)聯(lián)問題。因此,任務(wù)分配的過程中,將考慮核間的任務(wù)同步問題以減少耦合,采用優(yōu)先級(jí)表調(diào)度算法調(diào)度對(duì)象是每個(gè)單核上的多任務(wù)。
基于優(yōu)先級(jí)表的調(diào)度算法綜合考慮任務(wù)價(jià)值和截止期兩個(gè)特征參數(shù),在分配任務(wù)優(yōu)先級(jí)的過程中,需要同時(shí)考慮這兩個(gè)特征參數(shù),然后設(shè)置任務(wù)初始優(yōu)先級(jí)。
首先需要建立任務(wù)價(jià)值序列和任務(wù)截止期序列,然后根據(jù)任務(wù)在序列中的位置確定任務(wù)的優(yōu)先級(jí),應(yīng)用程序則根據(jù)確定的優(yōu)先級(jí)對(duì)任務(wù)進(jìn)行調(diào)度。任務(wù)價(jià)值和截止期序列表如表1所列。
任務(wù)價(jià)值的數(shù)值根據(jù)任務(wù)在智能車載控制過程中對(duì)于系統(tǒng)的重要性而確定,然后將價(jià)值的數(shù)值分配到每個(gè)序列中。周期任務(wù)的截止期序列根據(jù)任務(wù)的周期確定,根據(jù)實(shí)際任務(wù)的執(zhí)行情況設(shè)置周期,然后按照表1的要求分配到每個(gè)序列中。系統(tǒng)針對(duì)每個(gè)任務(wù)的特征參數(shù)在序列中的位置,按照基于優(yōu)先級(jí)表的調(diào)度算法設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí)。在車載設(shè)備正常運(yùn)行的過程中,任務(wù)調(diào)度按照優(yōu)先級(jí)順序進(jìn)行。當(dāng)出現(xiàn)危險(xiǎn)事故以及要求處理危險(xiǎn)時(shí),系統(tǒng)根據(jù)處理器的運(yùn)算能力適當(dāng)停止部分任務(wù)的調(diào)度。
表1 任務(wù)價(jià)值和截止期序列表
基于優(yōu)先級(jí)表調(diào)度算法確定的每個(gè)任務(wù)的優(yōu)先級(jí)具有唯一性,滿足QNX實(shí)時(shí)操作系統(tǒng)的調(diào)度要求。同時(shí),操作系統(tǒng)建立任務(wù)優(yōu)先級(jí)數(shù)量有限,每個(gè)處理器的任務(wù)的優(yōu)先級(jí)如表2~5所列。
如表2所列,核1的主要任務(wù)是負(fù)責(zé)采集軌跡和圖像,以及加速度和胎壓等,核1的核心任務(wù)是完成軌跡調(diào)整。
表2 核1任務(wù)優(yōu)先級(jí)分配表
如表3所列,核2的主要任務(wù)是防撞防火控制和緊急制動(dòng)控制,以及車載自動(dòng)巡航控制,主要是處理強(qiáng)實(shí)時(shí)性任務(wù)。
表3 核2任務(wù)優(yōu)先級(jí)分配表
如表4所列,核3的主要任務(wù)是處理車載的娛樂功能和集中處理其他3個(gè)核采集的信號(hào),處理后的結(jié)果返回給核4進(jìn)行故障診斷。
表4 核3任務(wù)優(yōu)先級(jí)分配表
在智能車載正常行駛過程,操作系統(tǒng)根據(jù)建立的任務(wù)的優(yōu)先級(jí)順序?qū)υ摵松纤械娜蝿?wù)進(jìn)行合理調(diào)度,保證系統(tǒng)控制具有實(shí)時(shí)性和正確性。由于車載的特殊性,其運(yùn)行過程出現(xiàn)故障處理等情況時(shí),系統(tǒng)的調(diào)度不能按照常規(guī)調(diào)度對(duì)所有任務(wù)進(jìn)行調(diào)度,這樣會(huì)造成處理器利用率低,重要任務(wù)得不到充分執(zhí)行。針對(duì)這種情況出現(xiàn),系統(tǒng)要求作出合理的調(diào)度策略。
如表5所列,核4的主要任務(wù)是處理危險(xiǎn)緊急情況,保證其高安全性。故障處理的運(yùn)算量要求對(duì)處理器占用率大,雖然在核4中,安全氣囊的優(yōu)先級(jí)最高,但系統(tǒng)發(fā)生任務(wù)間切換和調(diào)度其他任務(wù)時(shí)仍需要占用一定處理器,這時(shí)要求整個(gè)處理器用來運(yùn)行危險(xiǎn)評(píng)估和危險(xiǎn)報(bào)警任務(wù),因此系統(tǒng)調(diào)度策略是停止其他非實(shí)時(shí)任務(wù),騰出整個(gè)處理器處理故障任務(wù),保證行駛的安全性。出現(xiàn)故障時(shí),要求通信處理器停止當(dāng)前關(guān)于智能車載的控制任務(wù),保證能確定當(dāng)前的運(yùn)行參數(shù)和位置信息。由于故障診斷算法占用處理器執(zhí)行時(shí)間長(zhǎng),同時(shí)由于智能車載行駛的特殊性,要求縮短通信時(shí)間以保證系統(tǒng)安全。
表5 核4任務(wù)優(yōu)先級(jí)分配表
車載控制軟件在QNX下作為獨(dú)立的進(jìn)程運(yùn)行。當(dāng)進(jìn)程啟動(dòng)后,由Neutrino進(jìn)程管理模塊分配合適的進(jìn)程地址空間,并開始運(yùn)行進(jìn)程內(nèi)的所有任務(wù)線程。圖3是QNX下車載軟件實(shí)現(xiàn)的總體流程圖,其中所有的任務(wù)線程在主線程中創(chuàng)建,并按照設(shè)計(jì)的調(diào)度策略和優(yōu)先級(jí)大小調(diào)用相關(guān)函數(shù)進(jìn)行設(shè)置,在各子線程中按照設(shè)計(jì)的運(yùn)行周期完成各任務(wù)的具體實(shí)現(xiàn)。
在主線程中,需要完成系統(tǒng)初始化和任務(wù)線程的實(shí)現(xiàn)兩個(gè)主要內(nèi)容。其中系統(tǒng)初始化主要包括數(shù)據(jù)結(jié)構(gòu)的初始化,任務(wù)線程的實(shí)現(xiàn)主要包括線程屬性的設(shè)置和線程的創(chuàng)建等內(nèi)容。
圖3 總體流程
由于車載控制線程的優(yōu)先級(jí)存在差異,所以在任務(wù)線程創(chuàng)建之前,需要對(duì)線程屬性進(jìn)行設(shè)置。線程創(chuàng)建的函數(shù)原型如下:
在對(duì)車載任務(wù)線程屬性進(jìn)行設(shè)置時(shí),需要完成以下工作:① 設(shè)置線程的調(diào)度策略為SCHED_RR或SCHED_FIFO;②設(shè)置線程的調(diào)度參數(shù),主要是指優(yōu)先級(jí)大小。由于車載控制軟件同一功能模塊內(nèi)部線程優(yōu)先級(jí)和調(diào)動(dòng)策略均相同,所以每個(gè)功能模塊只需設(shè)置一個(gè)線程屬性供模塊內(nèi)線程共用。
pthread_create()創(chuàng)建的線程不具備主線程同樣的執(zhí)行序列,而是運(yùn)行關(guān)聯(lián)函數(shù)。原型中參數(shù)*start routine()即為線程關(guān)聯(lián)函數(shù),當(dāng)線程創(chuàng)建成功之后,就自動(dòng)轉(zhuǎn)向此函數(shù)并運(yùn)行。在車載控制軟件中,各功能模塊的子任務(wù)均在關(guān)聯(lián)函數(shù)中實(shí)現(xiàn),采用while(1)語句實(shí)現(xiàn)無限循環(huán),通過調(diào)用sleep對(duì)線程進(jìn)行暫停,以實(shí)現(xiàn)其固定執(zhí)行周期。
QNX下默認(rèn)的配置為支持單核處理器,若想在多核處理器上開發(fā)應(yīng)用,要建立多核鏡像。建立好多核鏡像后,多核處理器的任務(wù)并沒有綁定,線程按照優(yōu)先級(jí)別均衡分布在4個(gè)核上執(zhí)行。若要實(shí)現(xiàn)本文的智能車載多任務(wù)的綁定,則需要綁定線程的執(zhí)行。
建立多核鏡像,修改/boot/build中鏡像:
添加硬件平臺(tái)可支持的多核類型,在/proc/boot中查看支持的多核處理器類型。本文的硬件平臺(tái)支持多對(duì)稱處理器,在qnxbasedma_multicore.build中找到procnto所在行,修改為:opt/lib procnto-smp-instr
生成啟動(dòng)映像文件,重啟系統(tǒng),構(gòu)建Buildfile,系統(tǒng)就設(shè)置為QNX下支持多核的應(yīng)用。
在圖2中劃分好4核的任務(wù)。實(shí)現(xiàn)任務(wù)綁定到QNX操作系統(tǒng)上需要設(shè)置ThreadCtl()的_NTO_TCTL_RUNMASK。runmask是一個(gè)簡(jiǎn)單的位圖,每一位位置顯示一個(gè)特定的處理器。QNX下的Thread affinity,當(dāng)線程運(yùn)行時(shí),該線程的affinity mask設(shè)置為可以運(yùn)行在4核上,若想綁定在固定的核上,則需要設(shè)置ThreadCtl()的_NTO_TCTL_RUNMASK。
核1的任務(wù)綁定為:
信號(hào)采集在4個(gè)核上都要運(yùn)行,不具體劃分任務(wù)。int mask=0x0000000f;
默認(rèn)情況下mask的設(shè)置就為全1,表明可以運(yùn)行在4核上。除了圖2中對(duì)任務(wù)的具體劃分,沒有劃分的任務(wù)就默認(rèn)為4核動(dòng)態(tài)分配執(zhí)行。
QNX Momentics系統(tǒng)分析器是一種系統(tǒng)跟蹤工具。經(jīng)檢測(cè)的內(nèi)核會(huì)記錄所有系統(tǒng)調(diào)用和事件,從而允許確定何時(shí)創(chuàng)建線程、線程運(yùn)行多久以及何時(shí)結(jié)束工作,包括多核結(jié)構(gòu)下每個(gè)CPU的使用率等。這種日志功能提供了高分辨率的時(shí)間戳,以保證實(shí)際的定時(shí)信息,便于分析車載實(shí)時(shí)任務(wù)的運(yùn)行過程。首先把車載任務(wù)初步劃分給4個(gè)核,任務(wù)調(diào)度運(yùn)行后,通過QNX性能分析器查看CPU分配情況,然后調(diào)整每個(gè)核的任務(wù)分配,直到任務(wù)均衡為止。
通過性能分析器可知,CPU1idle為24.792%,CPU2 idle為20.038%,CPU3idle為18.765%,CPU4idle為19.069%,負(fù)載基本滿足均衡原理,符合車載系統(tǒng)的控制要求。
本文對(duì)多核平臺(tái)下QNX強(qiáng)實(shí)時(shí)操作系統(tǒng)的調(diào)度機(jī)制進(jìn)行了研究。以智能車載控制系統(tǒng)任務(wù)為調(diào)度模型,首先從智能車載控制功能基本要求出發(fā),確定系統(tǒng)軟件設(shè)計(jì)思想和結(jié)構(gòu)安排,盡量減少軟件各部分之間的耦合,保證系統(tǒng)控制軟件的最高執(zhí)行效率。在此設(shè)計(jì)思想下將實(shí)時(shí)系統(tǒng)的任務(wù)劃分在4核處理器上進(jìn)行任務(wù)調(diào)度。通過性能測(cè)試,發(fā)現(xiàn)4個(gè)核負(fù)載均衡,達(dá)到要求。
[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]多核系列教材編寫組.多核程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2007.
[5]開源中國(guó)社區(qū).嵌入實(shí)時(shí)操作系統(tǒng) QNX[OL].[2013-01].http://www.oschina.net/p/qnx.