FreeRTOS學習(二)任務基礎

2021-10-21 20:15:59 字數 3202 閱讀 7544

2.任務基礎知識

在嵌入式開發中,有兩種常見的開發方式:前後臺系統和嵌入式作業系統

1.1 前後臺系統

前台:就是中斷,可以多級巢狀,處於處理一些實時性要求比較高的事件,比如按鍵的狀態獲取。

後台:乙個無限迴圈,在迴圈中呼叫相關函式完成相應操作。

這種程式設計方式的主要缺陷在於兩方面

(1)複雜度方面:無法實現複雜的系統

(2)實時性方面:難以保證較高的實時性

尤其是一些穿戴類產品,整合了多種感測器,還涉及藍芽 ble資料通訊等,系統複雜度高、實時性要求高,因此針對類似這種產品開發就需要引入實時作業系統。

1.2 嵌入式作業系統

先來說說嵌入式作業系統解決上述問題的思路:化整為零

(1)將大問題拆分成小問題

(2)每個小問題單獨作為乙個任務

也就是說,將乙個複雜系統按照一定的思想進行模組劃分,比如通訊模組,感測器管理模組,事件處理模組等等,每個模組作為乙個任務。

另一點呢,就是任務排程與切換,不管是搶占式還是時間片排程,從cpu角度來說,就是以極高的頻率來切換處理各個任務;從任務角度來說,就是以極高的頻率按照一定順序獲取cpu的使用權。

最終的效果,看起來像是多個任務在同時執行處理,從而解決系統複雜、且實時性要求高的問題。

2.1 任務狀態

乙個任務基本的狀態可以劃分為 執行態 和 非執行態,在非執行態的基礎上又擴充套件除了三種狀態,一種有四種任務狀態。

(1)執行態

比較容易理解,就是任務當前擁有 cpu 的使用權,正在執行的狀態。

(2)就緒態

萬事俱備,只欠 cpu 使用權。有兩個小事情提一下。

(3)阻塞態

處於阻塞態的任務一般是由於延時等待某個事件(佇列、訊號量等)

(4)掛起態

只有呼叫掛起任務函式才能將任務掛起,解鈴還須繫鈴人,也只有呼叫任務恢復函式才能將任務從掛起態切換回就緒態。

**於here

2.2 任務控制塊

每個任務都有乙個任務控制塊,用來儲存任務的一些屬性,可以將這個結構體理解為任務的身份證id,主要包含了任務的堆疊位址、名稱、優先順序、以及要任務控制要用到的列表項等。

關於任務控制塊的詳細內容,有興趣的可以參考這篇部落格,個人感覺解釋的比較詳細

這裡涉及了兩個列表項,延伸解釋一下。

狀態列表項為例,由上面的內容可知,任務有四種狀態,除了執行態,其他狀態都有乙個對應的列表,以便於任務排程器對任務進行管理。

//就緒列表和阻塞列表

privileged_data static list_t pxreadytaskslists[ configmax_priorities ]

;//就緒列表

privileged_data static list_t xdelayedtasklist1;

//延遲列表1

privileged_data static list_t xdelayedtasklist2;

//延遲列表2

//當任務從掛起或阻塞狀態被啟用時,如果排程器也處於掛起狀態,任務會先放進xpendingreadylist佇列,等到排程器恢復時(xtaskresumeall)再將這些xpendingreadylist裡的任務一起放進就緒列表

privileged_data static list_t xpendingreadylist;

//暫存列表

#if( include_vtaskdelete == 1 )

privileged_data static list_t xtaskswaitingtermination;

//殭屍列表

#endif

#if ( include_vtasksuspend == 1 )

privileged_data static list_t xsuspendedtasklist;

//掛起列表

#endif

當任務處於對應的狀態時,便將任務掛到相應的列表上。這裡,如果大家對列表和列表項沒有概念的話,可理解為鐵鍊和鏈環

2.3 任務堆疊

任務建立需要從記憶體中申請兩塊記憶體,乙個是任務控制塊,另乙個就是任務堆疊。

2.4 任務優先順序

每個任務都可以分配乙個優先順序,範圍是0~(configmax_priorities -1),這個巨集是在freertosconfig.h配置檔案中定義

#define configmax_priorities              (7)
關於優先順序,主要注意以下幾點:

任務優先順序的分配也很有講究,分配好壞對任務的執行順序、效率都有很大影響。這裡先簡單舉個栗子,一般地,對於涉及任務通訊的,接收任務的優先順序要高於傳送任務的優先順序。這樣的話,一旦佇列、訊號量等有資訊,便能立即響應處理。

2.5 任務實現

任務實現,指的就是任務函式,就是乙個無限迴圈,迴圈內實現任務需要完成的操作。任務函式型別如下:

void

ataskfunction

(void

*pvparameters )

;

有兩點不太常見的操作,可以忽略:

就是多個任務可以共享乙個任務函式,傳入的引數需要不一致。

FreeRTOS學習 二 任務掛起和恢復

宣告及感謝 跟隨正點原子資料學習,在此作為學習的記錄和總結 環境 keil stm32f103 1.任務掛起 vtasksuspend task1task handler 引數傳入任務控制代碼 2.任務恢復 任務恢復有兩種情況,第一種 在非中斷中恢復 vtaskresume task1task ha...

FreeRTOS 作業系統學習(二) 任務

freertos 作業系統學習 1.任務 1.1 freertos 中的任務 只要硬體和記憶體足夠,freertos 執行的任務數量不受限制,作為乙個實時作業系統,freertos 同時支援迴圈和非迴圈任務。在 rtos 中,任務由乙個簡單的c函式定義,引數為void 型別,無返回值 void 用些...

(二)任務堆疊

任務堆疊的建立 1 為了方便定義任務堆疊,在檔案os cpu.h中定義了乙個資料型別os stk typedef unsigned int os stk 該型別長度為16位 2 在定義任務堆疊的棧區時,只要定義乙個os stk型別的陣列即可。例如 define task stk size 512 定...