本文导读:
一共分为三部分:
第一部分:任务创建与删除。重点在于理解任务创建的各个参数即可。
第二部分:任务挂起和恢复。函数比较简单,看看即可。
第三部分:时间片调度
重点在于第三部分代码讲解
步骤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 ,
(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 ,
(void * )0 ,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_CRITICAL_EXIT();
记得在创建任务的时候要进入临界区。并且进入临界区之前,要调用CPU_SR_ALLOC(); OSTimeDlyHMSM(1h, 1m, 1s, 1ms)//括号内为参数的实际含义
void OSTaskDel (OS_TCB *p_tcb,
OS_ERR *p_err)
一般不在系统运行时删除:比如a,b使用信号量,删除了a之后,会影响到b任务
当需要暂停但是不需要删除任务的时候,需要执行挂起
void OSTaskSuspend (OS_TCB *p_tcb,
OS_ERR *p_err)
OS_ERR_SCHED_LOCKED
OS_ERR_TASK_SUSPEND_ISR
OS_ERR_TASK_SUSPEND_IDLE
OS_ERR_TASK_SUSPEND_INT_HANDLER
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,
OS_TICK dflt_time_quanta,
OS_ERR *p_err);
void OSSchedRoundRobinYield (OS_ERR *p_err)