消息队列
消息队列是在消息传输过程中保存消息的容器。消息队列管理器在消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保存消息,直到可以成功接传递它。
消息队列常用于数据的传输,等待消息队列成功后,得到的是消息内容指针
函数接口:
1.等待消息队列
p_q,消息队列对象
timeout,超时时间,默认写0,一直等待
opt,设置当前等待互斥锁的阻塞方式,默认写OS_OPT_PEND_BLOCKING,阻塞等待
p_msg_size,消息的大小
p_ts,用于记录等待消息花了多长时间,默认写NULL,不记录。
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:
NULL,没有接收到消息
非NULL,指向消息内容
注意:
等待消息且使用完毕后,需将消息内容清空,否则在后续的使用可能出现问题。
2.发送消息
p_q,消息队列的对象
p_void,消息的内容
msg_size,消息的大小
opt,OS_OPT_POST_FIFO+OS_OPT_POST_ALL(发送给所有等待消息的任务)或许OS_OPT_POST_FIFO
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
3.创建消息队列
参数:
● p_q,消息队列对象
● p_name,消息队列的名字
● max_qty,消息队列支持多少条消息
● p_err,返回错误码,没有错误的就返回OS_ERR_NONE
消息队列应用实例:
1.串口与任务
将串口接收到的数据写入到g_usart_buf数组中,并将cnt自增,当d为#或者超过数组长度时,将数组首地址和消息大小传递到消息队列中
当接收到消息后,通过串口打印消息队列得到的消息
任务与任务:
事件标志组
前面讲述了UCOSIII的信号量、互斥信号量,它们都可以完成任务的同步。但是有时候一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:
● “或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步;
● “与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。
事件标志组是专门管理标志位,一个事件标志组可以管理32个标志位。
在前后台系统,经常会用到标志位,查询标志位是否置位,有明显的缺点,CPU得不到休息,会一直工作查询,增加CPU的功耗。
函数接口:
创建事件标志组:
p_grp 消息队列的对象
p_name 消息队列的名字
flags 标志位的初值,默认写0
p_err 错误码
等待事件标志组
p_grp,事件标志组对象
flags,要等待哪些标志位;0x01,则等待bit0;0x05,则等待bit0和bit2;0x83,则等待bit0、bit1、bit7。
timeout,超时时间,默认写0,一直等待
opt,默认写以下格式
OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME+OS_OPT_PEND_BLOCKING
OS_OPT_PEND_FLAG_SET_ANY,等待任意一个标志位置位
OS_OPT_PEND_FLAG_CONSUME,等待任意一个标志位成功后,就自动将其清零
OS_OPT_PEND_BLOCKING,阻塞等待
OS_OPT_PEND_FLAG_SET_ALL,等待所有标志位置位,才能跳出阻塞等待
p_ts,用于记录等待事件花了多长时间,默认写NULL,不记录。
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:
返回等待成功的标志位
写入事件标志组
p_grp,事件标志组对象
flags,结合opt参数一起使用。设置/清零哪些标志位,0x01,则对应bit0;0x05,则对应bit0和bit2;0x83,则对应bit0、bit1、bit7。
opt
.OS_OPT_POST_FLAG_SET,对应的bit置位
.OS_OPT_POST_FLAG_CLR,对应的bit清零
p_err,返回错误码,没有错误的就返回OS_ERR_NONE