本文导读: 一共分为三部分: 第一部分:任务创建与删除。重点在于理解任务创建的各个参数即可。 第二部分:任务挂起和恢复。函数比较简单,看看即可。 第三部分:时间片调度 重点在于第三部分代码讲解 |
- 步骤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)
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)
|