《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > SAFERTOS在新型智能負荷檢測儀中的應用
SAFERTOS在新型智能負荷檢測儀中的應用
來源:電子技術應用2012年第7期
江 韜,季愛明,毛凌峰
蘇州大學,江蘇 蘇州215021
摘要: 介紹了實時操作系統(tǒng)(SAFERTOS)的特點,并將其與μC/OS-II進行比較。以SAFERTOS的隊列機制為基礎,實現(xiàn)了郵箱和信號量機制。最后介紹了SAFERTOS在新型智能負荷監(jiān)測儀中的應用。
中圖分類號: TP316.2
文獻標識碼: A
文章編號: 0258-7998(2012)07-0023-03
Application of SAFERTOS in new load testing instrument
Jiang Tao,Ji Aiming,Mao Lingfeng
Soochow University, Suzhou 215021,China
Abstract: This paper introduces the characteristics of real-time operation system SAFERTOS, and compares it with ?滋C/OS-II. Then describes how to realize mailbox and semaphore mechanisms based on the queue of SAFERTOS. Finally,it introduces the application of SAFERTOS in the new intelligent load testing instrument.
Key words : SAFERTOS;Cortex-M3;?滋C/OS-II;loading testing instrument

1 SAFERTOS簡介

    SAFERTOS是近年來歐美極為流行的實時操作系統(tǒng),本文設計的新型智能負荷檢測儀中已將其內嵌于主控芯片LM3S9B96中免費使用。SAFERTOS是從一款開源實時操作系統(tǒng)FREERTOS演化而來的,并且在安全性方面做了很多優(yōu)化。最重要的是,SAFERTOS通過了歐洲的一個安全認證,使其能夠用于醫(yī)療、工業(yè)等高安全系數領域。
    實時系統(tǒng)的正確性不僅依賴于系統(tǒng)計算的邏輯結果,還依賴于產生這些結果的時間。因此,實時操作系統(tǒng)的調度機制和通信機制對于整個系統(tǒng)來說都是至關重要的[1]。SAFERTOS如大多數實時操作系統(tǒng)一樣支持任務調度、中斷管理、消息隊列等功能,而且內核本身精簡安全,是本應用的理想選擇。
1.1 任務調度
    SAFERTOS任務有運行、阻塞、掛起和就緒4個狀態(tài),被劃分為11(10~0)個優(yōu)先級,其中等級10優(yōu)先級最高。SAFERTOS的狀態(tài)轉換如圖1所示。任務被創(chuàng)建后處于就緒狀態(tài),一旦調度器被開啟,系統(tǒng)就會根據調度算法,找出投入運行的就緒任務,使該任務獲得CPU和硬件資源后即開始運行。運行中的任務可能會由于等待某個事件而被阻塞一段時間,或者被一個例程掛起而由另一個例程恢復,此時調度器會重新進行調度[2]。

    SAFERTOS采用搶占式和合作式任務調度,即基于優(yōu)先級的搶占式調度與時間輪轉調度相結合的算法。SAFERTOS確保了CPU總是被具有最高優(yōu)先級的就緒任務所控制,當系統(tǒng)中出現(xiàn)兩個或兩個以上就緒任務擁有相同的當前最高優(yōu)先級時,調度器會使用時間片輪轉算法,將CPU時間平均分配給這些任務。系統(tǒng)至少應該有一個任務處于就緒狀態(tài),因此優(yōu)先級最低的空閑任務不會被阻塞或掛起。
1.2 任務間通信機制
    多任務多個中斷處理過程有機地構成了嵌入式實時多任務應用程序,它們之間相互競爭CPU、共享內存和硬件等資源。任務間通信機制協(xié)調彼此運行的步調、彼此間傳遞的數據或信息,保證協(xié)同運行的各個任務具有正確的執(zhí)行次序,協(xié)同完成某項工作。SAFERTOS提供的通信機制有臨界區(qū)和消息隊列兩種。
    SAFERTOS采用傳統(tǒng)的實現(xiàn)臨界區(qū)的方法,即關中斷進入臨界區(qū),開中斷出臨界區(qū)。SAFERTOS提供了隊列,用于任務間、任務與中斷服務程序之間安全地傳遞數據。隊列的基本元素為項目(item),每個隊列可以包含0個或多個項目,每個項目占內存空間的大小以及隊列包含項目的個數在隊列創(chuàng)建時可任意配置?;谶@種結構,隊列使用靈活,以此為基礎可以開發(fā)出實時操作系統(tǒng)常見的郵箱和信號量。
2 SAFERTOS與μC/OS-II的比較
    μC/OS-II(Micro-Control Operation System Version2)是一款源代碼開放的實時操作系統(tǒng)內核,由LABROSSE J J開發(fā)。μC/OS-II最大的特點是源代碼開放,移植性強。μC/OS-II是完全搶占式的內核,它總是運行優(yōu)先級最高的就緒任務,并且提供了許多系統(tǒng)調用,如郵箱、信號量、動態(tài)內存分配、時間管理等[3]。μC/OS-II與SAFERTOS的功能比較如表1所示。

    從表1可以看出,SAFERTOS與μC/OS-II的功能差異不大,兩者皆支持中斷嵌套,有類似的任務間通信機制。受任務位圖的影響,μC/OS-II能建立的任務數目不超過56個,而SAFERTOS能夠創(chuàng)建的任務數目只受內存大小限制。SAFERTOS支持同等優(yōu)先級的輪轉調度,這比μC/OS-II能更好地支持多任務后臺計算。出于安全考慮,SAFERTOS不支持動態(tài)內存分配。
3 郵箱與信號量
3.1 郵箱

    郵箱用于任務、任務與中斷服務程序之間傳遞結構化數據或事件標志。郵箱實質上是消息的中轉站,一個任務或一個中斷服務程序通過內核服務可以把一個消息(即一段結構化數據) 放到郵箱里去。每個郵箱有相應的正在等待消息的任務列表,要得到消息的任務會因為郵箱是空的而被掛起,直到收到消息[4]。
    雖然SAFERTOS沒有直接提供郵箱機制,僅僅提供了一種配置靈活的隊列,但從本質上, SAFERTOS的隊列是一種未結構化的郵箱。而通過結構化隊列項目的內存緩存區(qū),可以實現(xiàn)收發(fā)特定數據結構的郵箱機制。創(chuàng)建郵箱函數為mbox_create,其中參數mptr為郵箱內存緩存區(qū)首地址,msgcnt為隊列項目個數,msgsz為每個項目的大小,mboxptr為郵箱的句柄(郵箱的標志,供收發(fā)函數使用),則函數定義如下:
#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);
  }
    郵箱接收函數為mbox_get,發(fā)送函數為mbox_put。其中:參數mptr為郵箱句柄,msg為收發(fā)的結構化數據的地址,接收函數中的waitopt為獲取消息失敗,任務等待時間。函數定義如下:
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 信號量
    某些軟硬件資源(例如Flash、串行總線、數據緩沖區(qū)等)會被不同任務同時訪問,使用信號量可以實現(xiàn)資源的互斥訪問。每種資源用一個信號量描述,當任務訪問該資源時,必須先成功獲取該信號量。
    信號量由計數器和等待隊列組成,計數器描述可用信號量的個數,等待隊列用來掛起等待獲取信號量的任務。釋放信號量(V操作)計數器加1;獲取信號量(P操作)計數器減1。如果計數器值小于0,則獲取失敗,請求獲取信號量的任務被阻塞固定長時間,等待其他任務釋放信號量。從本質上來看,信號量是項目長度為零的隊列。定義的信號量數據結構如下:
typedef struct  semaphore   SEMAPHORE;
struct semaphore{
    long    ref;               //計數值
    xQueueHandle  mbx;    //隊列句柄
    signed char mbxbuf[portQUEUE_OVERHEAD_BYTES]; };
    創(chuàng)建信號量函數為SemaphoreCreate,需要的參數是信號量結構指針和計數器初始值。函數定義如下:
void SemaphoreCreate(SEMAPHORE *smptr, long ini)
{
    smptr->ref = ini;
    xQueueCreate(smptr->mbxbuf, sizeof(smptr->mbxbuf), 1,
0, &smptr->mbx );
}
    獲取信號量函數為sem_p,釋放信號量函數為sem_v,其中,參數s為信號量指針,waitopt為獲取失敗等待時間。則函數定義如下:
UINT16 sem_p(SEMAPHORE *s, UINT16 waitopt)
{
    taskENTER_CRITICAL();//進入臨界區(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應用
4.1 智能負荷監(jiān)測儀

    負荷檢測儀是一種廣泛應用于配電變壓器運行狀態(tài)監(jiān)測、運行管理、電能計量、無功補償和遠程通信的智能監(jiān)測控制裝置[5]。其系統(tǒng)硬件結構圖如圖2所示。檢測儀采用LM3S9B96芯片作為主控芯片,控制整個系統(tǒng)運行;高速高精度電能計量專用芯片ADE7878采集計算電網參數;大容量片外Flash芯片存儲突發(fā)事件與電網歷史數據;GPRS通信模塊MC52i用于遠程通信;高精度時鐘芯片F(xiàn)M33256用于精確計時。

 

 

    檢測儀軟件功能比較復雜,如果采用傳統(tǒng)的前后臺系統(tǒng)架構,則無法實現(xiàn)任務的優(yōu)先級執(zhí)行,任務的響應時間與后臺應用程序主循環(huán)執(zhí)行時間有關,再加上前臺中斷程序的影響,任務的運行時間無法預測,這是實時系統(tǒng)難以容忍的[6]。所以需要一個實時操作系統(tǒng)來保證任務執(zhí)行和執(zhí)行時間的確定性。
4.2 任務劃分
    根據系統(tǒng)各功能的內聚性、時間緊迫程度以及周期性執(zhí)行原則,將系統(tǒng)劃分為九大任務,如圖3所示(圖中箭頭表示利用郵箱機制發(fā)送的事件標志或數據)。

    電能累加任務最為緊急,它以非常短的周期讀取緩存中的電能數值并累加。該任務完成累加操作后調用xTaskDelay函數,將CPU讓出一段時間后繼續(xù)執(zhí)行累加操作。參數計算和無功補償任務以精確秒數周期運行,待定時時間到,由定時器中斷服務程序發(fā)送消息喚醒執(zhí)行。遠程通信任務負責GPRS模塊數據收發(fā),當接收到數據時,由UART中斷服務程序喚醒,并將數據傳遞給規(guī)約協(xié)議棧,喚醒規(guī)約任務。外部I/O事件(包括按鍵)發(fā)生時,I/O檢測任務喚醒用戶界面任務,改變用戶界面內容。數據庫用于電網歷史數據和突發(fā)事件的存儲,數據庫任務由產生相關數據和事件的任務喚醒。
4.3 啟動系統(tǒng)
    基于SAFERTOS系統(tǒng)的啟動關鍵是配置調度器。調度器是SAFERTOS的核心,它負責管理任務狀態(tài)轉換、選擇就緒態(tài)任務運行、實現(xiàn)任務上下文切換。系統(tǒng)啟動步驟:(1)初始化最小系統(tǒng),建立C運行環(huán)境。(2)設置初始化調度器所需的系統(tǒng)運行環(huán)境參數,包括CPU頻率、系統(tǒng)滴答頻率、系統(tǒng)堆棧位置和大小、中斷向量表地址。這些參數包含在結構體xPORT_INIT_PARAMETERS中。(3)建立空閑任務運行環(huán)境,調用vTaskInitializeScheduler函數初始化調度器。(4)建立任務。SAFERTOS創(chuàng)建任務采用xTaskCreate函數,創(chuàng)建任務需要指明任務的名稱、優(yōu)先級、堆棧位置及大小等信息。(5)初始化系統(tǒng)硬件設備。(6)調用startScheduler函數啟動調度器。
    調度器啟動后,優(yōu)先級最高的任務被調度運行,系統(tǒng)啟動完畢。
    以上介紹了實時操作系統(tǒng)SAFERTOS在新型智能負荷檢測儀中的應用,經測試,該負荷檢測儀體現(xiàn)了較強的實時性、精確的參數計算、穩(wěn)定的數據存儲與遠程通信。
參考文獻
[1] 魏軍華.嵌入式實時操作系統(tǒng)概述[J].科技廣場,2011(1):254-256.
[2] Texas Instruments.SAFERTOS user&rsquo;s manual.2009.
[3] LABROSSE J J.嵌入式實時操作系統(tǒng)?滋C/OS-II[M].邵貝貝譯.北京:北京航空航天大學出版社,2001:178-185.
[4] 郭鵬,羅浩,廖明宏.實時操作系統(tǒng)中任務間通信的一種方法[J].哈爾濱商業(yè)大學學報,2003,19(5):561-564.
[5] 高璞,高永華,郝建紅.基于ARM和GPRS的變壓器負荷檢測儀[J].儀器儀表用戶,2010,17(2):36-37.
[6] 羅蕾.嵌入式實時操作系統(tǒng)及應用開發(fā)[M].北京:北京航空航天大學出版社,2011:73-75.

此內容為AET網站原創(chuàng),未經授權禁止轉載。