rtx任務管理
最後更新:2018-07-26
來源:互聯網
上載者: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, ¶m[0]);
tsk2_1 = os_tsk_create_ex (task2, 1, ¶m[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號