UCOSIII使用总结(三)

1、任务创建: 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: 用来保存调用该函数后返回的错误码

2、任务删除: OSTaskDel()函数
void OSTaskDel (OS_TCB *p_tcb,
OS_ERR *p_err)
*p_tcb : 指向要删除的任务 TCB,也可以传递一个 NULL 指针来删除调用 OSTaskDel()函数的任务自身
*p_err: 指向一个变量用来保存调用 OSTaskDel()函数后返回的错误码

3、任务挂起: OSTaskSuspend()函数
void OSTaskResume (OS_TCB *p_tcb,OS_ERR *p_err)
*p_tcb : 指向需要解挂的任务的 OS_TCB,指向一个 NULL 指针是无效的,因为该任务正在运行,不需要解挂
*p_err : 指向一个变量,用来保存该函数的错误码

4、任务恢复: OSTaskResume()函数
void OSTaskResume (OS_TCB *p_tcb,OS_ERR *p_err)
*p_tcb : 指向需要解挂的任务的 OS_TCB,指向一个 NULL 指针是无效的,因为该任务正在运行,不需要解挂
*p_err : 指向一个变量,用来保存该函数的错误码

5、时间片轮转调度:
OSSchedRoundRobinCfg()函数 使能或失能 UCOSIII 的时间片轮转调度功能
OSSchedRoundRobinYield() 函数 放弃本次时间片轮转调度
void OSSchedRoundRobinCfg ( CPU_BOOLEAN en,
OS_TICK dflt_time_quanta,
OS_ERR p_err)
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 : 保存调用此函数后返回的错误码

void OSSchedRoundRobinYield (OS_ERR *p_err)
*p_err : 用来保存函数调用后返回的错误码
OS_ERR_NONE 调用成功
OS_ERR_ROUND_ROBIN_1 当前优先级下没有其他就绪任务
OS_ERR_ROUND_ROBIN_DISABLED 未使能时间片轮转调度功能
OS_ERR_YIELD_ISR 在中断调用了本函数

6、信号量:
OSSemCreate() 创建一个信号量
OSSemDel() 删除一个信号量
OSSemPend() 等待一个信号量
OSSemPendAbort() 取消等待
OSSemPost() 释放一个信号量
OSSemSet() 强制设置一个信号量的值
6.1创建信号量:
void OSSemCreate ( OS_SEM *p_sem,
CPU_CHAR *p_name,
OS_SEM_CTR cnt,
OS_ERR *p_err)
p_sem : 指向信号量控制块,我们需要按照如下所示方式定义一个全局信号量,并将这个信号量的指针传递给函数 OSSemCreate()
p_name: 指向信号量的名字
cnt : 设置信号量的初始值,如果此值为 1,代表此信号量为二进制信号量,如果大于 1
的话就代表此信号量为计数型信号量

6.2请求信号量:
OS_SEM_CTR OSSemPend ( OS_SEM *p_sem,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err)
p_sem : 指向一个信号量的指针
timeout : 指定等待信号量的超时时间(时钟节拍数),如果在指定时间内没有等到信号量则允许任务恢复执行。如果指定时间为 0 的话任务就会一直等待下去,直到等到信号量
opt : 用于设置是否使用阻塞模式,有下面两个选项
OS_OPT_PEND_BLOCKING 指定信号量无效时,任务挂起以等待信号量
OS_OPT_PEND_NON_BLOCKING 信号量无效时,任务直接返回
p_ts : 指向一个时间戳,用来记录接收到信号量的时刻,如果给这个参数赋值 NULL,则说明用户没有要求时间戳
p_err : 保存调用本函数后返回的错误码

6.3发送信号量:
OS_SEM_CTR OSSemPost ( OS_SEM *p_sem,
OS_OPT opt,
OS_ERR *p_err)
p_sem : 指向一个信号量的指针
opt : 用来选择信号量发送的方式
OS_OPT_POST_1 仅向等待该信号量的优先级最高的任务发送信号量
OS_OPT_POST_ALL 向等待该信号量的所有任务发送信号量
OS_OPT_POST_NO_SCHED 该选项禁止在本函数内执行任务调度操作。即使该函数使得更高优先级的任务结束挂起进入就绪状态,也不会执行任务调度,而是会在其他后续函数中完成任务调度
p_err : 用来保存调用此函数后返回的错误码

7、消息队列
OSQCreate() 创建一个消息队列
OSQDel() 删除一个消息队列
OSQFlush() 清空一个消息队列
OSQPend() 等待消息队列
OSQPendAbort() 取消等待消息队列
OSQPost() 向消息队列发送一条消息

7.1创建消息队列
void OSQCreate (OS_Q *p_q,
CPU_CHAR *p_name,
OS_MSG_QTY max_qty,
OS_ERR *p_err)
p_q : 指向一个消息队列,消息队列的存储空间必须由应用程序分配,我们采用如下的语句定义一个消息队列。
OS_Q Msg_Que;
p_name : 消息队列的名字。
max_qty : 指定消息队列的长度,必须大于 0。当然,如果 OS_MSGs 缓冲池中没有足够多的 OS_MSGs 可用,那么发送消息将会失败,并且返回相应的错误码,指明当前
没有 可用的 OS_MSGs
p_err : 保存调用此函数后返回的错误码

7.2 等待消息队列
void *OSQPend (OS_Q *p_q,
OS_TICK timeout,
OS_OPT opt,
OS_MSG_SIZE *p_msg_size,
CPU_TS *p_ts,
OS_ERR *p_err)
p_q : 指向一个消息队列
timeout : 等待消息的超时时间,如果在指定的时间没有接收到消息的话,任务就会被唤醒,接着运行。这个参数也可以设置为 0,表示任务将一直等待下去,直到接收到消息。opt : 用来选择是否使用阻塞模式,有两个选项可以选择OS_OPT_PEND_BLOCKING 如果没有任何消息存在的话就阻塞任务,一直等待,直到接收到消息
OS_OPT_PEND_NON_BLOCKING 如果消息队列没有任何消息的话任务就直接返回
p_msg_size: 指向一个变量用来表示接收到的消息长度(字节数)。
p_ts : 指向一个时间戳,表明什么时候接收到消息。如果这个指针被赋值为NULL的话,说明用户没有要求时间戳。
p_err : 用来保存调用此函数后返回的错误码

7.3 向消息队列发送消息
void OSQPost (OS_Q *p_q,
void *p_void,
OS_MSG_SIZE msg_size,
OS_OPT opt,
OS_ERR *p_err)
如果有多个任务在等待消息队列的话,那么优先级最高的任务将获得这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,则系统会执行任务调度,等待消息的任务立即恢复运行,而发送消息的任务被挂起。可以通过 opt 设置消息队列是 FIFO 还是 LIFO。如果有多个任务在等待消息队列的消息,则 OSQPost()函数可以设置仅将消息发送给等待任务中优先级最高的任务(opt 设置为 OS_OPT_POST_FIF 或者 OS_OPT_POST_LIFO),也可以将消息发送给 所有等待的任务 (opt 设置 为 OS_OPT_POST_ALL) 。如 果 opt 设置 为OS_OPT_POST_NO_SCHED,则在发送完消息后,会进行任务调度。
p_q : 指向一个消息队列。
p_void : 指向实际发送的内容,p_void 是一个执行 void 类型的指针,其具体含义由用户程序的决定
msg_size : 设定消息的大小,单位为字节数
opt : 用来选择消息发送操作的类型,基本的类型可以有下面四种
OS_OPT_POST_ALL 将消息发送给所有等待该消息队列的任务,需要和选项 OS_OPT_POST_FIFO 或者OS_OPT_POST_LIFO 配合使用
OS_OPT_POST_FIFO 待发送消息保存在消息队列的末尾
OS_OPT_POST_LIFO 待发送的消息保存在消息队列的开头
OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度
可以使用上面四种基本类型来组合出其他几种类型,如下:
OS_OPT_POST_FIFO + OS_OPT_POST_ALL
OS_OPT_POST_LIFO + OS_OPT_POST_ALL
OS_OPT_POST_FIFO + OS_OPT_POST_NO_SCHED
OS_OPT_POST_LIFO + OS_OPT_POST_NO_SCHED
OS_OPT_POST_FIFO + OS_OPT_POST_ALL + OS_OPT_POST_NO_SCHED
OS_OPT_POST_LIFO + OS_OPT_POST_ALL + OS_OPT_POST_NO_SCHED
p_err : 用来保存调用此函数后返回的错误码

8、任务内建消息队列
OSTaskQPend() 等待消息
OSTaskQPendAbort() 取消等待消息
OSTaskQPost() 向任务发送一条消息
OSTaskQFlush() 清空任务的消息队列

8.1 等待任务内建消息
void *OSTaskQPend (OS_TICK timeout,
OS_OPT opt,
OS_MSG_SIZE *p_msg_size,
CPU_TS *p_ts,
OS_ERR *p_err)
timeout : 等待消息的超时时间,如果在指定的时间没有接收到消息的话,任务就会被唤醒,接着运行。这个参数也可以设置为 0,表示任务将一直等待下去,直到接收到消息。
opt: 用来选择是否使用阻塞模式,有两个选项可以选择
OS_OPT_PEND_BLOCKING 如果没有任何消息存在的话就阻塞任务,一直等
待,直到接收到消息
OS_OPT_PEND_NON_BLOCKING 如果消息队列没有任何消息的话任务就直接
返回
p_msg_size: 指向存放消息大小的变量
p_ts: 指向一个时间戳,表明什么时候接收到消息。如果这个指针被赋值为NULL的话,说明用户没有要求时间戳
p_err: 用来保存调用此函数后返回的错误码

8.2 发送任务内建消息
void OSTaskQPost (OS_TCB *p_tcb,
void *p_void,
OS_MSG_SIZE msg_size,
OS_OPT opt,
OS_ERR *p_err)
p_tcb: 指向接收消息的任务的 TCB,可以通过指定一个 NULL 指针或该函数调用者的
TCB 地址来向该函数的调用者自己发送一条消息
p_void: 发送给一个任务的消息
msg_size: 指定发送的消息的大小(字节数)
opt: 指定发送操作的类型,LIFO 和 FIFO 只能二选一
OS_OPT_POST_FIFO 待发送消息保存在消息队列的末尾
OS_OPT_POST_LIFO 待发送的消息保存在消息队列的开头
上面两个选项可以搭配下面这个选项一起使用
OS_OPT_POST_NO_SCHED 指定该选项时,在发送后不会进行任务调度,因
此,该函数的调用者还可以继续运行
p_err : 用来保存调用此函数后返回的错误码

9、事件标志组
OSFlagCreate() 创建事件标志组
OSFlagDel() 删除事件标志组
OSFlagPend() 等待事件标志组
OSFlagPendAbort() 取消等待事件标志组
OSFlagPendGetFlagsRdy() 获取使任务就绪的事件标志
OSFlagPost() 向事件标志组发布标志

9.1 创建事件标志组
void OSFlagCreate ( OS_FLAG_GRP *p_grp,
CPU_CHAR *p_name,
OS_FLAGS flags,
OS_ERR *p_err)
p_grp : 指向事件标志组,事件标志组的存储空间需要应用程序进行实际分配,我们可以按照下面的例子来定义一个事件标志组
OS_FLAG_GRP EventFlag;
p_name : 事件标志组的名字
flags : 定义事件标志组的初始值
p_err : 用来保存调用此函数后返回的错误码

9.2 等待事件标志组
OS_FLAGS OSFlagPend ( OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err)
OSFlagPend()允许将事件标志组里事件标志的“与或”组合状态设置成任务的等待条件。任
务等待的条件可以是标志组里任意一个标志置位或清零,也可以是所有事件标志都置位或清零。如果任务等待的事件标志组不满足设置的条件,那么该任务被置位挂起状态,直到等待的事件标志组满足条件、指定的超时时间到、事件标志被删除或另一个任务终止了该任务的挂起状态。
p_grp : 指向事件标志组
flags : bit 序列,任务需要等待事件标志组的哪个位就把这个序列对应的位置 1,根据设
置这个序列可以是 8bit、16bit 或者 32 比他。比如任务需要等待时间标志组的 bit0
和 bit1 时(无论是等待置位还是清零),flag 是的值就为 0X03
timeout : 指定等待事件标志组的超时时间(时钟节拍数),如果在指定的超时时间内所等待
的一个或多个事件没有发生,那么任务恢复运行。如果此值设置为 0,则任务就将一
直等待下去,直到一个或多个事件发生
opt : 决定任务等待的条件是所有标志置位、所有标志清零、任意一个标志置位还是任
意一个标志清零,具体的定义如下
OS_OPT_PEND_FLAG_CLR_ALL 等待事件标志组所有的位清零
OS_OPT_PEND_FLAG_CLR_ANY 等待事件标志组中任意一个标志清零
OS_OPT_PEND_FLAG_SET_ALL 等待事件标志组中所有的位置位
OS_OPT_PEND_FLAG_SET_ANY 等待事件标志组中任意一个标志置位
调用上面四个选项的时候还可以搭配下面三个选项
OS_OPT_PEND_FLAG_CONSUME 用来设置是否继续保留该事件标志的状态
OS_OPT_PEND_NON_BLOCKING 标志组不满足条件时不挂起任务
OS_OPT_PEND_BLOCKING 标志组不满足条件时挂起任务
这里应该注意选项 OS_OPT_PEND_FLAG_CONSUME 的使用方法,如果我们希望任务等待事件标志组的任意一个标志置位,并在满足条件后将对应的标志清零那么就可以搭配使用选项 OS_OPT_PEND_FLAG_CONSUME
p_ts : 指向一个时间戳,记录了发送、终止和删除事件标志组的时刻,如果为这个指针
赋值 NULL,则函数的调用者将不会收到时间戳
p_err : 用来保存调用此函数后返回的错误码

9.3 向事件标志组发布标志
OS_FLAGS OSFlagPost ( OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
OS_ERR *p_err)
一般情况下,需要进行置位或者清零的标志由一个掩码确定(参数 flags)。OSFlagPost()修
改完事件标志后,将检查并使那些等待条件已经满足的任务进入就绪态。该函数可以对已经置位或清零的标志进行重复置位和清零操作
p_grp : 指向事件标志组
flags : 决定对哪些位清零和置位,当 opt 参数为 OS_OPT_POST_FLAG_SET 的时,参数
flags 中置位的位就会在事件标志组中对应的位也将被置位。当 opt 为
OS_OPT_POST_FLAG_CLR 的时候参数 flags 中置位的位在事件标志组中对应的位将
被清零
opt : 决定对标志位的操作,有两种选项
OS_OPT_POST_FLAG_SET 对标志位进行置位操作
OS_OPT_POST_FLAG_CLR 对标志位进行清零操作
p_err : 保存调用此函数后返回的错误码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值