🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
队列是任务到任务、中断到任务的数据交流的一种机制(消息传递)
在OS中如果使用全局变量存在弊端:数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损


写队列:
OSQPost( )
{
// 进入临界区(关中断)
写队列实际操作
// 退出临界区(开中断)
}读队列:
OSQPend( )
{
// 进入临界区(关中断)
读队列实际操作
// 退出临界区(开中断)
}队列:读写队列做好了保护,防止多任务同时访问冲突;我们只需要直接调用API函数即可,简单易用!
特点:
注意:写队列不支持阻塞,读队列支持阻塞
队列的主要流程:创建队列 -->写队列 --> 读队列
函数 | 描述 |
|---|---|
OSQCreate() | 创建一个消息队列 |
OSQDel() | 删除一个消息队列 |
OSQFlush() | 清空消息队列中的所有消息 |
OSQPend() | 获取消息队列中的消息 |
OSQPendAbort() | 终止任务挂起等待消息队列 |
OSQPost() | 发送消息到消息队列 |
void OSQCreate( OS_Q* p_q, //指向消息队列结构体的指针
CPU_CHAR* p_name, //指向作为消息队列名的 ASCII 字符串的指针
OS_MSG_QTY max_qty, //消息队列的大小
OS_ERR* p_err //指向接收错误代码变量的指针
)void OSQPost( OS_Q* p_q, //指向消息队列结构体的指针
void* p_void, //指向消息的指针
OS_MSG_SIZE msg_size, //消息的大小,单位: 字节
OS_OPT opt, //函数操作选项:
//OS_OPT_POST_FIFO :将发送的消息保存在队列的末尾 //OS_OPT_POST_LIFO :将发送的消息保存在队列的开头
//OS_OPT_POST_ALL :将消息发送给所有等待该消息的任务 //OS_OPT_POST_NO_SCHED :禁止在本函数内执行任务调度
//以上的几种类型可以进行组合
OS_ERR* p_err //指向接收错误代码变量的指针
) void * OSQPend ( OS_Q* p_q, //指向消息队列结构体的指针
OS_TICK timeout, //任务挂起等待消息队列的最大允许时间,当为0时,表示将一直等待,直到接收到消息
OS_OPT opt, //OS_OPT_PEND_BLOCKING :如果没有任何消息存在的话就阻塞任务
//OS_OPT_PEND_NON_BLOCKING :如果消息队列没有任何消息的话任务就直接返回
OS_MSG_SIZE* p_msg_size, //指向一个变量用来表示接收到的消息长度(字节数)
CPU_TS* p_ts, //指向接收消息队列接收时的时间戳的变量的指针,为NULL,说明用户没有要求时间戳
OS_ERR* p_err //指向接收错误代码变量的指针
)