2021-05-12 14:32:11
微型嵌入式實時作業系統SmallRTOS常用介面函數
微型嵌入式實時作業系統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);
}
}
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-01/127488.htm
相關文章