1、freeRTOS的任務(wù)
(1)任務(wù)的狀態(tài)
任務(wù)在運(yùn)行過程中,可能有以下幾種狀態(tài):
1)運(yùn)行態(tài)。任務(wù)當(dāng)前正在運(yùn)行中,占有cpu的使用權(quán)。
2)就緒態(tài)。滿足了運(yùn)行條件,但是當(dāng)前沒有運(yùn)行,可能是有高優(yōu)先級(jí)任務(wù)在執(zhí)行或者在中斷,處于等待獲得cpu使用權(quán)然后運(yùn)行的狀態(tài)中。
3)阻塞態(tài)。在某些條件下被阻塞了,不能得到運(yùn)行。比如等待某些信號(hào)量,消息隊(duì)列或者調(diào)用了延遲函數(shù)。
4)掛起態(tài)。任務(wù)被通過調(diào)用掛起操作被終止執(zhí)行了,直到被從掛起狀態(tài)中恢復(fù)為止,否則將一直處于掛起的狀態(tài)中。
(2)任務(wù)的優(yōu)先級(jí)
freeRTOS的任務(wù)優(yōu)先級(jí)是數(shù)值越大,任務(wù)的優(yōu)先級(jí)越高。
freeRTOS 中任務(wù)的最高優(yōu)先級(jí)是通過 **FreeRTOSConfig.h **文件中的
configMAX_PRIORITIES
進(jìn)行配置的,用戶實(shí)際可以使用的優(yōu)先級(jí)范圍是:
0 到 configMAX_PRIORITIES – 1。
2、freeRTOS的任務(wù)切換的實(shí)現(xiàn)
(1)PendSV中斷
freeRTOS系統(tǒng)的任務(wù)切換的具體過程最終都是在pendSV中斷服務(wù)函數(shù)里面完成的。
** PendSV是一種不精確的異常處理,優(yōu)先級(jí)和掛起狀態(tài)可以通過編程實(shí)現(xiàn),一般在實(shí)時(shí)操作系統(tǒng)中PendSV**的優(yōu)先級(jí)都會(huì)被設(shè)置為最低,在其他所有的異常中斷處理完以后才執(zhí)行,對(duì)上下文的切換非常有用,在OS設(shè)計(jì)中也是屬于非常關(guān)鍵的。
在freeRTOS系統(tǒng)中,執(zhí)行上下文切換依靠的是任務(wù)調(diào)度器。上下文切換被觸發(fā)的場合可以有:
1> 執(zhí)行一個(gè)系統(tǒng)調(diào)用。如:任務(wù)切換函數(shù)taskYIELD()、延時(shí)vTaskDelay()。
2> Systick中斷。
(2)Systick中斷
** Systick**中斷服務(wù)函數(shù)中會(huì)進(jìn)行任務(wù)切換。
3、freeRTOS的任務(wù)管理的API函數(shù)
3.1、FreeRTOS任務(wù)創(chuàng)建
在freeRTOS中,可以根據(jù)實(shí)際使用的需要?jiǎng)?chuàng)建一定數(shù)量的任務(wù)(線程),任務(wù)只有被成功創(chuàng)建了,才有可能被執(zhí)行到。
在FreeRTOS實(shí)時(shí)操作系統(tǒng)中,創(chuàng)建任務(wù)可以使用如下的API:
portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
unsigned portBASE_TYPE uxPriority,
xTaskHandle *pvCreatedTask
);
函數(shù)參數(shù)說明:
pvTaskCode:指向任務(wù)入口函數(shù)的指針。即任務(wù)函數(shù)。
pcName:任務(wù)的描述。一般都是為了調(diào)試方便而使用的。由 tskMAX_TASK_NAME_LEN 定義的最大長度,默認(rèn)為 16。
usStackDepth:任務(wù)堆棧的大小。不是字節(jié)數(shù)而是以字為單位。例如,如果堆棧為 16 位寬,并且 usStackDepth 定義為 100,則將分配 200 個(gè)字節(jié)用于堆棧存儲(chǔ)。
pvParameters:任務(wù)的參數(shù)的指針??梢韵騽?chuàng)建的任務(wù)中傳入?yún)?shù),不需要傳送參數(shù)可以選NULL。
uxPriority:任務(wù)運(yùn)行的優(yōu)先級(jí)。
pvCreatedTask:任務(wù)的句柄,通過該句柄引用創(chuàng)建的任務(wù)。
返回值:
任務(wù)創(chuàng)建成功返回 pdPASS;創(chuàng)建失敗返回 pdFAIL。
創(chuàng)建一個(gè)任務(wù)的示例如下:
xTaskCreate((TaskFunction_t )Start_Task, //任務(wù)函數(shù)
(const char* )"Start_Task", //任務(wù)名稱
(uint16_t )128, //任務(wù)堆棧大小
(void * )NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t )5, //任務(wù)優(yōu)先級(jí)
(TaskHandle_t * )&StartTask_Handler); //任務(wù)句柄
注意:
任務(wù)的優(yōu)先級(jí)要根據(jù) **FreeRTOSConfig.h **文件中的
configMAX_PRIORITIES
進(jìn)行設(shè)置的,可以使用的優(yōu)先級(jí)范圍是 0 到 configMAX_PRIORITIES – 1,如果創(chuàng)建的任務(wù)所選的任務(wù)優(yōu)先級(jí)超過了這個(gè)設(shè)置的范圍,會(huì)被忽略掉,不會(huì)被執(zhí)行。
3.2、FreeRTOS任務(wù)掛起
當(dāng)任務(wù)在系統(tǒng)運(yùn)行過程中,因?yàn)槟承l件或者有其他的更加重要的事情要做的時(shí)候,可以考慮把某些任務(wù)先掛起,等候條件到達(dá)之后再恢復(fù)任務(wù)繼續(xù)調(diào)度運(yùn)行。
掛起任務(wù)的函數(shù)為:
void vTaskSuspend( xTaskHandle pxTaskToSuspend )
參數(shù):
pxTaskToSuspend:需要被掛起的任務(wù)的優(yōu)先級(jí)
返回值:無
要使用這個(gè)函數(shù),需要在 FreeRTOSConfig.h中將宏定義 INCLUDE_vTaskSuspend 定義為 1,如下:
此外,如果要掛起、恢復(fù)整個(gè)系統(tǒng)所有的任務(wù),freeRTOS也提供了一個(gè)API函數(shù),如下:
void vTaskSuspendAll( void ) // 掛起所有的任務(wù)
BaseType_t xTaskResumeAll( void ) // 恢復(fù)所有被掛起的任務(wù)
要恢復(fù)某個(gè)被掛起的任務(wù),可以使用函數(shù):
void vTaskResume( xTaskHandle pxTaskToResume )
參數(shù):
pxTaskToResume:任務(wù)的優(yōu)先級(jí)
3.3、FreeRTOS任務(wù)刪除
如果有某些任務(wù)只是需要存在于某些條件,當(dāng)條件滿足之后就不再需要這個(gè)任務(wù)參與運(yùn)行,這個(gè)時(shí)候可以選擇刪除掉這個(gè)任務(wù),釋放該任務(wù)所占用的堆??臻g。
刪除任務(wù)可以使用函數(shù):
void vTaskDelete( xTaskHandle pxTask )
參數(shù):
pxTask:需要被刪除的任務(wù)句柄
返回值:無
注意:要使用這個(gè)函數(shù),需要將宏定義 INCLUDE_vTaskDelete 設(shè)置為 1 。
4、freeRTOS的內(nèi)核管理函數(shù)
4.1、獲取任務(wù)的優(yōu)先級(jí)
如果運(yùn)行過程中需要知道當(dāng)前運(yùn)行的任務(wù)的優(yōu)先級(jí),可以調(diào)用優(yōu)先級(jí)獲取函數(shù)得到任務(wù)的優(yōu)先級(jí):
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )
參數(shù):
pxTask:需要獲取優(yōu)先級(jí)的任務(wù)的句柄。
返回值:
句柄對(duì)應(yīng)的任務(wù)的優(yōu)先級(jí)。
4.2、修改任務(wù)的優(yōu)先級(jí)
任務(wù)在運(yùn)行過程中,優(yōu)先級(jí)希望能被改變成其他的優(yōu)先級(jí),可以使用函數(shù):
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )
參數(shù):
pxTask:任務(wù)的句柄。
uxNewPriority:需要修改的新的優(yōu)先級(jí)的值。
5、freeRTOS的延時(shí)函數(shù)
5.1、相對(duì)延時(shí)函數(shù)
void vTaskDelay(const TickType_t TicksToDelay)
5.2、絕對(duì)延時(shí)函數(shù)
void vTaskDelayUntil(
TickType_t* const pxPreviousWakeTime,
const TickType_t xTimeIncrement
)
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62181 -
中斷服務(wù)
+關(guān)注
關(guān)注
0文章
9瀏覽量
6847
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論