FreeRTOS 列表和列表項原始碼分析

2021-09-10 14:28:25 字數 2836 閱讀 9381

前面在排程器啟動之前先建立了兩個任務,乙個啟動任務乙個空閒任務,然後排程器會跳到啟動任務去執行。在分析任務建立的原始碼之前,需要先分析一下列表和列表項,建立任務實際上就是初始化任務的各個成員變數(即初始化任務控制塊的成員),在初始化完後這個任務就會進入到就緒狀態,等待排程器來執行它,其中任務控制塊就有一項用於描述任務當前的狀態,這個狀態就是列表項,存放列表項的容器就是列表(鍊錶結構),前面提到就緒狀態,那這個任務的列表項就是放到就緒列表中,列表不止有就緒列表,因為任務可以有很多種狀態,包括就緒列表、延時列表、溢位延時列表、掛起列表、掛起就緒列表、等待刪除任務列表。排程器依據這個狀態列表項就可以得知任務當前的狀態,是不是要執行這個任務了,如果是將要執行的任務,就會將這個狀態列表項插入到就緒列表中,排程器會依據就緒列表中的列表項找出需要執行的任務。而其它列表的任務就繼續等待,等待合適的時機列表項被換到就緒列表中。關於任務建立的具體過程和任務排程器依據列表來切換任務的具體過程在後面章節再做分析,這章主要分析列表初始化和列表項插入列表等有關列表和列表項的過程。說了這麼多,記住列表就是鍊錶,而列表項就是存在於列表中的專案即可。

列表和列表項的原始碼在freertos原始碼主目錄下的list.c檔案中,有以下這些函式介面

void vlistinitialise( list_t * const pxlist )

void vlistinitialiseitem( listitem_t * const pxitem )

void vlistinsertend( list_t * const pxlist, listitem_t * const pxnewlistitem )

void vlistinsert( list_t * const pxlist, listitem_t * const pxnewlistitem )

ubasetype_t uxlistremove( listitem_t * const pxitemtoremove )

typedef struct xlist

list_t;

struct xlist_item

;typedef struct xlist_item listitem_t;

上面列表還提到了迷你列表項,迷你列表項是列表項的縮寫版,有時不需要那麼全的功能,使用迷你列表項的話能節省記憶體空間,上面列表的結束就使用的是迷你列表項來表示,定義如下:

struct xmini_list_item

;typedef struct xmini_list_item minilistitem_t;

下面就分析一下列表和列表項是如何初始化,如何將列表項插入列表中,以及怎麼從列表項中刪除列表的。

列表初始化

void vlistinitialise( list_t * const pxlist )

圖示如下:

列表項初始化

void vlistinitialiseitem( listitem_t * const pxitem )

往列表中插入列表項

void vlistinsert( list_t * const pxlist, listitem_t * const pxnewlistitem )

else }

/* 將原先位置的後一項放到新項的後面 */

pxnewlistitem->pxnext = pxiterator->pxnext;

/* 將原先位置後一項的前一項改為新項 */

pxnewlistitem->pxnext->pxprevious = pxnewlistitem;

/* 將新項的前一項指向原先位置 */

pxnewlistitem->pxprevious = pxiterator;

/* 將原先位置後一項指向新項 */

pxiterator->pxnext = pxnewlistitem;

/* 初始化新項屬於要插入的列表 */

pxnewlistitem->pxcontainer = pxlist;

/* 列表的列表項數量遞增 */

( pxlist->uxnumberofitems )++;

}

往列表末尾插入列表項

void vlistinsertend( list_t * const pxlist, listitem_t * const pxnewlistitem )

圖示如下:

從列表中刪除列表項

ubasetype_t uxlistremove( listitem_t * const pxitemtoremove )

else

/* 由於已經刪除了,所以該列表項不屬於任務列表了 */

pxitemtoremove->pxcontainer = null;

/* 列表的列表項數量遞減 */

( pxlist->uxnumberofitems )--;

/* 返回該列表的列表項數量 */

return pxlist->uxnumberofitems;

}

FreeRTOS筆記 列表和列表項

1.列表結構體 2.minilistitem t的結構體 3.列表項 4.列表初始化 1.列表初始化時,列表是空的,因此列表的pxindex是指向列表的尾的 2 3 4 初始化列表的xlistend 5 列表的列表項的數目為0 初始化完成功能以後,列表如下所示 5.初始化列表項 1.此列表項暫時不屬...

FreeRTOS列表與列表項分析

本部落格中部分,來自 freertos開發手冊 正點原子 列表與列表項是freertos中的之中的資料結構。列表的底層實際是使用鍊錶實現的。乙個簡單的列表與列表項如下圖 需要注意的是,列表並不是鍊錶,也不是列表項的集合,而是乙個結構體。列表的定義如下 typedef struct xlist lis...

FreeRTOS之列表與列表項

uxnumberofitems 記錄列表項的數量 pxindex 記錄當前列表項的索引號 xlistend 表示列表的結束 xitemvalue 列表項的值 pxnext 指向下乙個列表項 pxprevious 指向上乙個列表項 pvowner 記錄當前列表歸 誰 所有 pvcontainer 記錄...