列表
列表是乙個資料結構,用來追蹤任務,列表中有乙個指標指向列表項
列表是乙個結構體,內部攜帶乙個指標,指標指向列表項,列表項形成雙向鏈式結構掛載在列表下
乙個列表下面可以有很多的列表項,每個列表項都會有乙個指標指向這個列表,下面是乙個列表
typedef struct xlist
list_t;
listfirst_list_integrity_check_value與listsecond_list_integrity_check_value用於檢測列表的完整性,使能後自動新增變數
uxnumberofitems:記錄列表中列表項的數量
xlistend:列表中的最後乙個列表項,用來表示列表結束,是乙個閹割版的列表項,迷你列表項(不要不必要的東西)
列表初始化
void vlistinitialise( list_t * const pxlist )
初始化列表,由於列表項的數量為0,所以大多數據被初始化為0,各種指標指向xlistend,也就是列表中的迷你列表項,也是雙向列表的首尾
列表項
struct xlist_item
;typedef struct xlist_item listitem_t;
listfirst_list_item_integrity_check_value與listsecond_list_item_integrity_check_value用於檢測列表項的完整性
xitemvalue:當前列表項掛載的位置,記錄列表項在鍊錶中的位置(xlistend是0)
pvowner:記錄列表項的擁有者(歸屬tcb)
pvcontainer:記錄列表項歸屬列表(就緒,阻塞列表)
迷你列表項
列表項的閹割版(主要是節省資源),作為列表下掛列表項的頭和尾
struct xmini_list_item // 一般是xendlist
;typedef struct xmini_list_item minilistitem_t;
listfirst_list_item_integrity_check_value用於檢測迷你列表項的完整
xitemvalue:用於記錄列表項值
列表項初始化
void vlistinitialiseitem( listitem_t * const pxitem )
列表項插入
末尾插入
找到列表項最後一項,也就是xlistend的previous指標指向列表項
步驟:1、移動列表項指標,找到列表最終列表項的項值(xlistend是首也是尾,最後乙個列表項就是(xlistend - 1))
2、改變新插入列表項的指標,previous指向(xlistend - 1)與next指向(xlistend )
3、改變(xlistend - 1)的next指標
4、改變(xlistend)的previous指標(xlistend->privious 指向新插入的列表項)
5、標記列表項歸屬
6、列表的列表項數量自增(列表項的項值也要改變)
void vlistinsertend( list_t * const pxlist, listitem_t * const pxnewlistitem )// 指定列表項要插入哪個列表,以及要插入的列表項
相當於是在 xlistend 前面插入乙個新的列表項(改變 xlistend的pre指標)
一共需要改變四個指標,新插入的列表項的per和next指標,之(xlistend - 1)的next指標,xlistend的pre指標
pxindex 值是第0個列表項,也是最後乙個列表項(雙向列表) xlistend,通過next指標遍歷鍊錶
公升序插入
通過列表項項值xitemvalue比對,查詢插入位置
步驟:1、通過要插入的列表項的項值,找到要插入列表項的前乙個列表項( 項值 - 1)
2、改變(項值 - 1)的next指標,新插入列表項的previous指標,新插入列表項的next指標
3、改變(項值 + 1)的previous指標
4、標記新插入列表項歸屬列表
5、列表的列表項數量自增
void vlistinsert( list_t * const pxlist, listitem_t * const pxnewlistitem )
else }
pxnewlistitem->pxnext = pxiterator->pxnext; // 改變要插入列表項的 next 指標
pxnewlistitem->pxnext->pxprevious = pxnewlistitem; // 改變要插入列表項的 prev 指標
pxnewlistitem->pxprevious = pxiterator; //
pxiterator->pxnext = pxnewlistitem;
pxnewlistitem->pvcontainer = ( void * ) pxlist; // 通過pvcontainer標記列表項屬於哪個列表
( pxlist->uxnumberofitems )++; // 列表的列表項數目自增
}
刪除
步驟:1、設定要刪除列表項(項值 - 1)的next指標
2、設定要刪除列表項(項值 + 1)的previous指標
3、清空要刪除列表項的previous與next指標
4、清除列表項歸屬列表標記
5、列表項數量自減
void vlistdelete( list_t * const pxlist, listitem_t * const pxnewlistitem )
else
presentlistitem->pxprevious->pxnext = pxlist->pxindex; // 要刪除節點 前乙個的next指標
presentlistitem->pxnext->pxprevious = presentlistitem->pxprevious; // 要刪除節點 下乙個的prev指標
presentlistitem->pxnext = null; // 要刪除節點自己的指標
presentlistitem->pxprevious = null;
presentlistitem->pvcontainer = null;
pxlist->xitemvalue--;
}
任務的執行由系統來排程,為了排程任務每個任務都會定義乙個任務控制塊,這個任務控制塊相當於任務的身份證,儲存有任務的所有資訊
系統堆任務的全部操作都是通過任務控制塊來實現的
任務塊中的列表項,都標記有歸屬列表,通過列表可以遍歷所有的列表項
FreeRTOS筆記 列表和列表項
1.列表結構體 2.minilistitem t的結構體 3.列表項 4.列表初始化 1.列表初始化時,列表是空的,因此列表的pxindex是指向列表的尾的 2 3 4 初始化列表的xlistend 5 列表的列表項的數目為0 初始化完成功能以後,列表如下所示 5.初始化列表項 1.此列表項暫時不屬...
Python學習1 列表
str 轉換成字串 可以用來避免型別出錯 用方括號表示 列表是從0開始索引而不是1 del 刪除知道位置的元素不繼續使用該值 pop 刪除已知位置的元素並繼續使用該值 remove 刪除已知元素的值,也可以繼續使用該值,但是remove只能刪除一次,不能刪除重複的值,需要迴圈刪除 sort 對列表進...
FreeRTOS 列表和列表項原始碼分析
前面在排程器啟動之前先建立了兩個任務,乙個啟動任務乙個空閒任務,然後排程器會跳到啟動任務去執行。在分析任務建立的原始碼之前,需要先分析一下列表和列表項,建立任務實際上就是初始化任務的各個成員變數 即初始化任務控制塊的成員 在初始化完後這個任務就會進入到就緒狀態,等待排程器來執行它,其中任務控制塊就有...