消息队列

Pursue

队列简介

队列是任务到任务、中断到任务的数据交流的一种机制。

读写队列做好了保护,防止多任务同时访问冲突。

  • 队列通常采用先进先出(FIFO)数据缓冲机制,也可配置为先进后出(LIFO)方式。
  • uCOS3队列数据是一个万能指针,可以指向任何数据。
  • 任何任务和中断都可以向队列发送消息,但中断不支持读取。
  • 写队列不支持阻塞,读队列支持阻塞。

主要流程:创建队列–>写队列–>读队列

API函数

创建队列

1
2
3
4
void  OSQCreate (OS_Q        *p_q,      //指向消息队列结构体指针
CPU_CHAR *p_name, //队列名字
OS_MSG_QTY max_qty, //队列长度
OS_ERR *p_err) //错误代码

1
2
3
4
5
void  OSQPost (OS_Q         *p_q,       //指向消息队列结构体指针
void *p_void, //指向消息指针
OS_MSG_SIZE msg_size, //消息大小
OS_OPT opt, //FIFO|POST_ALL
OS_ERR *p_err) //错误代码

1
2
3
4
5
6
7

void *OSQPend (OS_Q *p_q, //指向消息队列结构体指针
OS_TICK timeout, //任务挂起时间,0:一直等待
OS_OPT opt, //OS_OPT_PEND_BLOCKING or OS_OPT_PEND_NON_BLOCKING
OS_MSG_SIZE *p_msg_size, //接收消息长度
CPU_TS *p_ts, //NULL,时间戳
OS_ERR *p_err) //错误代码

示例

1
2
3
4
5
6
7
8
9
10
OS_Q key_queen;
char buf[] = {"helloworld"};

OSQCreate (&key_queen, "key_queen", 1, &err);

OSQPost(&key_queen, &buf[0], sizeof(buf), OS_OPT_POST_FIFO, &err);

char *buf2;
OS_MSG_SIZE size = 0;
buf2 = OSQPend(&key_queen, 0, OS_OPT_PEND_BLOCKING, &size, 0, &err);
评论