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

2021-09-29 12:38:22 字數 3363 閱讀 9237

freertos 作業系統學習

1. 任務

1.1  freertos 中的任務

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

用些函式用於對任務的管理 : 任務建立(vtaskcreate()),任務銷毀((vtaskdelete()),優先順序管理(uxtaskpriorityget(),   vtaskpriorityset())   延遲/恢復((vtaskdelay(), vtaskdelayuntil(),vtasksuspend(), vtaskresume(),vtaskresumefromisr()

為了便於除錯,使用者可以選擇很多操作,例如建立關鍵序列或對任務進行監控。、

1.1.1 任務的生命週期

本節更詳細地講解任務從建立至銷毀的整個發展過程。此時,我們假設只有乙個核心,在指定的時間內只執行乙個任務,每個人物只有「 執行 (running) 」 「 不執行 (not running) 」兩種狀態,由於我們假設是單核執行,且任意時刻有且只有乙個任務在執行,那麼其他的未執行的任務一定是處於「不執行 (not running)」狀態.圖1給出了這種情形下生命週期的簡單示意圖

當乙個任務從 非執行狀態 進入執行狀態,稱之為「切入」,反之,成為「切出」。

圖1 生命週期示意圖

由於存在一些原因導致任務無法執行,由於「未執行」狀態可以展開,如圖2所示,當任務處於延遲或等待事件觸發時,高優先順序任務可以搶占低優先順序任務(排程在第2節中介紹)。當任務正在處理器資源準的過程中,這個狀態稱之為「就緒(ready)」態。當任務處於等待另乙個任務完成(例如 等待訊號量同步完成或互斥量)被延後執行,處於等待的狀態稱之為「阻塞。(blocked)」。總之,呼叫vtasksuspend()   、   vtaskresume()   、 xtaskresumefromisr()這些函式,可以使任務進入或退出「掛起 (suspend)」狀態。

強調任務能自行退出「執行(running)」態是非常重要的(即進入延遲、掛起或事件等待),只有排程器能使任務重新「切入」執行狀態,當乙個任務試圖重新進入「執行」態,它的狀態應為「就緒(ready)」,只有任務排程器能決定當前的時間片分配給哪個就緒任務。

圖2 任務的生命週期

1.2  建立 和 刪除任務

由乙個簡單的c函式定義的任務,它帶有乙個void *引數並且不返回任何內容(請參見 文字1)

文字1: 乙個典型的任務函式

乙個任務在銷毀(destroy)之前會一直執行。任務通常是乙個死迴圈函式,或在到達最後乙個大括號之前呼叫vtaskdestroy(null),由於死迴圈中的任何**都可能失敗並導致退出此迴圈,即使是重複性任務,在最後的大括號之前呼叫vtaskdelete()也更安全。文字3 是乙個任務實現的典型例子

可以使用vtaskcreate()建立任務(文字2)。 此函式引數列表如下:

文字 2: 任務建立例程

portbase_type xtaskcreate  (       pdtask_code                        pvtaskcode,           

const signed portchar  *         const pcname,                                 

unsigned portshort               usstackdepth,                                 

void                                           * pvparameters,                                  

unsigned                                   portbase_type uxpriority,               

xtaskhandle                            *pxcreatedtask   );  

文字 3: 乙個典型的任務 (from 「using the freertos real time kernel」).

void ataskfunction( void *pvparameters ) 

可以按照常規函式宣告變數的方法對變數進行宣告。.  

每個使用此函式建立的任務 ,會重新建立乙個ivariableexample 變數.  

如果變數是靜態變數,所有此任務的例項將共享變數的儲存,乙個例項修改將導致所有例項的這個變數值都發生改變 

int ivariableexample = 0;      

/* 死迴圈中為任務的具體實現. */    

for( ;; )    

/* 任務功能實現**. */   

應該在不打破上述迴圈的前提下執行任務,然後才能刪除該任務。

傳遞給vtaskdelete()函式的null引數表示要刪除的任務是當前正在呼叫的任務。

vtaskdelete( null ); 

當任務建立後可以使用xtaskdestroy()例程銷毀任務。 引數為pxcreatedtask,例程見文字4中給出,示例參考文字3

文字4 刪除乙個任務

void vtaskdelete( xtaskhandle pxtask );  

刪除任務後,空閒任務將釋放所有釋放所有分配給該任務的記憶體資源。注意,所有動態分配的記憶體必須手動釋放。

作業系統學習(二)

程式的可併發執行 程序的定義與特徵 程序的狀態 程序的掛起狀態 程序控制塊 程序的組織形式 程序控制 程序的建立 程序終止 程序的終止過程 引起程序阻塞和喚醒的事件 中斷型別分為如下兩大類 按中斷功能分類 引入,前驅圖 定義 前驅圖是乙個又向無迴圈圖,可用來描述程式段或程序之間的先後次序關係。前趨圖...

作業系統學習筆記(二)

命令方式 作業系統外殼 互動性的介面 系統呼叫方式 作業系統核心 管理物件 1 硬體資源 處理器 儲存器 記憶體 外存 外圍裝置 鍵盤 滑鼠 印表機 顯示器等 2 資訊 資料和軟體 是以檔案的方式來進行管理,作業系統是通過檔案系統模組具體來對軟體 資料 實施管理。管理內容 1 資源的分配 和訪問操作...

作業系統學習筆記二

1 管理處理機 2 管理儲存器 3 管理輸入 輸出裝置 4 管理資料檔案 5 提供介面服務 二 處理機管理 程序控制 建立和撤銷程序以及控制程序的狀態轉換 進行同步 協調,互斥訪問臨界資源,協調執行進度 程序通訊 程序間的資訊交換 程序排程 按一定演算法從程序就緒佇列中選出乙個程序,把處理機分配給它...