江 韜,季愛明,毛凌峰
(蘇州大學(xué),江蘇 蘇州 215021)
SAFERTOS是近年來歐美極為流行的實時操作系統(tǒng),本文設(shè)計的新型智能負荷檢測儀中已將其內(nèi)嵌于主控芯片LM3S9B96中免費使用。SAFERTOS是從一款開源實時操作系統(tǒng)FREERTOS演化而來的,并且在安全性方面做了很多優(yōu)化。最重要的是,SAFERTOS通過了歐洲的一個安全認證,使其能夠用于醫(yī)療、工業(yè)等高安全系數(shù)領(lǐng)域。
實時系統(tǒng)的正確性不僅依賴于系統(tǒng)計算的邏輯結(jié)果,還依賴于產(chǎn)生這些結(jié)果的時間。因此,實時操作系統(tǒng)的調(diào)度機制和通信機制對于整個系統(tǒng)來說都是至關(guān)重要的[1]。SAFERTOS如大多數(shù)實時操作系統(tǒng)一樣支持任務(wù)調(diào)度、中斷管理、消息隊列等功能,而且內(nèi)核本身精簡安全,是本應(yīng)用的理想選擇。
SAFERTOS任務(wù)有運行、阻塞、掛起和就緒4個狀態(tài),被劃分為11(10~0)個優(yōu)先級,其中等級10優(yōu)先級最高。SAFERTOS的狀態(tài)轉(zhuǎn)換如圖1所示。任務(wù)被創(chuàng)建后處于就緒狀態(tài),一旦調(diào)度器被開啟,系統(tǒng)就會根據(jù)調(diào)度算法,找出投入運行的就緒任務(wù),使該任務(wù)獲得CPU和硬件資源后即開始運行。運行中的任務(wù)可能會由于等待某個事件而被阻塞一段時間,或者被一個例程掛起而由另一個例程恢復(fù),此時調(diào)度器會重新進行調(diào)度[2]。
SAFERTOS采用搶占式和合作式任務(wù)調(diào)度,即基于優(yōu)先級的搶占式調(diào)度與時間輪轉(zhuǎn)調(diào)度相結(jié)合的算法。SAFERTOS確保了CPU總是被具有最高優(yōu)先級的就緒任務(wù)所控制,當(dāng)系統(tǒng)中出現(xiàn)兩個或兩個以上就緒任務(wù)擁有相同的當(dāng)前最高優(yōu)先級時,調(diào)度器會使用時間片輪轉(zhuǎn)算法,將CPU時間平均分配給這些任務(wù)。系統(tǒng)至少應(yīng)該有一個任務(wù)處于就緒狀態(tài),因此優(yōu)先級最低的空閑任務(wù)不會被阻塞或掛起。
多任務(wù)多個中斷處理過程有機地構(gòu)成了嵌入式實時多任務(wù)應(yīng)用程序,它們之間相互競爭CPU、共享內(nèi)存和硬件等資源。任務(wù)間通信機制協(xié)調(diào)彼此運行的步調(diào)、彼此間傳遞的數(shù)據(jù)或信息,保證協(xié)同運行的各個任務(wù)具有正確的執(zhí)行次序,協(xié)同完成某項工作。SAFERTOS提供的通信機制有臨界區(qū)和消息隊列兩種。
SAFERTOS采用傳統(tǒng)的實現(xiàn)臨界區(qū)的方法,即關(guān)中斷進入臨界區(qū),開中斷出臨界區(qū)。SAFERTOS提供了隊列,用于任務(wù)間、任務(wù)與中斷服務(wù)程序之間安全地傳遞數(shù)據(jù)。隊列的基本元素為項目(item),每個隊列可以包含0個或多個項目,每個項目占內(nèi)存空間的大小以及隊列包含項目的個數(shù)在隊列創(chuàng)建時可任意配置?;谶@種結(jié)構(gòu),隊列使用靈活,以此為基礎(chǔ)可以開發(fā)出實時操作系統(tǒng)常見的郵箱和信號量。
μC/OS-II(Micro-Control Operation System Version2)是一款源代碼開放的實時操作系統(tǒng)內(nèi)核,由LABROSSE J J開發(fā)。μC/OS-II最大的特點是源代碼開放,移植性強。μC/OS-II是完全搶占式的內(nèi)核,它總是運行優(yōu)先級最高的就緒任務(wù),并且提供了許多系統(tǒng)調(diào)用,如郵箱、信號量、動態(tài)內(nèi)存分配、時間管理等[3]。μC/OS-II與SAFERTOS的功能比較如表1所示。
從表 1可以看出,SAFERTOS與μC/OS-II的功能差異不大,兩者皆支持中斷嵌套,有類似的任務(wù)間通信機制。受任務(wù)位圖的影響,μC/OS-II能建立的任務(wù)數(shù)目不超過56個,而SAFERTOS能夠創(chuàng)建的任務(wù)數(shù)目只受內(nèi)存大小限制。SAFERTOS支持同等優(yōu)先級的輪轉(zhuǎn)調(diào)度,這比μC/OS-II能更好地支持多任務(wù)后臺計算。出于安全考慮,SAFERTOS不支持動態(tài)內(nèi)存分配。
郵箱用于任務(wù)、任務(wù)與中斷服務(wù)程序之間傳遞結(jié)構(gòu)化數(shù)據(jù)或事件標(biāo)志。郵箱實質(zhì)上是消息的中轉(zhuǎn)站,一個任務(wù)或一個中斷服務(wù)程序通過內(nèi)核服務(wù)可以把一個消息(即一段結(jié)構(gòu)化數(shù)據(jù))放到郵箱里去。每個郵箱有相應(yīng)的正在等待消息的任務(wù)列表,要得到消息的任務(wù)會因為郵箱是空的而被掛起,直到收到消息[4]。
雖然SAFERTOS沒有直接提供郵箱機制,僅僅提供了一種配置靈活的隊列,但從本質(zhì)上,SAFERTOS的隊列是一種未結(jié)構(gòu)化的郵箱。而通過結(jié)構(gòu)化隊列項目的內(nèi)存緩存區(qū),可以實現(xiàn)收發(fā)特定數(shù)據(jù)結(jié)構(gòu)的郵箱機制。創(chuàng)建郵箱函數(shù)為mbox_create,其中參數(shù)mptr為郵箱內(nèi)存緩存區(qū)首地址,msgcnt為隊列項目個數(shù),msgsz為每個項目的大小,mboxptr為郵箱的句柄(郵箱的標(biāo)志,供收發(fā)函數(shù)使用),則函數(shù)定義如下:
郵箱接收函數(shù)為 mbox_get,發(fā)送函數(shù)為 mbox_put。其中:參數(shù)mptr為郵箱句柄,msg為收發(fā)的結(jié)構(gòu)化數(shù)據(jù)的地址,接收函數(shù)中的waitopt為獲取消息失敗,任務(wù)等待時間。函數(shù)定義如下:
某些軟硬件資源(例如Flash、串行總線、數(shù)據(jù)緩沖區(qū)等)會被不同任務(wù)同時訪問,使用信號量可以實現(xiàn)資源的互斥訪問。每種資源用一個信號量描述,當(dāng)任務(wù)訪問該資源時,必須先成功獲取該信號量。
信號量由計數(shù)器和等待隊列組成,計數(shù)器描述可用信號量的個數(shù),等待隊列用來掛起等待獲取信號量的任務(wù)。釋放信號量(V操作)計數(shù)器加1;獲取信號量(P操作)計數(shù)器減 1。如果計數(shù)器值小于 0,則獲取失敗,請求獲取信號量的任務(wù)被阻塞固定長時間,等待其他任務(wù)釋放信號量。從本質(zhì)上來看,信號量是項目長度為零的隊列。定義的信號量數(shù)據(jù)結(jié)構(gòu)如下:
創(chuàng)建信號量函數(shù)為SemaphoreCreate,需要的參數(shù)是信號量結(jié)構(gòu)指針和計數(shù)器初始值。函數(shù)定義如下:
表1 μC/OS-II與SAFERTOS系統(tǒng)服務(wù)比較
獲取信號量函數(shù)為sem_p,釋放信號量函數(shù)為sem_v,其中,參數(shù)s為信號量指針,waitopt為獲取失敗等待時間。則函數(shù)定義如下:
負荷檢測儀是一種廣泛應(yīng)用于配電變壓器運行狀態(tài)監(jiān)測、運行管理、電能計量、無功補償和遠程通信的智能監(jiān)測控制裝置[5]。其系統(tǒng)硬件結(jié)構(gòu)圖如圖2所示。檢測儀采用LM3S9B96芯片作為主控芯片,控制整個系統(tǒng)運行;高速高精度電能計量專用芯片ADE7878采集計算電網(wǎng)參數(shù);大容量片外Flash芯片存儲突發(fā)事件與電網(wǎng)歷史數(shù)據(jù);GPRS通信模塊MC52i用于遠程通信;高精度時鐘芯片F(xiàn)M33256用于精確計時。
圖2 系統(tǒng)硬件結(jié)構(gòu)
檢測儀軟件功能比較復(fù)雜,如果采用傳統(tǒng)的前后臺系統(tǒng)架構(gòu),則無法實現(xiàn)任務(wù)的優(yōu)先級執(zhí)行,任務(wù)的響應(yīng)時間與后臺應(yīng)用程序主循環(huán)執(zhí)行時間有關(guān),再加上前臺中斷程序的影響,任務(wù)的運行時間無法預(yù)測,這是實時系統(tǒng)難以容忍的[6]。所以需要一個實時操作系統(tǒng)來保證任務(wù)執(zhí)行和執(zhí)行時間的確定性。
根據(jù)系統(tǒng)各功能的內(nèi)聚性、時間緊迫程度以及周期性執(zhí)行原則,將系統(tǒng)劃分為九大任務(wù),如圖3所示(圖中箭頭表示利用郵箱機制發(fā)送的事件標(biāo)志或數(shù)據(jù))。
電能累加任務(wù)最為緊急,它以非常短的周期讀取緩存中的電能數(shù)值并累加。該任務(wù)完成累加操作后調(diào)用 xTaskDelay函數(shù),將CPU讓出一段時間后繼續(xù)執(zhí)行累加操作。參數(shù)計算和無功補償任務(wù)以精確秒數(shù)周期運行,待定時時間到,由定時器中斷服務(wù)程序發(fā)送消息喚醒執(zhí)行。遠程通信任務(wù)負責(zé)GPRS模塊數(shù)據(jù)收發(fā),當(dāng)接收到數(shù)據(jù)時,由UART中斷服務(wù)程序喚醒,并將數(shù)據(jù)傳遞給規(guī)約協(xié)議棧,喚醒規(guī)約任務(wù)。外部I/O事件(包括按鍵)發(fā)生時,I/O檢測任務(wù)喚醒用戶界面任務(wù),改變用戶界面內(nèi)容。數(shù)據(jù)庫用于電網(wǎng)歷史數(shù)據(jù)和突發(fā)事件的存儲,數(shù)據(jù)庫任務(wù)由產(chǎn)生相關(guān)數(shù)據(jù)和事件的任務(wù)喚醒。
基于SAFERTOS系統(tǒng)的啟動關(guān)鍵是配置調(diào)度器。調(diào)度器是SAFERTOS的核心,它負責(zé)管理任務(wù)狀態(tài)轉(zhuǎn)換、選擇就緒態(tài)任務(wù)運行、實現(xiàn)任務(wù)上下文切換。系統(tǒng)啟動步驟:(1)初始化最小系統(tǒng),建立C運行環(huán)境。(2)設(shè)置初始化調(diào)度器所需的系統(tǒng)運行環(huán)境參數(shù),包括CPU頻率、系統(tǒng)滴答頻率、系統(tǒng)堆棧位置和大小、中斷向量表地址。這些參數(shù)包含在結(jié)構(gòu)體xPORT_INIT_PARAMETERS中。(3)建立空閑任務(wù)運行環(huán)境,調(diào)用vTaskInitializeScheduler函數(shù)初始化調(diào)度器。(4)建立任務(wù)。SAFERTOS創(chuàng)建任務(wù)采用xTaskCreate函數(shù),創(chuàng)建任務(wù)需要指明任務(wù)的名稱、優(yōu)先級、堆棧位置及大小等信息。(5)初始化系統(tǒng)硬件設(shè)備。(6)調(diào)用startScheduler函數(shù)啟動調(diào)度器。
調(diào)度器啟動后,優(yōu)先級最高的任務(wù)被調(diào)度運行,系統(tǒng)啟動完畢。
以上介紹了實時操作系統(tǒng)SAFERTOS在新型智能負荷檢測儀中的應(yīng)用,經(jīng)測試,該負荷檢測儀體現(xiàn)了較強的實時性、精確的參數(shù)計算、穩(wěn)定的數(shù)據(jù)存儲與遠程通信。
[1]魏軍華.嵌入式實時操作系統(tǒng)概述[J].科技廣場,2011(1):254-256.
[2]Texas Instruments.SAFERTOS user’s manual.2009.
[3]LABROSSE J J.嵌入式實時操作系統(tǒng) μC/OS-II[M].邵貝貝譯.北京:北京航空航天大學(xué)出版社,2001:178-185.
[4]郭鵬,羅浩,廖明宏.實時操作系統(tǒng)中任務(wù)間通信的一種方法[J].哈爾濱商業(yè)大學(xué)學(xué)報,2003,19(5):561-564.
[5]高璞,高永華,郝建紅.基于ARM和 GPRS的變壓器負荷檢測儀[J].儀器儀表用戶,2010,17(2):36-37.
[6]羅蕾.嵌入式實時操作系統(tǒng)及應(yīng)用開發(fā)[M].北京:北京航空航天大學(xué)出版社,2011:73-75.