任寧寧,楊斌
(西南交通大學 信息科學與技術學院,成都610031)
任寧寧(碩士研究生),研究方向為嵌入式系統軟件開發;楊斌(教授),研究方向為單片機及嵌入式系統應用。
多核體系結構正在發揮其巨大的實際應用價值,多核環境下的任務調度是整個計算機體系結構中的關鍵之一。對任務進行合理的分配,可以有效地提高處理器的運算能力。隨著轎車的普及,智能車載設備在行駛過程中,對系統的實時性要求非常高,而且系統在運行過程中需要同時處理信號采集、軌跡跟蹤、攝像頭采集、數據通信等任務。任務之間需要協調工作,系統中任何一個實時任務調度存在問題,若不能在截止期前完成,就可能造成災難性后果。QNX是實時操作系統中實時性最好的操作系統,在以往的車載控制研究中,針對任務調度還未進行過深入的討論。因此,以車載為模型對實時系統QNX多任務調度的研究具有十分重要的價值,而且十分有挑戰性。
智能車載控制系統主要完成實時控制、信號檢測和數據通信等功能,結構如圖1所示。
實時控制是整個系統的關鍵,主要任務是動力傳動系統和安全系統,控制系統包括:發動機控制、自動變速控制、動力轉向控制、制動控制、巡航控制和安全氣囊控制等。
信號檢測的主要任務是完成所有信號(包括數字量、模擬量)的輸入和輸出,讀取整個系統所有的傳感器信號和視頻信號。它需要不斷地探測內外環境,如路面狀況、車載運動軌跡、軌跡調整任務、與周圍物體的距離、物體的運動速度、本車的參數、各個子系統的運行情況等。系統會通過自身正確的控制,給駕駛員提供及時的幫助,達到減少交通事故、減輕事故造成的損失。
由于車載控制軟件系統中任務多,重要性不同,對執行時間的需求也有所不同,因此,軟件任務的合理劃分顯得尤為重要,甚至直接影響整個軟件的質量。該軟件結構的核心部分就是如何合理調度這些多任務,達到多核處理器資源最優分配。

圖1 車載控制系統結構圖
多核處理器的任務分配應根據任務特點進行,既要保證每個核任務分配的合理性,也要保證每個周期任務的執行時間和調度周期合理。車載四核任務分配如圖2所示,每個核均需要完成一定的數據采集功能,4個核都將建立信號采樣任務。車載控制處理器要完成車載車輪軌跡跟蹤和方向盤監控,因此將軌跡跟蹤、圖像采集、方向盤轉角、胎壓監測和左右輪速度監測都安排在核1上;核2主要是完成智能車載防撞防火控制、動力轉向控制、制動控制、巡航控制和軌跡調整任務;車載運行過程中,車載娛樂和GPS需要占用處理器執行時間很長,所以安排在核3執行該任務,從不同的核采集的信號在核3上進行數據分析;核4主要用來處理車載安全任務,包括故障診斷、危險報警以及緊急制動和安全氣囊等。采集核3分析處理后的結果后輸入給故障診斷,強實時性保證車載安全性能。4核的任務分配原則既要保證任務分配合理性又能夠提高系統實時性。

圖2 車載4核任務分配圖
所有任務分配指定到固定的核后,每個核上具有一定數量的任務需要進行調度,任務調度策略針對每個核采用單核處理器的調度算法。在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任務優先級分配表
車載控制軟件在QNX下作為獨立的進程運行。當進程啟動后,由Neutrino進程管理模塊分配合適的進程地址空間,并開始運行進程內的所有任務線程。圖3是QNX下車載軟件實現的總體流程圖,其中所有的任務線程在主線程中創建,并按照設計的調度策略和優先級大小調用相關函數進行設置,在各子線程中按照設計的運行周期完成各任務的具體實現。
在主線程中,需要完成系統初始化和任務線程的實現兩個主要內容。其中系統初始化主要包括數據結構的初始化,任務線程的實現主要包括線程屬性的設置和線程的創建等內容。

圖3 總體流程
由于車載控制線程的優先級存在差異,所以在任務線程創建之前,需要對線程屬性進行設置。線程創建的函數原型如下:

在對車載任務線程屬性進行設置時,需要完成以下工作:① 設置線程的調度策略為SCHED_RR或SCHED_FIFO;②設置線程的調度參數,主要是指優先級大小。由于車載控制軟件同一功能模塊內部線程優先級和調動策略均相同,所以每個功能模塊只需設置一個線程屬性供模塊內線程共用。
pthread_create()創建的線程不具備主線程同樣的執行序列,而是運行關聯函數。原型中參數*start routine()即為線程關聯函數,當線程創建成功之后,就自動轉向此函數并運行。在車載控制軟件中,各功能模塊的子任務均在關聯函數中實現,采用while(1)語句實現無限循環,通過調用sleep對線程進行暫停,以實現其固定執行周期。
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核動態分配執行。
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.