歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 微型嵌入式實時操作系統SmallRTOS常用接口函數

微型嵌入式實時操作系統SmallRTOS常用接口函數

日期:2017/2/28 13:55:06   编辑:Linux教程

微型嵌入式實時操作系統SmallRTOS是一個源代碼開放的、易於移植的、面向深度嵌入式應用的微內核實時操作系統,主要應用領域為工業控制,智能傳感器開發,智能終端,物聯網等。任何人在遵循SmallRTOS許可協議的前提下均可免費使用該嵌入式實時操作系統。最新版本源代碼及示例工程的發布網站為: http://www.smallrtos.org

下載到SmallRTOS的源代碼壓縮包後,進行解壓,可以看到SmallRTOS的目錄結構如下:

Kernel: 存放SmallRTOS的內核文件OS及和CPU相關的移植文件;
Demo: 存放SmallRTOS提供的示例文件;
Doc: 存放SmallRTOS相關說明/教程文檔;
License:存放SmallRTOS使用許可;

微型嵌入式實時操作系統SmallRTOS在設計時,其文件命名、函數名及變量命名由專用的前綴進行區分:前綴為OS,表示為SmallRTOS的內核,這些是與平台無關的內核部分,在進行跨平台移植時,無需更改;前綴為Fit,表示為硬件(芯片類型等)相關的部分,在進行移植時,這一部分的文件、函數及變量需要根據硬件平台(芯片類型等)進行適當的調整;

微型嵌入式實時操作系統SmallRTOS是多任務搶占式操作系統,高優先級任務可以搶先執行,體現了操作系統的實時性。在SmallRTOS系統中,優先級0為最低優先級,該優先級為SmallRTOS系統的保留優先級,作為空閒任務OSIdleTask的專用優先級,用戶創建的任務無法使用。除此之外的優先級,用戶可以根據任務的重要程度自行分配使用。優先級高的任務會搶先執行。

為了突顯嵌入式操作系統配置的靈活性,在SmallRTOS系統設計之初就進行了全面的考量,部分參數采用了宏定義的方式進行配置。每個任務均有自己的名稱及優先級,任務名稱長度最大為OSNAME_MAX_LEN, 該變量是一個宏定義,超出該最大長度的名稱會自動捨棄,默認為10個字符。任務優先級的定義為OSTASK_MAX_PRIORITY, 這是一個非常重要的參數,系統默認值為10。

Ticks經常被稱為時鐘滴答,是SmallRTOS系統中最小的時間單位,這個參數可以根據硬件平台的性能進行設置。在SmallRTOS系統中,該參數采用宏定義configTICK_RATE_HZ進行配置。在SmallRTOS提供的大部分示例工程中,均配置的為1000Hz,即每個時鐘滴答間隔是1毫秒,該參數會影響SmallRTOS系統對任務的控制精度。系統調度器啟動後,會按照任務的優先級進行執行,直至該任務讓出執行權或者被更高級的任務搶斷。如果沒有符合條件的任務需要執行,則運行系統中預留的OSIdleTask(空閒任務)。

在SmallRTOS系統中,除了相關參數采用宏定義進行配置之外,功能模塊也采用宏定義進行配置。其中宏定義OS_SEMAPHORE_ON表示是否啟用信號量(Semaphore,又稱作旗語)功能模塊,若定義為1,則表示啟用信號量(Semaphore,又稱作旗語)功能模塊,若定義為0,則該功能模塊不被啟用;宏定義OS_MSGQ_ON表示是否啟用消息隊列,用法同OS_SEMAPHORE_ON;宏定義OS_MUTEX_ON表示是否啟用互斥信號量,用法同OS_SEMAPHORE_ON;

下面是微型嵌入式實時操作系統SmallRTOS中經常用到的接口函數,供大家使用時參考;

一、系統中任務相關的API函數
OSTaskHandle_t OSTaskCreate(OSTaskFunction_t pxTaskFunction,
void* pvParameter,
const uOS16_t usStackDepth,
uOSBase_t uxPriority,
sOS8_t* pcTaskName);

OSTaskCreate為微型嵌入式實時操作系統SmallRTOS的任務創建函數,其中參數OSTaskFunction_t pxTaskFunction為任務函數,該任務函數類型定義為void TaskFunction( void *pParameters );任務函數中的參數void *pParameters 亦即OSTaskCreate的第二個參數;第三個參數為任務的棧空間usStackDepth,棧空間需要根據任務占用的空間多少進行調整;第四個參數為任務的優先級,除最低優先級0為系統保留外,均可使用。第五個參數為任務名字,任務名字也就是任務的標簽,主要方便在調試時區分不同的任務。

函數OSTaskCreate的返回值為OSTaskHandle_t類型的任務句柄,該句柄可以被其它系統函數調用,以設置或控制任務的狀態;
void OSTaskSleep(uOS32_t uxWatiTicks);

OSTaskSleep為微型嵌入式實時操作系統SmallRTOS系統中任務延遲執行設置函數,通過此函數,可以把當前任務休眠若干毫秒的時間。參數uOS32_t uxWatiTicks代表休眠的時間長短,單位為Ticks,用戶可以通過OSTICKS_PER_MS把毫秒轉換為Ticks計數;
void OSTaskYield()

OSTaskYield函數為SmallRTOS中的任務控制類函數,在任務中調用,用於讓出當前任務的執行權,並切換到下一個處於eTaskStateReady狀態的任務;函數OSTaskYield並不改變任務的狀態,只是把當前正在執行的任務排列到狀態為eTaskStateReady的任務隊列的隊尾,若只有當前任務處於eTaskStateReady狀態,則仍然執行當前任務;
uOS16_t OSStart( void )

函數OSStart為OSStartScheduler()函數的宏定義,OSStartScheduler()函數是SmallRTOS中的任務調度啟動函數;在該函數中,系統會設置空閒任務OSIdleTask及時鐘中斷;OSIdleTask任務為系統空閒任務,若系統當前沒有需要執行的任務,則會調用該空閒任務,空閒任務可以用於統計當前系統的利用率,及釋放處於待刪除狀態任務的資源;時鐘中斷則為系統的ticks配置,整個系統的運行即依賴此ticks驅動運行;

二、任務同步信號量相關的API函數
OSSemHandle_t OSSemCreate()

函數OSSemCreate為信號量(Semaphore)創建函數,用於創建任務間同步操作的信號量。信號量創建後,默認有效信號量計數值為0,表示該信號量無有效信號,對應的OSSemPend函數處於阻塞狀態,等待有效信號;其返回值為OSSemHandle_t類型的句柄,方便用於對該信號量的操控;
sOSBase_t OSSemPend( OSSemHandle_t SemHandle, uOSTick_t xTicksToWait)

函數OSSemPend為信號量等待函數,在任務執行函數中調用,用於等待相關同步的信號量;參數OSSemHandle_t SemHandle為信號量句柄,參數uOSTick_t xTicksToWait為任務阻塞時間,單位為Tick數,若設置為OSPEND_FORVER_VALUE,則會永遠阻塞,直至指定信號量SemHandle獲取到有效信號;
sOSBase_t OSSemPost( OSSemHandle_t SemHandle)

函數OSSemPost用於向指定信號量發送有效信號,使處於等待該信號量的任務獲取同步信號,以便恢復執行。注:此函數不能在中斷服務函數中調用。
sOSBase_t OSSemPostFromISR( OSSemHandle_t SemHandle )

函數OSSemPostFromISR用於向指定信號量發送有效信號,使處於等待該信號量的任務獲取同步信號,以便恢復執行。注:此函數只能在中斷服務函數中調用。

三、任務同步消息相關的API函數
OSMsgQHandle_t OSMsgQCreate( const uOSBase_t uxQueueLength, const uOSBase_t uxItemSize)

函數OSMsgQCreate為消息隊列的創建函數,用於創建任務間同步操作的消息隊列,參數uxQueueLength為消息隊列中的消息數的容量(消息數目超過此容量,則發送任務掛起,直到消息隊列有空閒位置),第二個參數uxItemSize為單個消息的長度。其返回值為OSMsgQHandle_t類型的消息隊列句柄,方便對消息隊列的操控;
sOSBase_t OSMsgQReceive( OSMsgQHandle_t MsgQHandle, void * const pvBuffer, uOSTick_t xTicksToWait)

函數OSMsgQReceive用於在任務中接收指定消息隊列的消息,在任務執行函數中調用;該函數為任務阻塞函數。參數MsgQHandle為消息隊列句柄, 參數pvBuffer表示消息的指針,參數xTicksToWait為消息隊列等待接收時間,單位為Tick,若設置為OSPEND_FORVER_VALUE,則會永遠等待,直至指定消息隊列MsgQHandle獲取到有效消息為止。函數返回值代表消息接收狀態,若為FALSE則未接收到有效消息,若為TRUE則接收到有效消息;
sOSBase_t OSMsgQReceiveFromISR( OSMsgQHandle_t MsgQHandle, void * const pvBuffer)

函數OSMsgQReceiveFromISR用於在中斷函數中接收指定消息隊列的消息;參數MsgQHandle為消息隊列句柄, 參數pvBuffer表示消息的指針,該函數不會阻塞。函數返回值代表消息接收狀態,若為FALSE則未接收到有效消息,若為TRUE則接收到有效消息;注:此函數只能在中斷服務函數中調用。
sOSBase_t OSMsgQSend( OSMsgQHandle_t MsgQHandle, const void * const pvItemToQueue, uOSTick_t xTicksToWait)

函數OSMsgQSend用於向指定的消息隊列發送消息,使處於等待該消息的任務獲取同步消息,並恢復執行,其中參數MsgQHandle表示消息隊列,參數pvItemToQueue表示消息地址(指針),參數xTicksToWait為消息發送等待接收時間,單位為Tick,若設置為OSPEND_FORVER_VALUE,則會永遠等待,直至指定消息隊列MsgQHandle有空閒位置。函數返回值代表消息發送狀態,若為FALSE則消息發送失敗,若為TRUE則消息發送成功;注:此函數不能在中斷服務函數中調用。
sOSBase_t OSMsgQSendFromISR( OSMsgQHandle_t MsgQHandle, const void * const pvItemToQueue)

函數OSMsgQSendFromISR用於向指定的消息隊列發送消息,使處於等待該消息的任務獲取同步消息,並恢復執行,其中參數MsgQHandle表示消息隊列,參數pvItemToQueue表示消息地址(指針),如果消息隊列已滿,則函數不會阻塞,直接返回發送失敗信息。注:此函數只能在中斷服務函數中調用。

四、定時器相關的API函數
OSTimerHandle_t OSTimerCreate(OSTimerFunction_t Function, void* pvParameter, uOSBase_t uxPeriodicTimeMS, sOS8_t* pcName)

接口函數OSTimerCreate用於創建定時器。其中參數Function為定時器的服務函數,用於響應定時器,函數OSTimerFunction_t的定義類型為void TimerFunction(void *pParameters )。pvParameter為定時器服務函數的參數,不用時可以設置為NULL。參數uxPeriodicTimeMS為定時器的周期,單位為毫秒。參數pcName為定時器的名稱,方便區分不同的定時器;注意:定時器服務函數中禁止添加信號量等待、消息隊列等待等用於阻塞的函數,為不影響整個系統的性能,定時器服務函數耗時越少越好。
uOSBase_t OSTimerStart(OSTimerHandle_t const TimerHandle)

定時器創建完畢後並不會自動啟動,需要用戶顯示的調用啟動函數OSTimerStart(),之後定時器才會生效。參數TimerHandle為定時器句柄,為定時器創建函數OSTimerCreate()的返回值;
uOSBase_t OSTimerStop(OSTimerHandle_t const TimerHandle)

定時啟動後,用戶可以通過接口函數OSTimerStop()停止定時。參數TimerHandle為定時器句柄,為定時器創建函數OSTimerCreate()的返回值;

簡單示例程序

下面是采用實時��入式操作系統SmallRTOS實現的多任務處理演示示例,主要包括任務創建、信號量創建、任務延時等功能。代碼如下:
OSTaskHandle_t HWTaskHandle = NULL;
OSTaskHandle_t GBTaskHandle = NULL;
OSSemHandle_t GBSemaphoreHandle = NULL;

void TaskHelloWorld( void *pvParameters );
void TaskGoodBye( void *pvParameters );

int main( void )
{
GBSemaphoreHandle = OSSemCreate();

// configure and start tasks
HWTaskHandle = OSTaskCreate(TaskHelloWorld, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "HW");
GBTaskHandle = OSTaskCreate(TaskGoodBye, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+2, "GB");

/* Start the tasks and timer running. */
OSStart();
for( ;; );
return 0;
}

void TaskHelloWorld( void *pvParameters )
{
/* Remove compiler warning about unused parameter. */
( void ) pvParameters;
for( ;; )
{
OSSemPost(GBSemaphoreHandle);
OSTaskSleep(200*OSTICKS_PER_MS);
}
}

void TaskGoodBye( void *pvParameters )
{
/* Remove compiler warning about unused parameter. */
( void ) pvParameters;
for( ;; )
{
OSSemPend(GBSemaphoreHandle, OSPEND_FOREVER_VALUE);
}
}

Copyright © Linux教程網 All Rights Reserved