微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS是一個(gè)源代碼開放的、易于移植的、面向深度嵌入式應(yīng)用的微內(nèi)核實(shí)時(shí)操作系統(tǒng),主要應(yīng)用領(lǐng)域?yàn)?a target="_blank">工業(yè)控制,智能傳感器開發(fā),智能終端,物聯(lián)網(wǎng)等。任何人在遵循SmallRTOS許可協(xié)議的前提下均可免費(fèi)使用該嵌入式實(shí)時(shí)操作系統(tǒng)。最新版本源代碼及示例工程的發(fā)布網(wǎng)站為:
下載到SmallRTOS的源代碼壓縮包后,進(jìn)行解壓,可以看到SmallRTOS的目錄結(jié)構(gòu)如下:
Kernel: 存放SmallRTOS的內(nèi)核文件OS及和CPU相關(guān)的移植文件;
Demo: 存放SmallRTOS提供的示例文件;
Doc:存放SmallRTOS相關(guān)說(shuō)明/教程文檔;
License:存放SmallRTOS使用許可;
微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS在設(shè)計(jì)時(shí),其文件命名、函數(shù)名及變量命名由專用的前綴進(jìn)行區(qū)分:前綴為OS,表示為SmallRTOS的內(nèi)核,這些是與平臺(tái)無(wú)關(guān)的內(nèi)核部分,在進(jìn)行跨平臺(tái)移植時(shí),無(wú)需更改;前綴為Fit,表示為硬件(芯片類型等)相關(guān)的部分,在進(jìn)行移植時(shí),這一部分的文件、函數(shù)及變量需要根據(jù)硬件平臺(tái)(芯片類型等)進(jìn)行適當(dāng)?shù)恼{(diào)整;
微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS是多任務(wù)搶占式操作系統(tǒng),高優(yōu)先級(jí)任務(wù)可以搶先執(zhí)行,體現(xiàn)了操作系統(tǒng)的實(shí)時(shí)性。在SmallRTOS系統(tǒng)中,優(yōu)先級(jí)0為最低優(yōu)先級(jí),該優(yōu)先級(jí)為SmallRTOS系統(tǒng)的保留優(yōu)先級(jí),作為空閑任務(wù)OSIdleTask的專用優(yōu)先級(jí),用戶創(chuàng)建的任務(wù)無(wú)法使用。除此之外的優(yōu)先級(jí),用戶可以根據(jù)任務(wù)的重要程度自行分配使用。優(yōu)先級(jí)高的任務(wù)會(huì)搶先執(zhí)行。
為了突顯嵌入式操作系統(tǒng)配置的靈活性,在SmallRTOS系統(tǒng)設(shè)計(jì)之初就進(jìn)行了全面的考量,部分參數(shù)采用了宏定義的方式進(jìn)行配置。每個(gè)任務(wù)均有自己的名稱及優(yōu)先級(jí),任務(wù)名稱長(zhǎng)度最大為OSNAME_MAX_LEN, 該變量是一個(gè)宏定義,超出該最大長(zhǎng)度的名稱會(huì)自動(dòng)舍棄,默認(rèn)為10個(gè)字符。任務(wù)優(yōu)先級(jí)的定義為OSTASK_MAX_PRIORITY, 這是一個(gè)非常重要的參數(shù),系統(tǒng)默認(rèn)值為10。
Ticks經(jīng)常被稱為時(shí)鐘滴答,是SmallRTOS系統(tǒng)中最小的時(shí)間單位,這個(gè)參數(shù)可以根據(jù)硬件平臺(tái)的性能進(jìn)行設(shè)置。在SmallRTOS系統(tǒng)中,該參數(shù)采用宏定義configTICK_RATE_HZ進(jìn)行配置。在SmallRTOS提供的大部分示例工程中,均配置的為1000Hz,即每個(gè)時(shí)鐘滴答間隔是1毫秒,該參數(shù)會(huì)影響SmallRTOS系統(tǒng)對(duì)任務(wù)的控制精度。系統(tǒng)調(diào)度器啟動(dòng)后,會(huì)按照任務(wù)的優(yōu)先級(jí)進(jìn)行執(zhí)行,直至該任務(wù)讓出執(zhí)行權(quán)或者被更高級(jí)的任務(wù)搶斷。如果沒(méi)有符合條件的任務(wù)需要執(zhí)行,則運(yùn)行系統(tǒng)中預(yù)留的OSIdleTask(空閑任務(wù))。
在SmallRTOS系統(tǒng)中,除了相關(guān)參數(shù)采用宏定義進(jìn)行配置之外,功能模塊也采用宏定義進(jìn)行配置。其中宏定義OS_SEMAPHORE_ON表示是否啟用信號(hào)量(Semaphore,又稱作旗語(yǔ))功能模塊,若定義為1,則表示啟用信號(hào)量(Semaphore,又稱作旗語(yǔ))功能模塊,若定義為0,則該功能模塊不被啟用;宏定義OS_MSGQ_ON表示是否啟用消息隊(duì)列,用法同OS_SEMAPHORE_ON;宏定義OS_MUTEX_ON表示是否啟用互斥信號(hào)量,用法同OS_SEMAPHORE_ON;
下面是微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS中經(jīng)常用到的接口函數(shù),供大家使用時(shí)參考;
一、系統(tǒng)中任務(wù)相關(guān)的API函數(shù)
OSTaskHandle_t OSTaskCreate(OSTaskFunction_t pxTaskFunction,
void* pvParameter,
const uOS16_t usStackDepth,
uOSBase_t uxPriority,
sOS8_t* pcTaskName);
OSTaskCreate為微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS的任務(wù)創(chuàng)建函數(shù),其中參數(shù)OSTaskFunction_t pxTaskFunction為任務(wù)函數(shù),該任務(wù)函數(shù)類型定義為void TaskFunction( void *pParameters );任務(wù)函數(shù)中的參數(shù)void *pParameters 亦即OSTaskCreate的第二個(gè)參數(shù);第三個(gè)參數(shù)為任務(wù)的??臻gusStackDepth,??臻g需要根據(jù)任務(wù)占用的空間多少進(jìn)行調(diào)整;第四個(gè)參數(shù)為任務(wù)的優(yōu)先級(jí),除最低優(yōu)先級(jí)0為系統(tǒng)保留外,均可使用。第五個(gè)參數(shù)為任務(wù)名字,任務(wù)名字也就是任務(wù)的標(biāo)簽,主要方便在調(diào)試時(shí)區(qū)分不同的任務(wù)。
函數(shù)OSTaskCreate的返回值為OSTaskHandle_t類型的任務(wù)句柄,該句柄可以被其它系統(tǒng)函數(shù)調(diào)用,以設(shè)置或控制任務(wù)的狀態(tài);
void OSTaskSleep(uOS32_t uxWatiTicks);
OSTaskSleep為微型嵌入式實(shí)時(shí)操作系統(tǒng)SmallRTOS系統(tǒng)中任務(wù)延遲執(zhí)行設(shè)置函數(shù),通過(guò)此函數(shù),可以把當(dāng)前任務(wù)休眠若干毫秒的時(shí)間。參數(shù)uOS32_t uxWatiTicks代表休眠的時(shí)間長(zhǎng)短,單位為Ticks,用戶可以通過(guò)OSTICKS_PER_MS把毫秒轉(zhuǎn)換為Ticks計(jì)數(shù);
void OSTaskYield()
OSTaskYield函數(shù)為SmallRTOS中的任務(wù)控制類函數(shù),在任務(wù)中調(diào)用,用于讓出當(dāng)前任務(wù)的執(zhí)行權(quán),并切換到下一個(gè)處于eTaskStateReady狀態(tài)的任務(wù);函數(shù)OSTaskYield并不改變?nèi)蝿?wù)的狀態(tài),只是把當(dāng)前正在執(zhí)行的任務(wù)排列到狀態(tài)為eTaskStateReady的任務(wù)隊(duì)列的隊(duì)尾,若只有當(dāng)前任務(wù)處于eTaskStateReady狀態(tài),則仍然執(zhí)行當(dāng)前任務(wù);
uOS16_t OSStart( void )
函數(shù)OSStart為OSStartScheduler()函數(shù)的宏定義,OSStartScheduler()函數(shù)是SmallRTOS中的任務(wù)調(diào)度啟動(dòng)函數(shù);在該函數(shù)中,系統(tǒng)會(huì)設(shè)置空閑任務(wù)OSIdleTask及時(shí)鐘中斷;OSIdleTask任務(wù)為系統(tǒng)空閑任務(wù),若系統(tǒng)當(dāng)前沒(méi)有需要執(zhí)行的任務(wù),則會(huì)調(diào)用該空閑任務(wù),空閑任務(wù)可以用于統(tǒng)計(jì)當(dāng)前系統(tǒng)的利用率,及釋放處于待刪除狀態(tài)任務(wù)的資源;時(shí)鐘中斷則為系統(tǒng)的ticks配置,整個(gè)系統(tǒng)的運(yùn)行即依賴此ticks驅(qū)動(dòng)運(yùn)行;
二、任務(wù)同步信號(hào)量相關(guān)的API函數(shù)
OSSemHandle_t OSSemCreate()
函數(shù)OSSemCreate為信號(hào)量(Semaphore)創(chuàng)建函數(shù),用于創(chuàng)建任務(wù)間同步操作的信號(hào)量。信號(hào)量創(chuàng)建后,默認(rèn)有效信號(hào)量計(jì)數(shù)值為0,表示該信號(hào)量無(wú)有效信號(hào),對(duì)應(yīng)的OSSemPend函數(shù)處于阻塞狀態(tài),等待有效信號(hào);其返回值為OSSemHandle_t類型的句柄,方便用于對(duì)該信號(hào)量的操控;
sOSBase_t OSSemPend( OSSemHandle_t SemHandle, uOSTick_t xTicksToWait)
函數(shù)OSSemPend為信號(hào)量等待函數(shù),在任務(wù)執(zhí)行函數(shù)中調(diào)用,用于等待相關(guān)同步的信號(hào)量;參數(shù)OSSemHandle_t SemHandle為信號(hào)量句柄,參數(shù)uOSTick_t xTicksToWait為任務(wù)阻塞時(shí)間,單位為Tick數(shù),若設(shè)置為OSPEND_FORVER_VALUE,則會(huì)永遠(yuǎn)阻塞,直至指定信號(hào)量SemHandle獲取到有效信號(hào);
sOSBase_t OSSemPost( OSSemHandle_t SemHandle)
函數(shù)OSSemPost用于向指定信號(hào)量發(fā)送有效信號(hào),使處于等待該信號(hào)量的任務(wù)獲取同步信號(hào),以便恢復(fù)執(zhí)行。注:此函數(shù)不能在中斷服務(wù)函數(shù)中調(diào)用。
sOSBase_t OSSemPostFromISR( OSSemHandle_t SemHandle )
函數(shù)OSSemPostFromISR用于向指定信號(hào)量發(fā)送有效信號(hào),使處于等待該信號(hào)量的任務(wù)獲取同步信號(hào),以便恢復(fù)執(zhí)行。注:此函數(shù)只能在中斷服務(wù)函數(shù)中調(diào)用。
三、任務(wù)同步消息相關(guān)的API函數(shù)
OSMsgQHandle_t OSMsgQCreate( const uOSBase_t uxQueueLength, const uOSBase_t uxItemSize)
函數(shù)OSMsgQCreate為消息隊(duì)列的創(chuàng)建函數(shù),用于創(chuàng)建任務(wù)間同步操作的消息隊(duì)列,參數(shù)uxQueueLength為消息隊(duì)列中的消息數(shù)的容量(消息數(shù)目超過(guò)此容量,則發(fā)送任務(wù)掛起,直到消息隊(duì)列有空閑位置),第二個(gè)參數(shù)uxItemSize為單個(gè)消息的長(zhǎng)度。其返回值為OSMsgQHandle_t類型的消息隊(duì)列句柄,方便對(duì)消息隊(duì)列的操控;
sOSBase_t OSMsgQReceive( OSMsgQHandle_t MsgQHandle, void * const pvBuffer, uOSTick_t xTicksToWait)
函數(shù)OSMsgQReceive用于在任務(wù)中接收指定消息隊(duì)列的消息,在任務(wù)執(zhí)行函數(shù)中調(diào)用;該函數(shù)為任務(wù)阻塞函數(shù)。參數(shù)MsgQHandle為消息隊(duì)列句柄, 參數(shù)pvBuffer表示消息的指針,參數(shù)xTicksToWait為消息隊(duì)列等待接收時(shí)間,單位為Tick,若設(shè)置為OSPEND_FORVER_VALUE,則會(huì)永遠(yuǎn)等待,直至指定消息隊(duì)列MsgQHandle獲取到有效消息為止。函數(shù)返回值代表消息接收狀態(tài),若為FALSE則未接收到有效消息,若為TRUE則接收到有效消息;
sOSBase_t OSMsgQReceiveFromISR( OSMsgQHandle_t MsgQHandle, void * const pvBuffer)
函數(shù)OSMsgQReceiveFromISR用于在中斷函數(shù)中接收指定消息隊(duì)列的消息;參數(shù)MsgQHandle為消息隊(duì)列句柄, 參數(shù)pvBuffer表示消息的指針,該函數(shù)不會(huì)阻塞。函數(shù)返回值代表消息接收狀態(tài),若為FALSE則未接收到有效消息,若為TRUE則接收到有效消息;注:此函數(shù)只能在中斷服務(wù)函數(shù)中調(diào)用。
sOSBase_t OSMsgQSend( OSMsgQHandle_t MsgQHandle, const void * const pvItemToQueue, uOSTick_t xTicksToWait)
函數(shù)OSMsgQSend用于向指定的消息隊(duì)列發(fā)送消息,使處于等待該消息的任務(wù)獲取同步消息,并恢復(fù)執(zhí)行,其中參數(shù)MsgQHandle表示消息隊(duì)列,參數(shù)pvItemToQueue表示消息地址(指針),參數(shù)xTicksToWait為消息發(fā)送等待接收時(shí)間,單位為Tick,若設(shè)置為OSPEND_FORVER_VALUE,則會(huì)永遠(yuǎn)等待,直至指定消息隊(duì)列MsgQHandle有空閑位置。函數(shù)返回值代表消息發(fā)送狀態(tài),若為FALSE則消息發(fā)送失敗,若為TRUE則消息發(fā)送成功;注:此函數(shù)不能在中斷服務(wù)函數(shù)中調(diào)用。
sOSBase_t OSMsgQSendFromISR( OSMsgQHandle_t MsgQHandle, const void * const pvItemToQueue)
函數(shù)OSMsgQSendFromISR用于向指定的消息隊(duì)列發(fā)送消息,使處于等待該消息的任務(wù)獲取同步消息,并恢復(fù)執(zhí)行,其中參數(shù)MsgQHandle表示消息隊(duì)列,參數(shù)pvItemToQueue表示消息地址(指針),如果消息隊(duì)列已滿,則函數(shù)不會(huì)阻塞,直接返回發(fā)送失敗信息。注:此函數(shù)只能在中斷服務(wù)函數(shù)中調(diào)用。
四、定時(shí)器相關(guān)的API函數(shù)
OSTimerHandle_t OSTimerCreate(OSTimerFunction_t Function, void* pvParameter, uOSBase_t uxPeriodicTimeMS, sOS8_t* pcName)
接口函數(shù)OSTimerCreate用于創(chuàng)建定時(shí)器。其中參數(shù)Function為定時(shí)器的服務(wù)函數(shù),用于響應(yīng)定時(shí)器,函數(shù)OSTimerFunction_t的定義類型為void TimerFunction(void *pParameters )。pvParameter為定時(shí)器服務(wù)函數(shù)的參數(shù),不用時(shí)可以設(shè)置為NULL。參數(shù)uxPeriodicTimeMS為定時(shí)器的周期,單位為毫秒。參數(shù)pcName為定時(shí)器的名稱,方便區(qū)分不同的定時(shí)器;注意:定時(shí)器服務(wù)函數(shù)中禁止添加信號(hào)量等待、消息隊(duì)列等待等用于阻塞的函數(shù),為不影響整個(gè)系統(tǒng)的性能,定時(shí)器服務(wù)函數(shù)耗時(shí)越少越好。
uOSBase_t OSTimerStart(OSTimerHandle_t const TimerHandle)
定時(shí)器創(chuàng)建完畢后并不會(huì)自動(dòng)啟動(dòng),需要用戶顯示的調(diào)用啟動(dòng)函數(shù)OSTimerStart(),之后定時(shí)器才會(huì)生效。參數(shù)TimerHandle為定時(shí)器句柄,為定時(shí)器創(chuàng)建函數(shù)OSTimerCreate()的返回值;
uOSBase_t OSTimerStop(OSTimerHandle_t const TimerHandle)
定時(shí)啟動(dòng)后,用戶可以通過(guò)接口函數(shù)OSTimerStop()停止定時(shí)。參數(shù)TimerHandle為定時(shí)器句柄,為定時(shí)器創(chuàng)建函數(shù)OSTimerCreate()的返回值;
簡(jiǎn)單示例程序
下面是采用實(shí)時(shí)嵌入式操作系統(tǒng)SmallRTOS實(shí)現(xiàn)的多任務(wù)處理演示示例,主要包括任務(wù)創(chuàng)建、信號(hào)量創(chuàng)建、任務(wù)延時(shí)等功能。代碼如下:
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);
}
}
評(píng)論
查看更多