FreeRTOS列表及列表項總結(jié)
首先說明下FreeRTOS列表及列表項就是所說的鏈表,鏈表中的節(jié)點就是列表項。對于基礎(chǔ)不是很好的想我這樣的人一聽到鏈表都感覺有點懵的狀態(tài)。在C語言里面期初接觸到結(jié)構(gòu)體的時候就發(fā)懵,接下來我就詳細(xì)的總結(jié)下這塊,也是對我學(xué)習(xí)的一種檢驗吧。本次記錄只是自己學(xué)習(xí)的一種筆記形式,如有錯誤歡迎大家指出,帶我飛!
結(jié)構(gòu)體:
先說下結(jié)構(gòu)體的概念,結(jié)構(gòu)體是我們把一些相同數(shù)據(jù)類型或者不同的數(shù)據(jù)類型集合在一起,成為一種新的數(shù)據(jù)類型,這樣我們叫它為結(jié)構(gòu)體。下面舉例說明下:
例如一個學(xué)生有很多種信息,姓名,身高,體重,學(xué)號,性別等信息,如果我們單獨定義的話每一個學(xué)生都需要定義一堆變量,這就體現(xiàn)了結(jié)構(gòu)體的好處了。
Typedefstruct man
{
???????? Char Name[5];????????????????????????????????????? //姓名
???????? Char Sex;????????????????????????????????????? //性別
???????? Unsigned char Tall;??????????????????? //身高
???????? Unsigned char Height;????????????? //體重
???????? Int Num;?????????????????????????????????????? //學(xué)號
}Student,*pStudent;
這樣我們就可以定一個結(jié)構(gòu)體變量了,里面包含這些信息,然后給這些信息來賦值,一個結(jié)構(gòu)體變量代表一個學(xué)生,這樣定義起來就方便多了。這里的結(jié)構(gòu)體有點像是面向?qū)ο笳Z言里面的類,結(jié)構(gòu)體里面的變量類似于類里面的對象。當(dāng)然結(jié)構(gòu)體還有很多說明的對齊問題,內(nèi)存問題等,在此不一一贅述了。
鏈表:
鏈表就相對復(fù)雜了,因為它屬于數(shù)據(jù)結(jié)構(gòu)里面的一種數(shù)據(jù)儲存方式吧,鏈表是把一些不連續(xù)的內(nèi)存數(shù)據(jù)連在一起。這里他和數(shù)組是有區(qū)別的,數(shù)組是連續(xù)的內(nèi)存,而且數(shù)組的刪除和插入是比較耗時的需要移動很多內(nèi)存中的東西,鏈表就不是了,下面我詳細(xì)對鏈表進行說明。
鏈表分單向鏈表和雙向鏈表。
單向鏈表就是一個根節(jié)點然后存放著下一個節(jié)點的地址,下一個節(jié)點存放著下下個節(jié)點的地址,最后的一個節(jié)點存放著根節(jié)點的地址。具體情況如下圖:

下面我來舉個例子說明單向鏈表的一些應(yīng)用,咱們還是以學(xué)生為例子吧,這次就說一個班里面的學(xué)生成績來說明吧。
/* 定義鏈表節(jié)點*/
typedef struct node
{
structnode * pNext;?? //節(jié)點驅(qū)動 存放下一個節(jié)點的地址
s8name;???????????????????????? ???????? //姓名????? 支持一位名字
u8num;??????????????????????????????????? //學(xué)號
u8Socer;????????????????????????????????? //學(xué)生成績
}List_Item;
/* 定義鏈表根節(jié)點*/
typedef struct root
{
/* 定義節(jié)點驅(qū)動點 存放下一個節(jié)點地址*/
List_Item* pNext;
/* 定義計數(shù)變量 存放該鏈表節(jié)點數(shù)*/
u32?????? ListofNum;
}List_Root;
這樣定義一個鏈表根節(jié)點,定義一個鏈表節(jié)點結(jié)構(gòu)體。隨著就是我們應(yīng)用了,首先我們先定義一個鏈表也就是鏈表根節(jié)點,也就是單向鏈表的第一個節(jié)點,實際上是連接在一起成為一個圓圈,并沒有首尾之分,但是我們習(xí)慣性的定義一個根節(jié)點作為根節(jié)點,作為第一個節(jié)點。隨之定義幾個節(jié)點,然后去初始化根節(jié)點和節(jié)點變量。接著就是吧鏈表連接起來。鏈表里面有一些應(yīng)用函數(shù)例如:鏈表的插入、鏈表的刪除、鏈表的排序等。插入又分成在任意位置插入、在尾部插入和在頭部插入。自己下去寫程序練習(xí)下即可。我個人覺得鏈表不熟悉就要多畫畫就明白了。好的說完單向鏈表我們來說下雙向鏈表。
雙向鏈表將整個鏈表徹徹底底的構(gòu)成了一個環(huán),前后都互相連接。如圖所示:

接下來我直接截取火哥的資料中的例子來說明;
節(jié)點定義

這里面定義了鏈表中的節(jié)點,可以看出來這里面的節(jié)點在驅(qū)動點上比單向鏈表多了一個前驅(qū)點,用來保存上一個節(jié)點的地址。這里是FreeRTOS的標(biāo)準(zhǔn)寫法,有節(jié)點的輔助值,好用來做排序處理。還保存著任務(wù)的控制塊及該節(jié)點所屬于的鏈表。
根節(jié)點定義

鏈表結(jié)構(gòu)定義,這樣做看的更加簡潔,起始就是進一步的封裝
[if !vml]
[endif]
只要把鏈表的存放地址和鏈表的具體鏈接弄清楚了,鏈表也就沒什么啦,接下來我把FreeRTOS里面的幾個對聯(lián)表操作的函數(shù)附上。
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
[if !vml]
[endif]
小小說明下,這里的鏈表初始化就不說了,將鏈表排序插入是為了后面的任務(wù)就緒列表,由于任務(wù)就緒列表的優(yōu)先級是數(shù)值越小優(yōu)先級越大,F(xiàn)reeRTOS我們都知道他的任務(wù)調(diào)度總是再找優(yōu)先級最高的任務(wù)運行,這樣做久很方便的調(diào)取了。將節(jié)點刪除是后面的當(dāng)我的一些任務(wù)只運行一次的時候,運行完成我們要講任務(wù)刪除掉,也就是吧該任務(wù)節(jié)點從鏈表中刪除掉。