以下內容轉載自安富萊電子: http://forum.armfly.com/forum.php
任務優先順序設定注意事項
RTX 作業系統任務優先順序的設定要注意以下幾個問題:
設定任務的優先順序時,數值越小優先順序越低。
最低任務優先順序是 0,此優先順序被空閒任務使用,任何其它任務都不可以使用。
使用者可以設定的優先順序範圍是 1-254,由於 RTX 支援時間片排程,所以也是支援使用者任務設定為相同的優先順序。
優先順序 255 被保留,用於最重要的任務。
任務優先順序設定
除了建立任務時可以設定任務優先順序,也可以通過下面兩個函式修改任務優先順序:
os_tsk_prio
os_tsk_prio_self
函式描述:
函式 os_tsk_prio 用於修改任務的優先順序。
第 1 個引數填任務的 ID。如果 ID 引數是 0,那麼設定就是當前任務的優先順序。
第 2 個引數修改任務的優先順序,如果 new_prio 的數值比當前執行任務的優先順序大,將觸發一次任
務切換,切換到任務 ID 為 task_id 的任務中。 如果 new_pro 的數值比當前執行任務的優先順序小,
當前任務會繼續執行。
如果任務優先順序修改成功,函式返回 OS_R_OK,其餘所有情況返回 OS_R_NOK,比如所寫的任務
ID 不存在或者任務還沒有啟動。
使用這個函式要注意以下幾個問題
1. 引數 new_prio 的範圍是 1-254。
2. 被修改任務的新優先順序會一直保持有效直到使用者再次修改。
3. 優先順序 0 用於空閒任務,如果使用者將這個引數設定為 0 的話,RTX 系統會將其更改為 1。 優先順序 255
被保留用於最重要的任務。
4. 對於 RTX 作業系統來說,優先順序引數中數值越小優先順序越低,也就是說空閒任務的優先順序是最低的,
因為它的優先順序數值是 0
程式碼操練場:
實驗效果就是,建立任務1,優先順序1,任務2,優先順序2,並且兩個任務都不呼叫能引起阻塞的函式,這樣程式一直卡死在任務2中,此時,我們再行測試,再任務二中增加修改任務1優先順序的函式,讓任務1優先順序高於任務2,這樣可以看到任務1執行,任務2被一直“餓死”。
__task void AppTaskStart(void) { AppTaskCreate(); while(1) { os_tsk_prio(HandleTaskLED, 5); // macBeep_TOGGLE(); // os_dly_wait(500); } }
/* 建立啟動任務 */ os_sys_init_user (AppTaskStart, /* 任務函式 */ 4, /* 任務優先順序 */ &AppTaskStartStk, /* 任務棧 */ sizeof(AppTaskStartStk)); /* 任務棧大小,單位位元組數 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任務函式 */ 2, /* 任務優先順序 */ &AppTaskLEDStk, /* 任務棧 */ sizeof(AppTaskLEDStk)); /* 任務棧大小,單位位元組數 */
__task void AppTaskLED(void) { while(1) { macLED3_TOGGLE() ; //os_dly_wait(200); } }