ucosIII 任務建立與刪除,任務掛起與恢復,時間片輪轉排程
阿新 • • 發佈:2019-02-14
本文導讀:
一共分為三部分:
第一部分:任務建立與刪除。重點在於理解任務建立的各個引數即可。
第二部分:任務掛起和恢復。函式比較簡單,看看即可。
第三部分:時間片排程
重點在於第三部分程式碼講解
任務建立與刪除 |
建立 |
- 步驟1:先呼叫OSTaskCreate建立任務 步驟2:使用OSStart(&err)開啟任務
- 切記:在沒有使用時間片輪轉的時候,任何任務的優先順序不能相同
- 任務建立思路,在main中只建立一個start任務,然後在其中建立其他任務
//任務優先順序
#define TASK2_TASK_PRIO 4
//任務堆疊大小
#define TASK2_STK_SIZE 128
//任務控制塊
OS_TCB Task2_TaskTCB;
//任務堆疊
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
//任務函式
void task2_task(void *p_arg);
CPU_SR_ALLOC();
...
OS_CRITICAL_ENTER(); //進入臨界區
//任務建立
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務控制塊
(CPU_CHAR * )"start task" , //任務名稱
(OS_TASK_PTR )start_task, //任務函式
(void * )0, //任務函式的引數,一般不用,這裡直接設定為0
(OS_PRIO )START_TASK_PRIO, //任務優先順序
(CPU_STK * )&START_TASK_STK[0], //任務堆疊基址
(CPU_STK_SIZE)START_STK_SIZE/10 , //任務堆疊的棧深
(CPU_STK_SIZE)START_STK_SIZE, //任務堆疊大小
(OS_MSG_QTY )0, //內建訊息佇列長度
(OS_TICK )0, //時間片長度(單位時鐘節拍)。0:表示為預設值。為OS_CFG_TICK_RATE 200u/10.為20個節拍,也就是100ms
(void * )0, //使用者補充的儲存區,用於擴充套件PCB,一般不用。
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //選擇檢查和清除STK功能(SAVE_FP浮點處理的,不用管,移植的時候已經處理)
(OS_ERR * )&err); //錯誤資訊
OS_CRITICAL_EXIT(); //退出臨界區
- 記得在建立任務的時候要進入臨界區。並且進入臨界區之前,要呼叫CPU_SR_ALLOC();
OSTimeDlyHMSM(1h, 1m, 1s, 1ms)//括號內為引數的實際含義
刪除 |
void OSTaskDel (OS_TCB *p_tcb, //需要刪除的PCB
OS_ERR *p_err) //錯誤資訊
- 一般不在系統執行時刪除:比如a,b使用訊號量,刪除了a之後,會影響到b任務
任務掛起與恢復 |
掛起 |
當需要暫停但是不需要刪除任務的時候,需要執行掛起
void OSTaskSuspend (OS_TCB *p_tcb,
OS_ERR *p_err)
- 可能的err值
OS_ERR_SCHED_LOCKED //you can't suspend the current task is the scheduler is locked
//(ISR中斷服務函式)
OS_ERR_TASK_SUSPEND_ISR //if you called this function from an ISR
OS_ERR_TASK_SUSPEND_IDLE //if you attempted to suspend the idle task which is not allowed.
OS_ERR_TASK_SUSPEND_INT_HANDLER //if you attempted to suspend the idle task which is not
恢復 |
void OSTaskResume (OS_TCB *p_tcb,
OS_ERR *p_err)
- 掛起和恢復比較簡單。隨便寫寫程式碼即可。
時間片輪轉 |
時間片排程是ucosIII才有的,ucosII是沒有的。
時間片排程初步 |
時間片排程是通過OS_SchedRoundRobin()進行的。
該函式由OSTimeTick或者OS_IntQTask()呼叫的
配置 |
步驟一:OS_CFG_SCHED_ROUND_ROBIN_EN 巨集置為一
步驟二:呼叫OSSchedRoundRobinCfg 進行配置
void OSSchedRoundRobinCfg (CPU_BOOLEAN en,
//兩個之間多少時鐘節拍,0:為預設的OS_CFG_TICK_RATE/10
OS_TICK dflt_time_quanta,
OS_ERR *p_err);
放棄時間片 |
void OSSchedRoundRobinYield (OS_ERR *p_err)