1、freeRTOS的任務
(1)任務的狀態(tài)
任務在運行過程中,可能有以下幾種狀態(tài):
1)運行態(tài)。任務當前正在運行中,占有cpu的使用權(quán)。
    2)就緒態(tài)。滿足了運行條件,但是當前沒有運行,可能是有高優(yōu)先級任務在執(zhí)行或者在中斷,處于等待獲得cpu使用權(quán)然后運行的狀態(tài)中。
    3)阻塞態(tài)。在某些條件下被阻塞了,不能得到運行。比如等待某些信號量,消息隊列或者調(diào)用了延遲函數(shù)。
    4)掛起態(tài)。任務被通過調(diào)用掛起操作被終止執(zhí)行了,直到被從掛起狀態(tài)中恢復為止,否則將一直處于掛起的狀態(tài)中。
(2)任務的優(yōu)先級
freeRTOS的任務優(yōu)先級是數(shù)值越大,任務的優(yōu)先級越高。
freeRTOS 中任務的最高優(yōu)先級是通過 **FreeRTOSConfig.h **文件中的
configMAX_PRIORITIES
進行配置的,用戶實際可以使用的優(yōu)先級范圍是:
0 到 configMAX_PRIORITIES – 1。
2、freeRTOS的任務切換的實現(xiàn)
(1)PendSV中斷
freeRTOS系統(tǒng)的任務切換的具體過程最終都是在pendSV中斷服務函數(shù)里面完成的。
** PendSV是一種不精確的異常處理,優(yōu)先級和掛起狀態(tài)可以通過編程實現(xiàn),一般在實時操作系統(tǒng)中PendSV**的優(yōu)先級都會被設置為最低,在其他所有的異常中斷處理完以后才執(zhí)行,對上下文的切換非常有用,在OS設計中也是屬于非常關鍵的。
在freeRTOS系統(tǒng)中,執(zhí)行上下文切換依靠的是任務調(diào)度器。上下文切換被觸發(fā)的場合可以有:
1> 執(zhí)行一個系統(tǒng)調(diào)用。如:任務切換函數(shù)taskYIELD()、延時vTaskDelay()。
2> Systick中斷。
(2)Systick中斷
** Systick**中斷服務函數(shù)中會進行任務切換。
3、freeRTOS的任務管理的API函數(shù)

3.1、FreeRTOS任務創(chuàng)建
在freeRTOS中,可以根據(jù)實際使用的需要創(chuàng)建一定數(shù)量的任務(線程),任務只有被成功創(chuàng)建了,才有可能被執(zhí)行到。
    在FreeRTOS實時操作系統(tǒng)中,創(chuàng)建任務可以使用如下的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:指向任務入口函數(shù)的指針。即任務函數(shù)。
    pcName:任務的描述。一般都是為了調(diào)試方便而使用的。由 tskMAX_TASK_NAME_LEN 定義的最大長度,默認為 16。
    usStackDepth:任務堆棧的大小。不是字節(jié)數(shù)而是以字為單位。例如,如果堆棧為 16 位寬,并且 usStackDepth 定義為 100,則將分配 200 個字節(jié)用于堆棧存儲。
    pvParameters:任務的參數(shù)的指針。可以向創(chuàng)建的任務中傳入?yún)?shù),不需要傳送參數(shù)可以選NULL。
    uxPriority:任務運行的優(yōu)先級。
    pvCreatedTask:任務的句柄,通過該句柄引用創(chuàng)建的任務。
返回值:
    任務創(chuàng)建成功返回 pdPASS;創(chuàng)建失敗返回 pdFAIL。
創(chuàng)建一個任務的示例如下:
xTaskCreate((TaskFunction_t )Start_Task,            //任務函數(shù)
            (const char*    )"Start_Task",          //任務名稱
            (uint16_t       )128,                   //任務堆棧大小
            (void *         )NULL,                  //傳遞給任務函數(shù)的參數(shù)
            (UBaseType_t    )5,                     //任務優(yōu)先級
            (TaskHandle_t * )&StartTask_Handler);   //任務句柄
注意:
任務的優(yōu)先級要根據(jù) **FreeRTOSConfig.h **文件中的
configMAX_PRIORITIES
進行設置的,可以使用的優(yōu)先級范圍是 0 到 configMAX_PRIORITIES – 1,如果創(chuàng)建的任務所選的任務優(yōu)先級超過了這個設置的范圍,會被忽略掉,不會被執(zhí)行。
3.2、FreeRTOS任務掛起
當任務在系統(tǒng)運行過程中,因為某些條件或者有其他的更加重要的事情要做的時候,可以考慮把某些任務先掛起,等候條件到達之后再恢復任務繼續(xù)調(diào)度運行。
掛起任務的函數(shù)為:
void vTaskSuspend( xTaskHandle pxTaskToSuspend )
參數(shù):
    pxTaskToSuspend:需要被掛起的任務的優(yōu)先級
返回值:無
要使用這個函數(shù),需要在 FreeRTOSConfig.h中將宏定義 INCLUDE_vTaskSuspend 定義為 1,如下:

此外,如果要掛起、恢復整個系統(tǒng)所有的任務,freeRTOS也提供了一個API函數(shù),如下:
void vTaskSuspendAll( void )    // 掛起所有的任務
BaseType_t xTaskResumeAll( void )  // 恢復所有被掛起的任務
要恢復某個被掛起的任務,可以使用函數(shù):
void vTaskResume( xTaskHandle pxTaskToResume )
參數(shù):
    pxTaskToResume:任務的優(yōu)先級
3.3、FreeRTOS任務刪除
如果有某些任務只是需要存在于某些條件,當條件滿足之后就不再需要這個任務參與運行,這個時候可以選擇刪除掉這個任務,釋放該任務所占用的堆??臻g。
    刪除任務可以使用函數(shù):
void vTaskDelete( xTaskHandle pxTask )
參數(shù):
pxTask:需要被刪除的任務句柄
返回值:無
注意:要使用這個函數(shù),需要將宏定義 INCLUDE_vTaskDelete 設置為 1 。
4、freeRTOS的內(nèi)核管理函數(shù)

4.1、獲取任務的優(yōu)先級
如果運行過程中需要知道當前運行的任務的優(yōu)先級,可以調(diào)用優(yōu)先級獲取函數(shù)得到任務的優(yōu)先級:
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )
 參數(shù):
     pxTask:需要獲取優(yōu)先級的任務的句柄。
 返回值:
     句柄對應的任務的優(yōu)先級。
4.2、修改任務的優(yōu)先級
任務在運行過程中,優(yōu)先級希望能被改變成其他的優(yōu)先級,可以使用函數(shù):
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )
參數(shù):
      pxTask:任務的句柄。
       uxNewPriority:需要修改的新的優(yōu)先級的值。
5、freeRTOS的延時函數(shù)
5.1、相對延時函數(shù)
void vTaskDelay(const TickType_t TicksToDelay)
5.2、絕對延時函數(shù)
void vTaskDelayUntil(
                        TickType_t* const pxPreviousWakeTime,
                        const TickType_t  xTimeIncrement
                    )
- 
                                函數(shù)
                                +關注
關注
3文章
4403瀏覽量
66599 - 
                                FreeRTOS
                                +關注
關注
14文章
496瀏覽量
66102 - 
                                中斷服務
                                +關注
關注
0文章
9瀏覽量
7066 
發(fā)布評論請先 登錄
轉(zhuǎn):第10章 FreeRTOS任務管理
STM32CUBE的freertos的任務創(chuàng)建
有什么方法可以查看FreeRTOS任務的運行狀態(tài)呢
淺析FreeRTOS任務系統(tǒng)
FreeRTOS任務通知相關資料分享
對FreeRTOS任務的使用
什么是多任務系統(tǒng)?FreeRTOS任務與協(xié)程簡析
FreeRTOS任務創(chuàng)建到閃存LED的基本應用程序
(一)FreeRTOS學習之FreeRTOS任務基礎知識
    
FreeRTOS高級篇4---FreeRTOS任務切換分析
    
FreeRTOS高級篇2---FreeRTOS任務創(chuàng)建分析
    
FreeRTOS系列第11篇---FreeRTOS任務控制
    
          
        
        
freeRTOS的任務
                
 
    
           
            
            
                
            
評論