1.任务创建与删除
1.1 OSTaskCreate()函数
UCOSIII为多任务系统,系统运行过程中必然存在任务创建,创建任务的实际过程就是将任务控制块,任务堆栈,任务代码等联系在一起,
并且初始化任务控制块的相应字段。在实际生活中。类比我们要造飞机,造飞机不可能一个工厂能够完成,它必须要将飞机中各个部件的制造任务分配出去,而在UCOSIII中,任务就承担了OS运行过程中部分功能。
OSTaskCreat()函数的原型在os_task.c中定义。调用OSTaskCreat()创建一个任务后,刚创建的任务就会进入就绪态。
void OSTaskCreate (OS_TCB *p_tcb,
CPU_CHAR *p_name,
OS_TASK_PTR p_task,
void *p_arg,
OS_PRIO prio,
CPU_STK *p_stk_base,
CPU_STK_SIZE stk_limit,
CPU_STK_SIZE stk_size,
OS_MSG_QTY q_size,
OS_TICK time_quanta,
void *p_ext,
OS_OPT opt,
OS_ERR *p_err)
参数说明:
1.2 OSTaskDel()函数
如果不想使用某个任务了,调用任务删除函数删除这个任务。但一般情况下,尽量避免使用这个函数。
关于使用 注意两点:
1、删除某个任务以后,他占用的OS_TCB和堆栈可以再次利用来创建其他任务。
2、尽管UCOS III允许系统运行中删除任务,但是应该尽量避免这种操作,如果这个任务可能占有与其他任务共享的资源,在这个被占有的资源没有被释放就有可能导致奇怪的结果。
void OSTaskDel (OS_TCB *p_tcb,
OS_ERR *p_err)
*p_tcb: 指向要被删除任务的PCB,也可以 也可以为NULL,即为删除OSTaskDel()函数自身。
*p_err: 指定一个变量来保存OSTaskDel()函数返回的错误码。
1.任务挂起与解挂
2.1 OSTaskSuspend ()函数
任务挂起函数,因为我们的一个任务现在暂时不使用了,但是以后我们会用到,所以我们不能删除它,我们可以使用OSTaskSuspend ()挂起这个任务。
OSTaskSuspend (OS_TCB *p_tcb,
OS_ERR *p_err )
*p_tcb: 指向要被挂起任务的PCB,也可以 也可以为NULL,即为删除OSTaskDel()函数自身。
*p_err: 指定一个变量来保存函数返回的错误码。
2.2 OSTaskResume()函数
解除挂起任务时,采用恢复函数。
OSTaskResume(OS_TCB *p_tcb,
OS_ERR *p_err )
*p_tcb: 指向要被解除挂起的任务的PCB,也可以 也可以为NULL,即为删除OSTaskDel()函数自身。
*p_err: 指定一个变量来保存函数返回的错误码。
3. 时间片轮转调度
当多个任务有相同的优先级时,UCOSIII允许每个任务运行规定的时间片,当任务没有用完分配给它的时间片时,它可以自愿地放弃CPU,当它的时间片已耗尽但任务还没执行完,CPU会剥夺它当前的使用,下一个任务开始执行。同时,UCOSIII允许任务在运行时开启或者关闭循环轮调度。
3.1 OSSSchedRoundRobinCfg()函数
用来使能或失能时间片轮转调度。在使用API函数之前,要先在os_cfg.h中使能时间片轮转调度,将OS_CFG_SCHED_ROUND_ROBIN_EN定义为1,这样有关时间片轮转调度的代码才会被编译。
void OSSchedRoundRobinCfg (CPU_BOOLEAN en,
OS_TICK dflt_time_quanta,
OS_ERR *p_err)
**CPU_BOOLEAN:**设置打开或关闭时间片轮转调度,DEF_ENABLED表示打开DEF_DISABLED表示关闭。
**OS_TICK :**设置时间片长度,系统时钟节拍(时基)的个数,若设置为0,使用默认的时间片长度,系统频率/10。
**OS_ERR :**错误码。
当函数返回 OS_ERR_NONE 则表示设置成功 。
3.2 OSSchedRoundRobinYield()函数
一个任务想放弃本次时间片,把CPU使用权让给同优先级下的另外一个任务执行。
void OSSchedRoundRobinYield (OS_ERR *p_err)
**OS_ERR :**返回的错误码
其返回值有以下值:
OS_ERR_NONE:放弃时间片成功
OS_ERR_ROUND_ROBIN_1:该优先级只有一个任务
OS_ERR_ROUND_ROBIN_DISABLED:时间片轮转未使能
OS_ERR_SCHED_LOCKED:该任务已加锁
OS_ERR_YIELD_ISR:在中断中执行该功能