FreeRTOS學習(三)任務管理

2021-10-21 20:42:34 字數 3907 閱讀 1041

2.任務刪除

3.任務掛起與恢復

4.任務相關api

freertos 提供了多種任務建立的api,這裡主要列舉了動態建立靜態建立

函式 api

功能描述

xtaskcreate()

動態建立,堆疊由 freertos 動態分配

xtaskcreatestatic()

靜態建立,堆疊由使用者指定分配

1.1 動態建立

任務的建立一般都採用動態的方式,其api涉及的引數如下

basetype_t xtaskcreate

( taskfunction_t pvtaskcode,

//任務函式

const

char

*const pcname,

//任務名稱

const configstack_depth_type usstackdepth,

//堆疊大小

void

*const pvparameters,

//任務函式的引數

ubasetype_t uxpriority,

//任務優先順序

taskhandle_t *

const pxcreatedtask )

;//任務控制代碼

這裡撿值得注意的地方解釋一下

1.2 靜態建立

雖然靜態建立方式不常用,但是對比認識下區別,加深對任務建立的理解還是有幫助的。

taskhandle_t xtaskcreatestatic

( taskfunction_t pxtaskcode,

//任務函式

const

char

*const pcname,

//任務名稱

const uint32_t ulstackdepth,

//堆疊大小

void

*const pvparameters,

//任務函式的引數

ubasetype_t uxpriority,

//任務優先順序

stacktype_t *

const puxstackbuffer,

//任務堆疊

statictask_t *

const pxtaskbuffer )

//任務控制塊

一樣地,撿重要的說一下

先看下**裡上面兩點怎麼實現的

#define 		task1_stk_size			128		

//任務堆疊大小

stacktype_t task1stack[task1_stk_size]

;//任務堆疊,實際就是uint32_t型的數值

statictask_t task1tcb;

//任務控制塊,結構體型別..

.taskhandle_t xtaskcreatestatic

( taskhandler,

"task1"

, task1_stk_size,

null,1

, task1stack,

&task1tcb )

;

由此也說明了,靜態建立所需的兩塊記憶體是由使用者定義分配的。

1.3 任務建立過程

這一小節從原始碼的角度深入了解下任務建立的過程中做了哪些事情。

這裡以動態建立為例,其建立過程如下

上面提到乙個指標:pxcurrenttcb,比較重要,因為排程器開啟的時候就是載入pxcurrenttcb獲取第乙個任務的tcb。

pxcurrenttcb指向執行態任務的任務控制塊,且永遠指向當前優先順序最高可執行的任務。

pxcurrenttcb指標更新的場合有兩個

任務建立

在每一次建立任務的時候(不管排程器有沒有開啟),都會檢查新建立任務的優先順序是否比當前高,如果是,就把pxcurrenttcb指向這個任務,然後就可以進行任務切換了。

任務切換

pxcurrenttcb指向就緒列表中優先順序最高的任務。

再來延伸一點,使用者建立的任務數不等於實際執行的任務數,因為freertos還建立了另外兩個任務:

空閒任務

定時器服務任務,如果開啟巨集configuse_timers2.1 函式介面 api

傳入引數為任務控制代碼,如果要刪除的是任務自身,可將引數設定為null

void

vtaskdelete

( taskhandle_t xtasktodelete )

另外,如果刪除的任務是動態建立的,那麼這個任務申請的記憶體將在空閒任務中被釋放。

2.2 任務刪除過程

任務刪除主要涉及列表記憶體管理,原始碼就不在這裡分析了,簡要過程如下

3.1 函式介面 api

(1)任務掛起

void

vtasksuspend

( taskhandle_t xtasktosuspend )

(2)任務恢復

void

vtaskresume

( taskhandle_t xtasktoresume )

掛起、恢復與刪除類似,都是傳入要操作的任務控制代碼,如果要操作的物件為自身,也可傳入引數null

3.2 掛起與恢復過程

任務掛起與恢復的過程可以和刪除模擬學習,都是對列表進行操作,而且設計到任務切換,但不會像刪除任務需要對記憶體進行處理,簡要流程如下:

(1)任務掛起

(2)任務恢復

除了以上常用的任務管理apifreertos還提供了一些函式來設定/獲取任務屬性和狀態。

api功能

uxtaskpriorityget()

獲取某個任務的優先順序

vtaskpriorityset()

設定某個任務的優先順序

xtaskgetcurrenttaskhandle()

獲取當前在執行的任務控制代碼

xtaskgethandle()

根據任務名字查詢任務控制代碼

etaskgetstate()

獲取任務狀態

uxtaskgetnumberoftasks()

獲取當前系統存在的任務數量

vtasklist()

以**形式輸出所有任務的狀態資訊

vtaskgetruntimestats()

獲取每個任務的執行時間

C 實驗三 任務報告

本次實驗比較倉促,有很多想寫清楚沒來得及,等班級考完再慢慢補充.略模擬實驗任務2,不使用標準庫模板類vector,自己動手設計並實現乙個動態的整型陣列類vector int,使其支援以下要求 vector int x n 建立乙個動態大小的int型陣列物件x,向系統申請n個int型資料項 空間vec...

專案三 任務二 配置SSH服務

專案三 任務二 配置ssh服務 第1步 檢查ssh軟體的安裝 通過以下命令檢查ssh軟體的安裝情況,一般情況下,系統已經預設安裝了此服務。rpm gopenssh 檢視ssh 服務客戶端的發裝。rpm gopenshserve 檢視ssh 服務服務端的安裝。如果沒有查詢到相關的openssh軟體,請...

專案三 任務二 配置SSH服務

ssh服務採用非對稱性演算法。例如 b 主機是一台ssh的伺服器,那麼它需要以各種形式公開發布自己的公鑰,假如被a 主機想要與b伺服器通訊,a 主機需要得到b伺服器的公鑰,a 主機在向b伺服器傳送資料時,會使用b伺服器的公鑰把資料加密後傳輸給b伺服器,b伺服器收到資料後就使用自己的私鑰進行解密,如果...