rtx任務管理

來源:互聯網
上載者:User
2013-11-07
--luoqindong
核心初始化函數:
<1> void os_sys_init (
    void (*task)(void) );  /* Task to start */
    初始化並啟動RTX核心,核心起來後運行傳進來的task任務.該任務的優先順序為1, 堆棧大小在rtx_config.c檔案中配置,預設為512位元組.
<2> void os_sys_init_prio (
    void (*task)(void),   /* Task to start */
    U8 priority);         /* Task priority (1-254) */
  與os_sys_init功能一樣, 多了配置task任務優先順序的功能.
    priority範圍為1~254, 0留給idle task使用,255為保留值.如果設定priority為0,核心自動調整為1.


<3> void os_sys_init_user (
    void (*task)(void),    /* Task to start */
    U8    priority,        /* Task priority (1-254) */
    void* stack,           /* Task stack */
    U16   size);           /* Stack size */
    與os_sys_init_prio功能一樣, 多了配置task任務堆棧的功能.
    任務堆棧必須是8位元組對齊,可以這樣定義任務堆棧:
    static U64 stk1[400/8];    /* 400-byte stack */
    因為unsigned long long變數在cortex-m3核心是8位元組對齊的.
    也可以這樣定義:
    static __align(8) u8  stk1[400];


任務建立:


<1> OS_TID os_tsk_create (
    void (*task)(void),    /* Task to create */
    U8    priority );      /* Task priority (1-254) */
    
    傳回值:
    成功返回任務ID號,失敗時返回0.
    
    參數priority指定任務的優先順序,如果為0,核心會將優先順序調整為1(優先順序0給idle task使用),255應該給優先順序最高的任務使用,建議不要使用該優先順序。
    如果建立任務的優先順序比當前任務的大,會立即切換到新任務去運行,否則將新任務放到就緒隊列中(任務狀態為READY).任務使用預設的堆棧大小(512Byte),
    在rtx_confg.c中定義.


<2> OS_TID os_tsk_create_ex (
    void (*task)(void *),    /* Task to create */
    U8    priority,          /* Task priority (1-254) */
    void* argv );            /* Argument to the task */


    傳回值:
    成功返回任務ID號,失敗時返回0.


    在新任務啟動時,可以將argv參數傳遞給任務,其他功能與os_tsk_create函數一樣.


<3> OS_TID os_tsk_create_user(
    void (*task)(void),    /* Task to create */
    U8    priority,        /* Task priority (1-254) */
    void* stk,             /* Pointer to the task's stack */
    U16   size );          /* Number of bytes in the stack */
    
    傳回值:
    成功返回任務ID號,失敗時返回0.


    該函數可以配置任務的堆棧大小,其他功能與os_tsk_create函數一樣.
    任務堆棧必須是8位元組對齊,可以這樣定義任務堆棧:
    static U64 stk1[400/8];    /* 400-byte stack */
    因為unsigned long long變數在cortex-m3核心是8位元組對齊的.
    也可以這樣定義:
    static __align(8) u8  stk1[400];


<4> OS_TID os_tsk_create_user_ex (
    void (*task)(void *),    /* Task to create */
    U8    priority,          /* Task priority (1-254) */
    void* stk,               /* Pointer to the task's stack */
    U16   size,              /* Size of stack in bytes */
    void* argv );            /* Argument to the task */
    
    傳回值:
    成功返回任務ID號,失敗時返回0.


    該函數是os_tsk_create_ex和os_tsk_create_user的合并版本,可以傳argv參數給任務又可以定製任務堆棧大小,其他功能與os_task_create一樣.
    
argv的使用例子:


同時建立兩個task2任務,通過傳進去的參數argv區別是哪一個任務.


#include <rtl.h>


OS_TID tsk1, tsk2_0, tsk2_1;
int param[2] = {0, 1};


__task void task1 (void) {
   ..
  tsk2_0 = os_tsk_create_ex (task2, 1, &param[0]);
  tsk2_1 = os_tsk_create_ex (task2, 1, &param[1]);
   ..
}


__task void task2 (void *argv) {
   ..
  switch (*(int *)argv) {
    case 0:
      printf("This is a first instance of task2.\n");
      break;
    case 1:
      printf("This is a second instance of task2.\n");
      break;
  }
   ..
}


其他相關函數


<1> OS_RESULT os_tsk_delete (
    OS_TID task_id );    /* Id of the task to delete */
    
    傳回值:
  OS_R_OK: 要刪除的任務已停止並已被刪除
    OS_R_NOK: 刪除任務出錯,如任務不存在。
   
    該函數用於刪除一個任務,task_id為要刪除的任務ID號.task_id=0表示刪除當前任務,當前任務被刪除後,
    會從就緒對例中取出優先順序最高的任務運行。


<2> void os_tsk_delete_self (void);
    
    該函數用於刪除當前任務,當前任務被刪除後,會從就緒對例中取出優先順序最高的任務運行。


<3> void os_tsk_pass (void);
    
    主動將CPU控制權轉交給就緒隊例中同優先順序的任務.如果就緒隊例中有和當前任務優先順序(任務A)一樣的任務(任務B),
    核心會切換到任務B去運行.如果沒有與當前任務優先順序一樣的任務,當前任務會繼續運行.
    因為RTX允許任務的優先順序一樣,同優先順序的任務可以調用該函數主動放棄CPU,讓其他同優先順序的任務運行.


<4> OS_RESULT os_tsk_prio (
    OS_TID task_id,       /* ID of the task */
    U8     new_prio );    /* New priority of the task (1-254) */


    傳回值:
    OS_R_OK   任務優先順序修改成功
    OS_R_NOK  修改優先順序失敗
   
    該函數修改任務的優先順序,task_id為要修改的任務ID, new_prio為新優先順序,new_prio範圍為1~254, 0為idle task的
  優先順序,如果new_prio為0,核心自動調整為1。如果task_id = 0,修改的是當前任務的優先順序.如果新任務的優先順序比當前
  任務要高,則切換到新任務運行。
    
<5> OS_RESULT os_tsk_prio_self (
    U8 new_prio );    /* New priority of task (1-254) */
    
    傳回值:
    OS_R_OK   任務優先順序修改成功
    OS_R_NOK  修改優先順序失敗
    
    功能與os_task_prio(0, new_prio)一樣,修改的是當前任務的優先順序.


<6> OS_TID os_tsk_self (void)
    
    傳回值:
    當前任務的ID號
    
    擷取當前任務的ID號.


<7> OS_TID isr_tsk_get (void);
    
    傳回值:
    當前被中斷的任務ID號


  該函數在中斷處理常式中使用,擷取當前被中斷的任務的ID號



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.