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 提供介面服務 二 處理機管理 程序控制 建立和撤銷程序以及控制程序的狀態轉換 進行同步 協調,互斥訪問臨界資源,協調執行進度 程序通訊 程序間的資訊交換 程序排程 按一定演算法從程序就緒佇列中選出乙個程序,把處理機分配給它...