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