FreeRTOS 中 vListInsertEnd 函數詳解

????????在 FreeRTOS 中,vListInsertEnd 函數用于將新項插入到指定列表的尾部(但實際行為是插入到一個特定的索引位置之前)。FreeRTOS 使用雙向鏈表(doubly linked list)來管理任務和其他系統對象,這樣可以高效地插入、刪除和遍歷列表。

1. vListInsertEnd 函數源碼解析

vListInsertEnd 函數將新項插入到列表中 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 )++;
}

2. 代碼詳解

  • 獲取列表 pxIndex 指向的列表項:

    ListItem_t * const pxIndex = pxList->pxIndex;
    

    pxIndex 是一個指向列表中某一項的指針。該項將作為新項插入位置的參考點。

  • 更新待插入列表項的指針成員變量:

    pxNewListItem->pxNext = pxIndex;
    pxNewListItem->pxPrevious = pxIndex->pxPrevious;
    

? ? ? ????? 新列表項 pxNewListItempxNext 指向 pxIndex,即插入項的下一個項。

? ?pxNewListItempxPrevious 指向 pxIndex 的前一個項。

  • 更新列表中原本列表項的指針成員變量:

    pxIndex->pxPrevious->pxNext = pxNewListItem;
    pxIndex->pxPrevious = pxNewListItem;

? ? ? ? ?pxIndex 前一個項的 pxNext 更新為指向 pxNewListItem,這樣鏈表中的前一項就指向了新插入的項。

? ?pxIndexpxPrevious 更新為 pxNewListItem,因此 pxIndex 的前一項變為新插入的項。

  • 更新待插入列表項的所在列表成員變量:

    pxNewListItem->pxContainer = pxList;

? ? ? ? ?pxNewListItempxContainer 設置為 pxList,表示該項屬于這個列表

  • 更新列表中列表項的數量:

    ( pxList->uxNumberOfItems )++;
    

????????列表的項數增加一。

3. 實例分析

以下是 vListInsertEnd 函數的幾個示例,以幫助理解其工作原理。

例子 1: 空列表

初始狀態:

  • 列表 pxList 為空,pxIndex 指向列表頭。
List_t list;
ListItem_t listItem1;// 初始化列表
list.pxIndex = &listItem1;
list.uxNumberOfItems = 0;// 插入新項
vListInsertEnd(&list, &listItem1);

插入后:

  • pxList 現在包含一項 listItem1
  • listItem1pxNextpxPrevious 都指向 listItem1 自己。

例子 2: 已有多個項的列表

初始狀態:

  • 列表 pxList 包含 listItem1listItem2pxIndex 指向 listItem2
List_t list;
ListItem_t listItem1, listItem2, listItem3;// 初始化列表
list.pxIndex = &listItem2;
list.uxNumberOfItems = 2;listItem1.pxNext = &listItem2;
listItem1.pxPrevious = &listItem2;listItem2.pxNext = &listItem1;
listItem2.pxPrevious = &listItem1;// 插入新項
vListInsertEnd(&list, &listItem3);

插入后:

  • listItem3 被插入到 listItem2 前。
  • 列表順序為:listItem1 -> listItem3 -> listItem2

例子 3: 插入到非尾部

初始狀態:

  • 列表 pxList 包含 listItem1, listItem2, listItem3pxIndex 指向 listItem2
List_t list;
ListItem_t listItem1, listItem2, listItem3, listItem4;// 初始化列表
list.pxIndex = &listItem2;
list.uxNumberOfItems = 3;listItem1.pxNext = &listItem2;
listItem1.pxPrevious = &listItem3;listItem2.pxNext = &listItem3;
listItem2.pxPrevious = &listItem1;listItem3.pxNext = &listItem1;
listItem3.pxPrevious = &listItem2;// 插入新項
vListInsertEnd(&list, &listItem4);

插入后:

  • listItem4 被插入到 listItem2 前。
  • 列表順序為:listItem1 -> listItem4 -> listItem2 -> listItem3

4. 適用場景

  • 任務調度:在 FreeRTOS 中,任務可以被插入到就緒任務列表中以表示它們可以運行。
  • 時間管理:延遲任務可以插入到延遲列表中,以便當時間到達時,任務會被恢復。
  • 資源管理:可以用于管理隊列、信號量等對象的列表。

??vListInsertEnd 是 FreeRTOS 中用于在列表中插入新項的函數。雖然名稱暗示插入到末尾,但實際功能是插入到 pxIndex 指向項的前面。函數通過更新指針來維持雙向鏈表的完整性,同時增加列表項的數量。這種結構使得 FreeRTOS 可以高效管理任務和系統資源,從而確保實時操作系統的高效運行。

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

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

相關文章

前端三件套開發模版——產品介紹頁面

今天有空,使用前端三件套html、css、js制作了一個非常簡單的產品制作頁面,與大家分享,希望可以滿足大家應急的需求。本頁面可以對產品進行“搶購”、對產品進行介紹,同時可以安排一張產品的高清大圖,我也加入了頁面的背…

JAVA實現二分查找,斐波那契數列,深度優先搜索詳情教程【包含代碼】

本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(注明:作者:王文峰…

react+ts+antd項目搭建

前言: 基于ts語言創建react項目,node版本是v16.14.2 一、 腳手架創建項目 全局安裝 npm install -g creacte-react-app創建項目file-management,ts需要添加–template typescript npx create-react-app file-management --template typesc…

Ubuntu查看opencv版本c++

?命令行中直接輸入: pkg-config --modversion opencv?命令行中直接輸入: pkg-config --modversion opencv4注解:附上在markdown中打勾,對號和打叉。使用時將&和#之間的空格去掉,這里只是為了不讓CSDN自動轉換才…

Ubuntu20.04 c++程序 涉及opencv問題記錄

頭文件更改 默認的頭文件引用是 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>但是在ubuntu20中/usr/include中默認的是opencv4&#xff0c;他文件夾里面才是opencv2&#xff0c;需要…

vue3單個頁面進行防抖節流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函數 function debounce(func: () > void, dela…

【mybatis】mybatis-plus中Wrapper(查詢條件構造器)簡介_常用方法

1、簡介 MyBatis-Plus 是一個 MyBatis 的增強工具&#xff0c;在 MyBatis 的基礎上只做增強不做改變&#xff0c;為簡化開發、提高效率而生。MyBatis-Plus 提供了強大的條件構造器&#xff08;Wrapper&#xff09;&#xff0c;用于構建復雜的 SQL 查詢條件&#xff0c;使得我們…

溝通方法和技巧

0 Preface/Foreword 1 溝通對象 溝通維度&#xff1a; upward&#xff0c;向上溝通&#xff0c;直接上級downward&#xff0c;向下溝通&#xff0c;直接下級horizontal&#xff0c;橫向溝通&#xff0c;同部門/跨部門同事 2 溝通方式&#xff08;5W2H&#xff09; 對于開會和…

小白嘗試某程機票信息爬取

實訓課需要機票數據集&#xff0c;網上沒有&#xff0c;所以我選擇爬取數據 此過程可謂經歷的九九八十一難&#xff0c;也參考了不少大佬的文章&#xff0c;在此特別記錄一下 彎路不多說&#xff0c;我直接講成功的方法 找到請求url 通過控制臺&#xff0c;最后確認下面的 …

在WordPress中獲取10天之內的文章更新數

要在WordPress中獲取10天之內的文章更新數&#xff0c;您可以使用以下代碼片段。這段代碼將顯示在過去10天內更新的文章數量。 <?php // 獲取當前時間戳 $now time();// 計算10天前的時間戳 $ten_days_ago $now - (10 * 24 * 60 * 60);// 設置查詢參數 $args array(pos…

【Spring Boot AOP中切入表達式格式介紹】

文章目錄 一、切入表達式簡介二、切入表達式的語法1. 方法匹配符示例&#xff1a; 2. 類型匹配符示例&#xff1a; 一、切入表達式簡介 切入表達式&#xff08;Pointcut Expression&#xff09;是AOP中定義切入點&#xff08;Pointcut&#xff09;的一種方式。它定義了在哪些連…

基于Java中的SSM框架實現物流管理系統項目【項目源碼+論文說明】

基于Java中的SSM框架實現物流管理系統演示 摘要 企業的發展離不開物流的運輸&#xff0c;在一個大型的企業中&#xff0c;商品的生產和建設&#xff0c;推廣只是前期的一些工作&#xff0c;在后期的商品銷售和物流方面的建立&#xff0c;才能讓一個企業得到大力的發展。 企業…

基于Linux/ARM/單片機利用狀態機對多個按鍵進行掃描實現短按或者長按

1&#xff09;Linux/ARM/單片機入門級按鍵掃描程序設計&#xff0c;分享給將要學習或者正在學習Linux/ARM/單片機開發的同學。 2&#xff09;內容屬于原創&#xff0c;若轉載&#xff0c;請說明出處。 3&#xff09;提供相關問題有償答疑和支持。 學習Linux/ARM/單片機的同學…

docker部署簡單的Kafka

文章目錄 1. 拉取鏡像2. 運行創建網絡運行 ZooKeeper 容器運行 Kafka 容器 3. 簡單的校驗1. 檢查容器狀態2. 檢查 ZooKeeper 日志3. 檢查 Kafka 日志4. 使用 Kafka 命令行工具檢查5. 創建和刪除測試主題 1. 拉取鏡像 選擇一組兼容性好的版本。 docker pull bitnami/kafka:3.6…

Facebook:數字社交的引領者與創新者

自2004年誕生以來&#xff0c;Facebook從一個校園網絡項目迅速成長為全球最大的社交媒體平臺&#xff0c;徹底改變了我們與世界互動的方式。作為數字社交的引領者和創新者&#xff0c;Facebook不僅在技術層面上不斷突破&#xff0c;也在社會和文化領域留下了深刻的印記。本文將…

vue2 + element三級菜單實現模板

需求&#xff1a; 需要一個含有三級菜單的結構模板&#xff0c;用于業務快速開發。 解決&#xff1a; sidebar.vue <template><el-menu :default-active"defaultActive" class"el-menu-vertical-demo" active-text-color"#ffd04b"&…

『大模型筆記』2024大模型AI工程師必備技能!

2024大模型AI工程師必備技能! 文章目錄 一. 2024大模型AI工程師必備技能!1. 引言:理解如何在各種應用中使用大語言模型(LLM)2. 第1層:Question answering(Q&A)3. 第2層:Chatbot=Q&A+短期記憶(上下文知識)4. 第3層:RAG=Q&A+短期記憶(上下文知識)+長期記憶(外…

【論文解讀】CVPR2024:DUSt3R: Geometric 3D Vision Made Easy

論文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代碼&#xff1a;GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一種旨在簡化幾何3D視覺任務的新框架。作者著重于…

Docker的架構原理

例子可以想象成一個買手機的場景 clien可以想象 你個人 docker deamon &#xff1a;店員 images&#xff1a; 樣機 regisitry&#xff1a; 手機倉庫 container: 使用的手機 首先我要在店員買一個手機&#xff0c;店員發現是樣機&#xff0c;但是倉庫有&#xff0c;&…

【SpringBoot3】使用Jasypt加密數據庫用戶名、密碼等敏感信息

一、使用步驟介紹 使用Jasypt&#xff08;Java Simplified Encryption&#xff09;進行數據加密和解密主要涉及幾個步驟&#xff0c;包括引入依賴、配置加密密碼、加密敏感信息、將加密信息存儲到配置文件中&#xff0c;以及應用程序啟動時自動解密。以下是詳細的使用說明&…