1. 程式人生 > >FreeRTOS筆記(六)列表與任務控制塊

FreeRTOS筆記(六)列表與任務控制塊

文章目錄


上一文連結:FreeRTOS筆記(五)任務狀態

01 - 列表

  上一文提及到,任務具有多種狀態,例如就緒、執行、阻塞等等,如果有多個任務都處於某一狀態,例如就緒態,那麼這些任務就需要排隊等待處理,於是這些任務就組成了一個列表,一個簡單的列表看起來應該是這樣的。

  這個列表誰來建立、誰來使用?就是FreeRTOS系統,它負責建立、使用和維護列表,這個過程對開發人員是透明的,目的是實現多工併發進行。
  列表是被設計用來跟蹤任務,底層是一個數據結構,實際上是一個列表頭,它的定義如下:

typedef struct xLIST
{
    listFIRST_LIST_INTEGRITY_CHECK_VALUE                //檢查完整性
    configLIST_VOLATILE UBaseType_t uxNumberOfItems;    //該列表中有多少個列表項
    ListItem_t * configLIST_VOLATILE pxIndex;           //當前指向的列表
    MiniListItem_t xListEnd;                            //列表中最後一個列表項
    listSECOND_LIST_INTEGRITY_CHECK_VALUE               //檢查完整性
} List_t;

  其中指標ListItem_t*指向當前的列表項,迷你列表項MiniListItem_t用於表示列表的結束,概念上和連結串列頭類似,不過列表頭存放著更多的資訊。

列表 連結串列

  任務的每一個狀態都會有一個列表(執行態除外,因為每次只有一個執行態,不存在排隊),比如就緒態列表、阻塞態列表等等,FreeRTOS就是去管理這些列表,以達到多工的併發執行,可以在stasks.c中看到這些列表的建立:

//就緒列表和阻塞列表
PRIVILEGED_DATA static List_t pxReadyTasksLists[
configMAX_PRIORITIES ];//就緒列表 PRIVILEGED_DATA static List_t xDelayedTaskList1; //延遲列表1 PRIVILEGED_DATA static List_t xDelayedTaskList2; //延遲列表2 PRIVILEGED_DATA static List_t xPendingReadyList; //暫存列表 #if( INCLUDE_vTaskDelete == 1 ) PRIVILEGED_DATA static List_t xTasksWaitingTermination; //殭屍列表 #endif #if ( INCLUDE_vTaskSuspend == 1 ) PRIVILEGED_DATA static List_t xSuspendedTaskList; //掛起列表 #endif

  現在我們關心列表項是些什麼內容?列表項的定義如下:

struct xLIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           //檢查列表完整性
    configLIST_VOLATILE TickType_t xItemValue;          //列表值,用於排序
    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     //下一個列表項指標
    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //前一個列表項指標
    void * pvOwner;                                     //該列表項屬於哪一個TCB
    void * configLIST_VOLATILE pvContainer;             //該列表項屬於哪一個列表
    listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE          //檢查列表完整性
};
typedef struct xLIST_ITEM ListItem_t;                   //型別改名

/*迷你列表項*/
struct xMINI_LIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           //檢查列表完整性
    configLIST_VOLATILE TickType_t xItemValue;          //列表值,用於排序
    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     //下一個列表項指標
    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //前一個列表項指標
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;          //型別改名

  所謂的迷你列表項,其實就是少了幾個成員,因為迷你列表項表示列表的結束位置,不需要太多的成員。能夠看出,多個列表項其實組成了一個雙向連結串列,而列表頭中指向該雙向連結串列的某一個列表項和最後一個列表項,只要有列表頭,就可以實現增刪查改的功能,從而實現多工的併發執行

02 - 列表與任務控制塊

  列表項中一個非常重要的成員是pvOwner,它指向列表項所屬的任務控制塊TCB,何為TCB?簡單理解為儲存任務特性的結構,任務具有狀態、堆疊、優先順序等特性,這些特性需要儲存起來供系統使用,比如根據優先順序進行任務切換等等,儲存的結構就稱為TCB,TCB應該是作業系統中最大的一個結構體了,包含著非常多的資訊,列表和TCB的關係如下(部分指標沒有畫出,以免過亂):

03 - 總結

  • 任務狀態的每一次改變,都會進入對應的狀態列表
  • 列表的本質其實就是雙向連結串列,列表項的內容有TCB指標,next指標等
  • FreeRTOS負責維護和處理狀態列表以達到多工併發執行