1 列表和列表項

2021-09-23 14:31:57 字數 3419 閱讀 1328

列表

列表是乙個資料結構,用來追蹤任務,列表中有乙個指標指向列表項

列表是乙個結構體,內部攜帶乙個指標,指標指向列表項,列表項形成雙向鏈式結構掛載在列表下

乙個列表下面可以有很多的列表項,每個列表項都會有乙個指標指向這個列表,下面是乙個列表

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 列表和列表項原始碼分析

前面在排程器啟動之前先建立了兩個任務,乙個啟動任務乙個空閒任務,然後排程器會跳到啟動任務去執行。在分析任務建立的原始碼之前,需要先分析一下列表和列表項,建立任務實際上就是初始化任務的各個成員變數 即初始化任務控制塊的成員 在初始化完後這個任務就會進入到就緒狀態,等待排程器來執行它,其中任務控制塊就有...