實時作業系統之任務

2022-05-28 13:39:10 字數 2323 閱讀 7500

任務可以以下列狀態之一存在:

有效的任務狀態轉換

任務優先順序

每個任務都分配了乙個從0到(configmax_priorities - 1)的優先順序,其中configmax_priorities在freertosconfig.h中定義。

如果正在使用的埠實現了使用「計數前導零」型別指令(用於在單條指令中進行任務選擇)的埠優化任務選擇機制,並且freertosconfig.h中的configuse_port_optimised_task_selection設定為1,則configmax_priorities不能高於32。在所有其他情況下,configmax_priorities可以在合理範圍內使用任何值 - 但由於ram使用效率的原因應保持在實際所需的最小值。

低優先順序數字表示低優先順序任務。該空閒任務的優先順序為零(tskidle_priority)。

freertos排程程式確保處於「就緒」或「正在執行」 狀態的任務始終獲得處理器(cpu)時間,優先於處於就緒狀態的較低優先順序任務。換句話說,放置到執行狀態的任務始終是能夠執行的最高優先順序任務。

任何數量的任務都可以共享相同的優先順序。如果未定義configuse_time_slicing,或者將configuse_time_slicing設定為1,則等待優先順序的就緒狀態任務將使用時間片迴圈排程方案共享可用處理時間。

實施一項任務

任務應該具有以下結構:

void vataskfunction(void * pvparameters)

/ *任務不得試圖從其實施中返回

功能或其他退出。在較新的freertos埠

試圖這樣做將導致configassert()是

如果它被定義,則稱為。如果有必要完成任務

退出然後讓任務呼叫vtaskdelete(null)來確保

它的出口很乾淨。* /

vtaskdelete(null);

}

taskfunction_t型別被定義為乙個返回void的函式,並將void指標作為其唯一引數。所有實現任務的功能都應該是這種型別的。該引數可用於將任何型別的資訊傳遞到任務中 - 這由幾個 標準演示應用程式任務演示。任務函式不應該返回,因此通常以連續迴圈的形式實現。同樣,請參閱rtos演示應用程式以獲取大量示例。

任務通過呼叫xtaskcreate()或xtaskcreatestatic()來建立,並通過呼叫vtaskdelete()來刪除。

任務建立巨集

任務功能可以任選地使用porttask_function和porttask_function_proto巨集定義。提供這些巨集以允許將編譯器特定的語法分別新增到函式定義和原型。除非在正在使用的埠的文件(目前僅限於pic18 fedc埠)中特別宣告,否則不需要使用它們。

上面顯示的功能原型可以寫成:

void vataskfunction(void * pvparameters);
要麼,
porttask_function_proto(vataskfunction,pvparameters);
同樣,上面的函式也可以寫成:
porttask_function(vataskfunction,pvparameters)

}

空閒任務

當rtos排程程式啟動時,空閒任務會自動建立,以確保總是有至少乙個能夠執行的任務。如果在就緒狀態下有更高優先順序的應用程式任務,它將以盡可能最低的優先順序建立,以確保它不使用任何cpu時間。

空閒任務負責將由rtos分配的記憶體釋放到已被刪除的任務。因此,在使用vtaskdelete()函式來確保空閒任務不會處理時間不足的應用程式中非常重要。空閒任務沒有其他主動功能,所以在所有其他條件下可以合理地使微控制器時間減少。

應用程式任務可以共享空閒任務優先順序(tskidle_priority)。有關如何配置此行為的資訊,請參閱configidle_should_yield 配置引數。

空閒任務鉤子空閒任務掛鉤是在空閒任務的每個週期中被呼叫的函式。如果您希望應用程式功能以空閒優先順序執行,則有兩種選擇:在空閒任務掛鉤中實現功能。必須至少有乙個任務已準備好執行。因此,hook函式不會呼叫可能導致空閒任務阻塞的任何api函式(例如,vtaskdelay()或具有阻塞時間的佇列或訊號量函式)。協同例程在鉤子函式中被阻塞是可以的。

建立乙個空閒優先順序任務來實現該功能。這是乙個更靈活的解決方案,但具有更高的ram使用開銷。

有關使用空閒掛鉤的更多資訊,請參閱嵌入式軟體應用程式設計一節。要建立乙個閒置鉤子:

在freertosconfig.h中將configuse_idle_hook設定為1 。

通常使用空閒掛鉤功能將微控制器cpu置於省電模式。

UCOS 實時多工作業系統

ucosii 的前身是 ucos,最早出自於 1992 年美國嵌入式系統專家 jean j.labrosse 在 嵌 入式系統程式設計 雜誌的 5 月和 6 月刊上刊登的文章 並把 ucos 的原始碼發布在該雜誌的 bbs 上。目前最新的版本 ucosiii 已經出來,但是現在使用最為廣泛的還是 u...

實時作業系統的任務排程示例之搶占

什麼是任務搶占?實時作業系統大多都是基於優先順序排程的搶占式的核心,這句話每本關於rtos的資料都有。樓主最怕這種每個字都認識,但連到一起就很不好理解的書面語言。直白點說,就是 1 每個任務都有自己的優先順序,一般都是在create task的時候以函式入參的形式確定,有的rtos也提供api允許應...

ucosii實時作業系統的任務排程

嵌入式作業系統的任務排程演算法好壞在很大程度上決定了該系統的執行效率,由於其執行的頻率極高,所以在任務排程函式的實現上,對於效率的要求可以用苛刻來形容。基於優先順序的任務排程總結下來就是做了兩件事 1 找到優先順序最高的就緒態任務 2 切換任務上下文並開始執行該任務 第二步的切換上下文對個各個rto...