UCOSIII相关API函数的使用

OSTaskCreate()函数

 

 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)

 

*p_tcb: 指向任务的控制块OS_TCB。

*p_name: 指向任务的名字,我们可以给每个任务取一个名字

p_task : 执行任务代码,也就是函数名字

*p_arg : 传递给任务的参数

prio: 任务优先级,数值越低优先级越高,用户不能使系统的那些优先级!

*p_stk_base:指向任务堆栈的基地址。

stk_limit : 任务堆栈的深度,用来检测和确保不溢出。

stk_size: 任务堆栈大小

q_size:UCOSIII中每个任务都有一可选的内部消息队列,我们要定义宏 OS_CFG_TASK_Q_EN>0 ,这是才会使用个内部消息队列。

time_quanta: 在使能时间片轮转调度用来设置任务的长,默认值为时钟节拍除以 10 。

*p_ext : 指向用户补充的存储区。

opt : 包含任务的特定选项,有如下可以设置。

OS_OPT_TASK_NONE 表示没有任何选项

OS_OPT_TASK_STK_CHK 指定是否允许检测该任务的堆栈

OS_OPT_TASK_STK_CLR 指定是否清除该任务的堆栈

OS_OPT_TASK_SAVE_FP 指定是否存储浮点寄器, CPU 需要有浮点 运算硬件并且有专用代码保存浮点寄器。

*p_err: 用来保存调该函数后返回的错误

 

OSTaskDel()函数

void  OSTaskDel (OS_TCB  *p_tcb,

                 OS_ERR  *p_err)

 

OSTaskDel()函数用来删除任务,当一个任务不需要运行的话,我们就可以将其删除掉,删除任务不说是删除任务代码,而是UCOSIII不在管理这个任务,在有些应用中我们只需要某个任务只运行一次运行完成后就将其删除掉,比如外设初始化任务。

*p_tcb : 指向要删除的任务 TCB ,也可以传递一个 NULL 指针来删除调用 OSTaskDel()函数的任务自身。

*p_err : 指向一个变量用来保存调OSTaskDel()函数后返回的错误码。

 

虽然UCOSIII允许用户在系统运行的时候来删除任务,但是应该尽量避免这样操作,如果多个任务使用同一共享资源,这时候A正在使用这个共享资源,如果删除了任务A,这个资源并没有得到释放,那么其他任务就得不到这个共享资源的使用权,会出现各种奇怪的结果。

我们调用OSTaskDel()删除一个任务后,这的堆栈删除一个任务后,这个任务的堆栈 OS_TCB 所占用的内存并没所占用的内存并没有释放掉,因此我们可以利用他们于其的任务,当然我们也可以使用内存管理方法给务堆栈和 OS_TCB 分配内存,这样当我们删除掉某个任务后就可以使用释放函数将个任务的任务堆栈和 OS_TCB 所占用的内存空间释放掉。

 

UCOSIII任务挂起和恢复

 

OSTaskSuspend()函数

void   OSTaskSuspend ( OS_TCB  *p_tcb,

                       OS_ERR  *p_err)

 

有时候有些任务应为某些原因需要暂停运行,但是以后还要运行,因此我们就不能删除掉任务,这里我们可以使用OSTaskSuspend()函数挂起这个任务,以后再回复运行

*p_tcb: 指向需要挂起的任务 OS_TCB ,可以通过指向一个 NULL 指针将调用该函数的任务挂起。

*p_err : 指向一个变量,用来保存该函数的错误码 。

我们可以多次调用OSTaskSuspend ()函数来挂起一个任务,因此我们需要调用同样次的OSTaskResumeOSTaskResume() 函数才可以恢复被挂起的任务,这一点非常重要。

 

OSTaskResume()函数

void  OSTaskResume (OS_TCB  *p_tcb,

                    OS_ERR  *p_err)

 

OSTaskResume() 函数用来恢复被OSTaskSuspend()挂起的任务,OSTaskResume() 函数是唯一能恢复被挂起任务的函数。如果被挂起的任务还还在等待别内核对象,比如事件标志组、信号量、互斥消息队列等,,即使用OSTaskResume() 函数恢复了被挂起的任务,该务也不一定能立即运行,该任还是要等相应的内核对象后才可以继续运行。

*p_tcb: 指向需要解挂的任务OS_TCB ,指向一个 ,指向一个 NULL 指针是无效的,因为该任务正在运行,不需要解挂。

*p_err : 指向一个变量,用来保存该函数的错误码 。

 

UCOSIII时间片轮转调度

我们说过UCOSIII是支持多个任务拥有同一优先级的,这些任务采用时间片轮转调度方法进行任务调度。在 os_cfg.h 文件中有个宏文件中有个宏 OS_CFG_SCHED_ROUND_ROBIN_EN ,我们要想使用时间片轮转调度就需要将 OS_CFG_SCHED_ROUND_ROBIN_ EN 定义为1,这样 UCOSIII 中有关时间片轮转调度的代码才会被编译,否则不能使用时间片轮转调度。

 

OSSchedRoundRobinCFG()函数

OSSchedRoundRobinCfg (CPU_BOOLEAN   en,

                      OS_TICK       dflt_time_quanta,

                      OS_ERR       *p_err)

 

OSSchedRoundRobinCFG()函数用来使能或者失能UCOSIII,如果我们要使用时间片轮转调度功能的话不仅要将宏OS_CFG_SCHED_ROUND_ROBIN_EN定义为1,还需要调用OSSChedRoundRobinCfg()函数来使能UCOSIII

en:用于设置打开或关闭时间片轮转调度机制,如果为DEF_ENABLED表示打开的时间片轮转调度,为DEF_DISABLED表示关闭时间片轮转调度。

dflt_time_quanta:设置默认的时间片长度,及时系统时钟节拍个数,比如我们设置系统时钟频率OSCfg_TickRate_Hz为200Hz,那么每个时钟街拍就是5ms。当我们设置dflt_time_quanta为n时,时间片长度就是(5*n)ms长,如果我们设置dflt_time_quanta为0的话,UCOSIII就会使用系统默认的时间片长度:OSCfg_TickRate_Hz/10,比如如果OSCfg_TickRate_Hz为200,那么时间长度片为:200/10*5=100ms。

*p_err:保存调用次函数后返回的错误码

 

OSSchedRoundRobinYield()函数

OSSchedRoundRobinYield(OS_ERR  *p_err)

 

当一个任务想放弃本时间片,把CPU的使用权让给同优先级下的另外一个任务就可以使用OSSchedRoundRobinYield()函数

*p _err: 用来保存函数调后返回的错误码 。

OS_ERR_NONE 调用成功

OS_ERR_ROUND_ROBIN_1 当前优先级下没有其他就绪任务

OS_ERR_ROUND_ROBIN_DISABLED 未使能

OS_ERR_YIELD_ISR 在中断调用了本函数

我们在调用这个后函数遇到最多的错误就是OS_ERR_ROUND_ROBIN_1,也就是当前优先级下没有就绪任务了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值