FreeRTOS數據結構(一)--鏈表和鏈表項

来源:https://www.cnblogs.com/xw-kaka/archive/2018/04/28/8969447.html
-Advertisement-
Play Games

結構體定義 根據定義可以看出以下幾點: 1. 鏈表結構是一個雙向鏈表。 2. 每個鏈表都由鏈表和鏈表項組成。 3. 鏈表結構體本身有一個迷你鏈表項,用來標記鏈表的結尾。 鏈表和鏈表項初始化 鏈表的操作 鏈表的插入會根據List Item Value進行升序排列,其他並沒有什麼特殊的地方。初始化並插入 ...


結構體定義

/*鏈表結構體*/
typedef struct xLIST
{
    listFIRST_LIST_INTEGRITY_CHECK_VALUE  /*用於鏈表完整性檢查*/
    configLIST_VOLATILE UBaseType_t uxNumberOfItems; /*記錄鏈表項數目*/
    ListItem_t * configLIST_VOLATILE pxIndex; /*用於遍歷鏈表,初始化會指向最後的鏈表項,這裡需要註意使用了volatile關鍵字,表明該指針可能會在其他地方修改*/
    MiniListItem_t xListEnd;/*用於標記鏈表尾*/
    listSECOND_LIST_INTEGRITY_CHECK_VALUE /*用於鏈表完整性檢查*/
} List_t;
/*鏈表項結構體*/
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; /*指向結構體控制塊*/
    void * configLIST_VOLATILE pvContainer;/*指向該鏈表項對應的鏈表*/
    listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*用於鏈表完整性檢查*/    
};
/*迷你鏈表項結構體*/
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;
};

根據定義可以看出以下幾點:

  1. 鏈表結構是一個雙向鏈表。
  2. 每個鏈表都由鏈表和鏈表項組成。
  3. 鏈表結構體本身有一個迷你鏈表項,用來標記鏈表的結尾。

鏈表和鏈表項初始化

/*鏈表初始化*/
void vListInitialise( List_t * const pxList )
{
    /*將鏈表的Index索引指針指向自身的迷你鏈表項,即鏈表結尾*/
    pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );           
    /*將迷你鏈表項值設置為最大值,確保處於鏈表結尾*/
    pxList->xListEnd.xItemValue = portMAX_DELAY;
    /*由於鏈表中沒有節點,鏈表尾節點的下一項和上一項都是自身,表明這是一個迴圈鏈表*/
    pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );
    pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );
    pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
    /*初始化鏈表的完整性檢查值*/
    listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
    listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}
/*鏈表項初始化*/
void vListInitialiseItem( ListItem_t * const pxItem )
{
    /*確保該鏈表項沒有被鏈表使用,往往初始化鏈表項之後就會進行插入或設置操作*/
    pxItem->pvContainer = NULL;
    /*初始化完整性檢查*/
    listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
    listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
}

鏈表的操作

鏈表的插入會根據List Item Value進行升序排列,其他並沒有什麼特殊的地方。初始化並插入兩個節點後大概的數據結構,如下圖所示:
鏈表

從圖中可以看出,List初始化並添加節點後,List Item 1/List Item 2 和 List自己的xListEnd節點一起組成了一個雙向迴圈的鏈表。

Q&A

1).如何完成鏈表的完整性檢查?
如果打開了完整性檢查的開關(configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES),每個鏈表和鏈表項結構都會定義listFIRST_LIST_INTEGRITY_CHECK_VALUElistSECOND_LIST_INTEGRITY_CHECK_VALUE(mini鏈表項沒有定義這個),該定義是一個16位或32位的整形數,在鏈表或鏈表項初始化的時候會將該變數初始化為0x5a5a或0x5a5a5a5a,在檢查的時候如果這兩個變數都沒有改變則通過完整性檢查,否則認為鏈表被破壞。

2).如何使用List?

  1. 必須先定義一個List_t的全局變數,比如Timer中的 xActiveTimerList1
  2. 每一個節點結構體必須包含xLIST_ITEM類型的成員。
  3. 初始化鏈表後,將含有List Item成員的數據結構按照鏈表項值的大小插入到鏈表中,比如Timer中利用該值溢出的判斷。
  4. 設置好pvOwner指針,後續可以根據該指針反向找到該節點的具體結構,如Timer_t。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需要實現的功能:選中父節點對應子節點全選;不選中父節點,對應子節點也不選中 如下圖所示,選中車隊,對應車隊中車輛也全部選中,以實現車隊中所有車輛在地圖上的顯示。 選中cqupt1,則對應所有成員car1,car2自動選中,地圖上顯示車隊中的所有車輛位置信息 解決辦法: 車隊對應的id為team_id ...
  • 最近在弄一個東東,類似那種CMS的後臺管理系統,方便作為其它項目的初始化框架用的。 現在遇到個問題,如標題所示:Dapper通用的多表聯合分頁查詢怎麼破? 單表的話很簡單就可以實現,多表不通用的話也可以很方便的實現,那麼如果多表通用的話,怎麼辦呢? 難道只能通過拼接sql或者使用存儲過程嗎?我先來展 ...
  • HSSFWorkbook workbook2 = new HSSFWorkbook(); //XSSFWorkbook workbook2 = new XSSFWorkbook();//建立Excel2007對象 HSSFSheet sheet1; /// <summary> /// 99乘法表 / ...
  • public void Data_Write_Value(int[] m_write_data) { int lSize = 2; string[] AddressArray = new string[18] { "D720", "D721", "D722", "D723", "D724", "D7 ...
  • 一、安裝.Net Core SDK 按照官方文檔,執行以下命令安裝SDK curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo mv microsoft.gpg /etc ...
  • 1.Image組件—“Source Image”,Set Native Size. 2.Image組件—“Image Type”——Sliced 編輯要放大縮小的圖片,Sprite Editor,採用九宮格切圖。 3.創建空物體(作為父物體),添加Componment—Layout—Grid Lay ...
  • .Net Core 是由NuGet包(package)組成的平臺。一起使用的多個包的集合:元包(Metapackage)package 包 (對應以前的程式集概念)Framework 框架assembly 程式集重要的NuGet包:System.Runtime 基礎包System.Collectio... ...
  • pwd與cd命令 >pwd命令是“print working directory”中每個單詞的首字母縮寫,其功能是顯示當前工作目錄的絕對路徑。在實際工作中,我們在命令行操作命令時,經常會在各個目錄路徑之間進行切換,此時可使用pwd命令快速查看當前我們所在的目錄路徑。 還有一個 $PWD 環境變數,可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...