FreeRTOS管理任務中一個相當重要的數據結構就是列表和列表項,FreeRTOS創建完成後,是一個個獨立的個體,如果沒有一個約束的關係,那麼調度器是是無法分配的,列表和列表項將這些獨立的任務的串起來,然後調度器根據每個列表項中的信息來決定哪個任務獲得CPU使用權。
列表:在FreeRTOS中用以跟蹤任務,在源碼中的結構也是比較簡單的
縮減後就是一個簡單的表格:
在FreeRTOS中,一個列表下面有多個列表項,而列表項又分爲普通列表項和迷你列表項
列表項結構體源碼:
迷你列表項結構的出現符合了FreeRTOS操作系統精簡的特點,有些時候並不需要列表那麼大一個數據結構,只需要保存一些資源,就可以使用迷你列表項
迷你列表項源碼:
列表初始化:列表項初始化中並沒有對每個成員進行初始化,只是簡單地將列表項的運行管理者置爲空,其它成員變量是在運行過程中進行初始化
列表初始化後應該是這個樣子的:
列表操作:插入、刪除
(一)尾插法
列表項的插入過程就是一個雙向鏈表的建立過程,列表項的插入位置由列表項中的列表項值來確定的,所以先獲得這個值,如果該值等於系統規定的列表項值,則直接將該列表項插入末尾,如若不是,需要遍歷(按照升序的方法),找出該列表項的位置。最後就是指明列表項的運行將由哪個列表管理,以及列表中的列表項數量加1.
舉個例子:插入一個列表項值爲xItemValue 爲 1,2,3的列表項
(二)頭插法
這裏不再是根據列表項中的值來確定列表項插入的位置,而是根據列表頭,來將新的列表項插入到列表頭的前面去,因爲是一個雙鏈表,插入到列表頭的前面,也就是插入到列表的尾部,不用去遍歷。
插入過程:
(三)刪除(五個步驟):
- 找到所在的列表
- 利用雙鏈表刪除某個節點的方法將要刪除的節點的上下列表項相連接
- 如果當前列表的索引爲要刪除的列表項,則選擇當前列表項的上一個列表項作爲當前的索引
- 被刪除的列表項的pvContainer置爲NULL
- 列表數目減1,並返回
(四)遍歷:
列表項遍歷是一個宏定義,宏定義內實現遍歷鏈表,然後找到下一個節點,即列表項。