队列简介
队列是任务到任务、中断到任务的数据交流的一种机制。
读写队列做好了保护,防止多任务同时访问冲突。
- 队列通常采用先进先出(FIFO)数据缓冲机制,也可配置为先进后出(LIFO)方式。
- uCOS3队列数据是一个万能指针,可以指向任何数据。
- 任何任务和中断都可以向队列发送消息,但中断不支持读取。
- 写队列不支持阻塞,读队列支持阻塞。
主要流程:创建队列–>写队列–>读队列
创建队列
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, OS_ERR *p_err)
|
读
1 2 3 4 5 6 7
| 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)
|
示例
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);
|