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