1. 程式人生 > >ucosIII 任務建立與刪除,任務掛起與恢復,時間片輪轉排程

ucosIII 任務建立與刪除,任務掛起與恢復,時間片輪轉排程

本文導讀:
一共分為三部分:
第一部分:任務建立與刪除。重點在於理解任務建立的各個引數即可。
第二部分:任務掛起和恢復。函式比較簡單,看看即可。
第三部分:時間片排程
重點在於第三部分程式碼講解
任務建立與刪除
建立
  • 步驟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)