列表和列表項

一、列表和列表項簡介

????????列表是 FreeRTOS 中的一個數據結構,列表被用來跟蹤 FreeRTOS中的任務(任務當前的狀態),列表項就是存放在列表中的項目

????????列表相當于鏈表,列表項相當于節點,FreeRTOS 中的列表是一個雙向循環鏈表 ?

????????列表項間的地址非連續的,列表項的數目隨時可以改變

????????列表項的指向前一個、后一個指針,就相當于人的左右手,整個列表就相當于N個人互相拉著手,圍成一個圈,而列表是管理這個圈

? ? ? ??

二、 列表與列表項

2.1 列表結構體

typedef struct xLIST
{listFIRST_LIST_INTEGRITY_CHECK_VALUE		    /* 校驗值 */volatile UBaseType_t uxNumberOfItems;			/* 列表中的列表項數量 */ListItem_t * configLIST_VOLATILE pxIndex		/* 用于遍歷列表項的指針 */MiniListItem_t xListEnd					    /* 末尾列表項 */listSECOND_LIST_INTEGRITY_CHECK_VALUE		    /* 校驗值 */
} List_t;

成員說明:

成員描述

listFIRST_LIST_INTEGRITY_CHECK_VALUE

listSECOND_LIST_INTEGRITY_CHECK_VALUE

具有確定已知常量的宏

FreeRTOS通過檢查這兩個常量的值,來判斷列表的數據在程序運行過程中,是否遭到破壞 ,該功能一般用于調試, 默認是不開啟的

uxNumberOfItems用于記錄列表中列表項的個數不包含 xListEnd
pxIndex用于指向列表中的某個列表項,一般用于遍歷列表中的所有列表項
xListEnd一個迷你列表項排在最末尾

列表結構示意圖:?

2.2 列表項結構體

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							            /* 列表項的擁有者 */struct xLIST * configLIST_VOLATILE pxContainer; 	/* 列表項所在列表 */listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/* 用于檢測列表項的數據完整性*/
};
typedef struct xLIST_ITEM ListItem_t; 

成員說明:

成員描述

listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE

listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALU

用于檢測列表項的數據完整性
xItemValue列表項的值,多用于將列表中的列表項按升序排序
pxNext指向列表中列表項的下一個列表項
pxPrevious指向列表中列表項的上一個列表項
pvOwner用于指向包含列表項的對象(通常是任務控制塊
pxContainer用于指向列表項所在列表

列表項結構示意圖:?

?2.3 迷你列表項(末尾列表項)

迷你列表項也是列表項,但迷你列表項僅用于標記列表的末尾掛載其他插入列表中的列表項(將要插入的列表項連接在一起

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;

成員說明:?

成員描述
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE用于檢測數據完整性
xItemValue列表項的值,多用于按升序對列表中的列表項進行排序

pxNext

pxPrevious

用于指向列表中列表項的下一個列表項和上一個列表項

????????與正常列表項,缺少列表項擁有者、列表項所在列表成員 ,以節省內存開銷

迷你列表項結構示意圖:

三、列表相關API函數

函數

描述

vListInitialise()

初始化列表

vListInitialiseItem()

初始化列表項

vListInsertEnd()

列表末尾插入列表項

vListInsert()

列表插入列表項(升序插入

uxListRemove()

列表移除列表項

?

3.1 初始化列表:vListInitialise( )

void vListInitialise( List_t * const pxList )
{/*  初始化時,列表中只有 xListEnd,因此 pxIndex 指向 xListEnd */pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );/* xListEnd 的值初始化為最大值,用于列表項升序排序時,排在最后 */pxList->xListEnd.xItemValue = portMAX_DELAY;/* 初始化時,列表中只有 xListEnd,因此上一個和下一個列表項都為 xListEnd 本身 */pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );    pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /* 初始化時,列表中的列表項數量為 0(不包含 xListEnd) */pxList->uxNumberOfItems = ( UBaseType_t ) 0U;/* 檢查數據的完整性 */listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}

參數說明:?

參數說明
pxList待初始化的列表

列表初始化后的結構示意圖:?

3.2 列表項初始化:vListInitialiseItem()

void vListInitialiseItem( ListItem_t * const pxItem )
{/* 初始化時,列表項所在列表設為空  */pxItem->pxContainer = NULL;/* 初始化用于檢測列表項數據完整性的校驗值  */listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
}

????????其他成員變量根據實際使用情況進行初始化?

參數說明:?

參數說明
pxItem待初始化的列表項

列表初始化后的結構示意圖:?

3.3 列表插入列表項(升序插入):vListInsert()

函數功能:將待插入列表的列表項按照列表項值升序插入有序地插入到列表中

void vListInsert( List_t * const pxList,ListItem_t * const pxNewListItem )
{/*獲取列表項的數值依據數值升序排列 */ListItem_t * pxIterator;const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;/* 檢查參數是否正確  */listTEST_LIST_INTEGRITY( pxList );listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );/* 如果待插入列表項的值為最大值,插入的位置為列表 xListEnd 前面  */if( xValueOfInsertion == portMAX_DELAY ){pxIterator = pxList->xListEnd.pxPrevious;}else{/*遍歷列表中的列表項,找到插入的位置*/ for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) }}/* 將待插入的列表項插入指定位置 */ pxNewListItem->pxNext = pxIterator->pxNext;pxNewListItem->pxNext->pxPrevious = pxNewListItem;pxNewListItem->pxPrevious = pxIterator;pxIterator->pxNext = pxNewListItem;/*更新待插入列表項所在列表  */pxNewListItem->pxContainer = pxList;/* 更新列表中列表項的數量 */ ( pxList->uxNumberOfItems )++;
}

?參數說明:

參數說明

pxList

列表

pxNewListItem

待插入列表項

3.4 列表末尾插入:?vListInsertEnd()

函數功能:將待插入列表的列表項插入到列表 pxIndex 指針指向的列表項前面(初始化時:pxIndex指向迷你列表項),是一種無序的插入方法?

void vListInsertEnd (  List_t * const pxList ,   ListItem_t * const pxNewListItem  )
{/* 獲取列表 pxIndex 指向的列表項 */ListItem_t * const pxIndex = pxList->pxIndex;/* 更新待插入列表項的指針成員變量 */	pxNewListItem->pxNext = pxIndex;	pxNewListItem->pxPrevious = pxIndex->pxPrevious;/* 更新列表中原本列表項的指針成員變量 */	pxIndex->pxPrevious->pxNext = pxNewListItem;pxIndex->pxPrevious = pxNewListItem;/* 更新待插入列表項的所在列表成員變量 */	pxNewListItem->pxContainer = pxList;/* 更新列表中列表項的數量 */( pxList->uxNumberOfItems )++;
} 

參數說明:

參數說明

pxList

列表

pxNewListItem

待插入列表項

2.5 移出列表項:uxListRemove()

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) 
{List_t * const pxList = pxItemToRemove->pxContainer; /* 從列表中移除列表項 */ pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; 	/*如果 pxIndex 正指向待移除的列表項 */ if( pxList->pxIndex == pxItemToRemove ) {/*pxIndex 指向上一個列表項*/ pxList->pxIndex = pxItemToRemove->pxPrevious;} else { mtCOVERAGE_TEST_MARKER(); } /*將待移除的列表項的所在列表指針清空*/ pxItemToRemove->pxContainer = NULL; /*更新列表中列表項的數量*/ ( pxList->uxNumberOfItems )--; return pxList->uxNumberOfItems; 
}

參數說明:

參數說明
pxItemToRemove待移出的列表項

返回值

移除后,列表剩余的列表項數量

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20878.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全文搜索算法的思路

一、作用 全文搜索算法適合文本文件的搜索。 二、應用場景 全文搜索算法廣泛應用在各個網站的搜索功能中。 三、全文搜索和正則模糊查詢的區別 1、全文搜索可以把搜索關鍵字進行分割&#xff0c;提取出相關的關鍵詞。 2、正則模糊查詢只能把關鍵字作為整體&#xff0c;不能…

Gigapixel AI 安裝和使用教程

簡介 Topaz Gigapixel AI 是一款功能強大的圖像放大軟件&#xff0c;它可以幫助用戶將低分辨率的圖像放大到更高的分辨率&#xff0c;而不會損失細節。該軟件利用人工智能技術&#xff0c;能夠智能分析圖像并重建丟失的細節&#xff0c;從而生成高質量的放大圖像。 安裝 下載…

系統架構設計師 - 操作系統(1)

操作系統 操作系統&#xff08;5-6分&#xff09;操作系統概述進程管理進程和線程的基本概念進程的狀態 ★前趨圖 ★★★★信號量與 PV 操作 ★★★★死鎖及銀行家算法 ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系統架構設計師 - 操作系統(1)知識&#xff0c…

CSS簡述(1)

CSS概述 CSS&#xff08;層疊樣式表&#xff0c;Cascading Style Sheets&#xff09;是一種樣式表語言&#xff0c;用于對HTML文檔控制外觀&#xff0c;定義布局。例如、css涉及字體、顏色、邊距、高度、背景圖像、高級定位等方面 CSS的主要用途&#xff1a; 1. 分離內容和樣…

2024.6.1 學習記錄

1、面經復習 2、項目使用guthub action 完成CI/CD&#xff0c;使用rollup打包為es格式 3、代碼隨想錄刷題復習

Go語言-切片底層探索 —— 補充篇:切片和底層數組到底是什么關系?

之前的切片探索中&#xff0c;上篇通過一道算法題目&#xff0c;了解到切片的兩大特性&#xff1a;一是&#xff1a;切片是引用類型&#xff0c;指向底層數組&#xff0c;修改其底層數組的時候&#xff0c;會影響切片中的值。二是&#xff1a;向切片中添加元素的時候&#xff0…

半導體光子電學期末筆記1: 電磁光學基本理論

Chapter 2: 電磁光學基本理論 電磁光學理論概述 真空中麥克斯韋方程組[p9] 在自由空間中&#xff0c;麥克斯韋方程組可以寫成如下形式&#xff1a; { ? H ? 0 ? E ? t (1) ? E ? μ 0 ? H ? t (2) ? ? E 0 (3) ? ? H 0 (4) \begin{cases} \nabla \times \…

Java——異常詳解

異常五個主要關鍵字&#xff1a;throw、try、catch、finally、throws 1. 異常的概念與體系結構 1.1 異常的概念 在Java中&#xff0c;程序執行過程中發生的不正常行為被稱為異常&#xff0c;如&#xff1a; 1. 算數異常 public static void main(String[] args) {System.ou…

基于MingGW64 GCC編譯Windows平臺上的 libuvc

安裝cmake 打開cmake官網 https://cmake.org/download/&#xff0c;下載安裝包&#xff1a; 安裝時選擇將cmake加到系統環境變量里。安裝完成后在新的CMD命令窗口執行cmake --version可看到輸出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…

牛客網刷題 | BC108 反斜線形圖案

目前主要分為三個專欄&#xff0c;后續還會添加&#xff1a; 專欄如下&#xff1a; C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀&#xff01; 初來乍到&#xff0c;如有錯誤請指出&#xff0c;感謝&#xff01; 描述 KiKi學習了循環&am…

社交媒體數據恢復:Voxer

一、Voxer數據恢復教程 了解Voxer應用 Voxer是一款專門為iPhone和Android智能手機設計的免費對講機應用&#xff0c;為用戶提供即時的語音、文本、照片等信息發送和接收服務。該應用有點類似短信服務&#xff0c;但用聲音代替文本。當你下載之后&#xff0c;如果不邀請朋友&a…

Github查詢語法

轉載自link 基礎查詢結構 一個關鍵詞會匹配文件內容或文件路徑。 多個關鍵詞會匹配文件內容&#xff0c;只要包含關鍵詞&#xff0c;就會出現在搜索結果中&#xff0c;不論前后順序&#xff0c;是否是一個單詞&#xff08;多個關鍵詞之間沒有空格&#xff09;。 還可以使用…

Java中的JVM是什么?簡要說明其工作原理

Java虛擬機&#xff08;JVM&#xff09;概述 Java虛擬機&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java技術的核心部分。它是一個抽象的計算機&#xff0c;可以解釋和執行Java字節碼。JVM提供了一個運行Java程序的環境&#xff0c;使得Java程序可以在各種…

【面試】字節碼文件是跨平臺的嗎?

目錄 1. 說明 1. 說明 1.字節碼文件&#xff08;.class文件&#xff09;是跨平臺的。2.字節碼文件是Java源代碼經過Java編譯器&#xff08;javac&#xff09;編譯后生成的中間代碼文件&#xff0c;這些包含了Java虛擬機&#xff08;JVM&#xff09;指令&#xff0c;而不是特定…

重復文件怎么查找并清理?電腦重復文件清理工具分享:4個

在日常使用電腦的過程中&#xff0c;我們不可避免地會遇到各種重復文件的問題。這些重復文件不僅占據了寶貴的存儲空間&#xff0c;還可能導致系統性能下降&#xff0c;甚至引發一些不必要的問題。因此&#xff0c;如何有效地查找并清理這些重復文件成為了許多用戶關注的焦點。…

計算 x 的二進制表示中 1 的個數

計算 x 的二進制表示中 1 的個數 代碼如下&#xff1a; int func(int x){int countx 0;while (x>0){countx;x x & (x - 1);}return countx;} 完整代碼&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat…

STM32基于HAL庫的HC-SR04模塊超聲波測距

文章目錄 一、HC-SR04模塊介紹二、創建工程1.選擇芯片2.配置RCC、SY![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/9d2a5b883f0e409eabb804e6da861277.png)3.配置串口14.配置定時器5.配置GPIO 三、Keil代碼1.勾選Use MicroLIB2.創建SR04.c和SR04.h文件3.其他代碼 …

html three.js 引入.stl模型示例

1.新建一個模塊用于放置模型 <div id"chart_map" style"width:800px;height:500px"></div> 2. 引入代碼根據需求更改 <!-- 在head或body標簽內加入以下鏈接 --> <script src"https://cdn.jsdelivr.net/npm/three0.137/build/t…

算法題-字符串排序

題目描述 給定n個字符串&#xff0c;請對n個字符串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字符串(字符串長度≤100),字符串中只含有大小寫字母。 輸出描述: 數據輸出n行&#xff0c;輸出結果為按照字典序排列的字符串。 輸入 #輸…

2.7HDR與LDR

一、基本概念 1.基本概念 動態范圍&#xff08;Dynamic Range&#xff09; 最高亮度 / 最低亮度 HDR High Dynamic RangeLDR Low Dynamic Range HDR與LDR和Tonemapping的對應關系&#xff1a; 我們常用的各種顯示器屏幕&#xff0c;由于不同的廠家不同的工藝導致它們的…