RTX——第8章 任務優先順序修改

weixin_34391854發表於2017-08-09

 

以下內容轉載自安富萊電子: 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);

    }
}

 

相關文章