FreeRTOS學習(五) 任務相關API函式

2021-09-09 06:39:43 字數 3159 閱讀 9979

宣告及感謝: 跟隨正點原子資料學習, 在此作為學習的記錄和總結

環境 keil , stm32f103

api函式預覽:

1. ubasetype_t uxtaskpriorityget( taskhandle_t xtask )// 獲取某個任務的優先順序

引數: xtask 傳入任務控制代碼

unsigned portbase_type priority;

priority = uxtaskpriorityget(led0task_handler);

// 列印 priority 即可看到 led0task_handler 任務的優先順序

2. vtaskpriorityset()

設定任務的優先順序

vtaskpriorityset(led0task_handler, 10);
// 給 led0task_handler 任務控制代碼的任務設定優先順序為10;

// 可以使用步驟1檢視任務修改後的優先順序.

3.uxtaskgetsystemstate

// 獲取系統所有任務的狀態.

u32 totalruntime;               // 系統總執行時間

ubasetype_t arraysize,x; //

taskstatus_t *statusarray;

arraysize = uxtaskgetnumberoftasks(); // 獲取系統任務數量

statusarray = pvportmalloc(arraysize*sizeof(taskstatus_t)); // 申請記憶體

if(statusarray!=null) // 記憶體申請成功

etaskstate;

6.vtasklist():

以一種**的形式輸出當前系統中所有任務的詳細資訊

char infobuffer[1000];

vtasklist(infobuffer); // 獲取系統任務的資訊儲存在infobuffer 陣列中

列印 infobuffer 會看到如下資訊

query_task r 3 192 5

idle r 0 108 2

led0_task b 2 108 4

tmr svc s 31 236 3

資訊中每一列代表含義

任務名稱 任務狀態 任務優先順序 任務剩餘堆疊大小 任務編號

使用此功能需要 將這兩個巨集定義

configuse_trace_facility 1

configuse_stats_formatting_functions 1

最後 在任務狀態中

r 表示 就緒

b 表示 阻塞

s 表示 暫停

7.xtaskgethandle()

// 根據任務名稱獲取任務控制代碼

taskhandle_t taskhandle;

taskhandle=xtaskgethandle(「query_task」); // 引數傳入任務名稱 ,返回值 為任務控制代碼

8.vtaskgetruntimestats

統計任務的執行時間資訊

要使用此函式的話需要將

configgenerate_run_time_stats 和 configuse_stats_formatting_functions

的巨集定義定為1.

需要實現 兩個巨集

portconfigure_timer_for_run_time_stats()

portget_run_time_counter_value()

// 首先注意這兩個巨集雖然不需要傳引數, 但是需要括號的。

portconfigure_timer_for_run_time_stats 這個巨集用來初始化時間統計功能所需的時基, 一般是定時器/計數器。

這個時鐘時基比系統時鐘高10~20倍。

portget_run_time_counter_value 這個巨集 是當前時基的值。

示例:巨集定義設定

#define portconfigure_timer_for_run_time_stats()  configuretimeforruntimestats() //  定時器3 提供時間統計的時基, 頻率為20k                                    即週期為50us

#define portget_run_time_counter_value() freertosruntimeticks // 獲取時間統計值 ,乙個全域性變數

巨集定義實現

// freertos時間統計所有的節拍計數器

volatile unsigned long long freertosruntimeticks; // 使用 unsigned long long 防止溢位

// 初始化tim3使其為freertos的時間統計提供時基

void configuretimeforruntimestats(void)

// 定時器3中斷服務函式

void tim3_irqhandler(void)

tim_clearitpendingbit(tim3,tim_it_update); // 清除中斷標誌位

}

具體使用

// 在任務中使用

void runtimestats_task(void *pvparameters)

vtaskdelay(10); // 延時10ms

}}

// 串列埠輸出資訊

一共三列, 分別表示 任務名稱, 任務執行時間。 執行所佔百分比

在執行時間中,需要將其值 * 時基

vtaskgetruntimestats 此功能只能在調式階段使用, 因為實現此功能較佔系統時間。

FreeRTOS學習(二)任務基礎

2.任務基礎知識 在嵌入式開發中,有兩種常見的開發方式 前後臺系統和嵌入式作業系統。1.1 前後臺系統 前台 就是中斷,可以多級巢狀,處於處理一些實時性要求比較高的事件,比如按鍵的狀態獲取。後台 乙個無限迴圈,在迴圈中呼叫相關函式完成相應操作。這種程式設計方式的主要缺陷在於兩方面 1 複雜度方面 無...

FreeRTOS學習(三)任務管理

2.任務刪除 3.任務掛起與恢復 4.任務相關api freertos 提供了多種任務建立的api,這裡主要列舉了動態建立和靜態建立 函式 api 功能描述 xtaskcreate 動態建立,堆疊由 freertos 動態分配 xtaskcreatestatic 靜態建立,堆疊由使用者指定分配 1....

FreeRTOS學習 二 任務掛起和恢復

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