UCOSiii任务相关函数

本文详细介绍了UCOSIII操作系统中任务的管理,包括任务创建与删除、任务挂起与解挂,以及时间片轮转调度。重点讲解了OSTaskCreate()、OSTaskDel()、OSTaskSuspend()、OSTaskResume()以及OSSchedRoundRobinCfg()和OSSchedRoundRobinYield()函数的使用,探讨了任务删除和挂起的注意事项,并阐述了如何配置和控制时间片轮转调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:在中断中执行该功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值