xQueueReceive()
用于从队列中接收
(
读取)数据单元。接收到的单元同时会从队列
中删除。
xQueuePeek()
也是从从队列中接收数据单元,不同的是并不从队列中删出接收到
的单元。
uxQueueMessagesWaiting()用于查询队列中当前有效数据单元个数。
写队列任务的代码实现:
这个任务被创建了两个实例,一个不
停地往队列中写数值
100
,而另一个实例不停地往队列中写入数值
200
。任务的入口参
数被用来为每个实例传递各自的写入值。
static void vSenderTask( void *pvParameters )
{
long lValueToSend;
portBASE_TYPE xStatus;
/* 该任务会被创建两个实例,所以写入队列的值通过任务入口参数传递 – 这种方式使得每个实例使用不同的
值。队列创建时指定其数据单元为long型,所以把入口参数强制转换为数据单元要求的类型 */
lValueToSend = ( long ) pvParameters;
/* 和大多数任务一样,本任务也处于一个死循环中 */
for( ;; )
{
/* 往队列发送数据
第一个参数是要写入的队列。队列在调度器启动之前就被创建了,所以先于此任务执行。
第二个参数是被发送数据的地址,本例中即变量lValueToSend的地址。
第三个参数是阻塞超时时间 – 当队列满时,任务转入阻塞状态以等待队列空间有效。本例中没有设定超
时时间,因为此队列决不会保持有超过一个数据单元的机会,所以也决不会满。
*/
xStatus = xQueueSendToBack( xQueue, &lValueToSend, 0 );
if( xStatus != pdPASS )
{
/* 发送操作由于队列满而无法完成 – 这必然存在错误,因为本例中的队列不可能满。 */
vPrintString( "Could not send to the queue.\r\n" );
}
/* 允许其它发送任务执行。 taskYIELD()通知调度器现在就切换到其它任务,而不必等到本任务的时
间片耗尽 */
taskYIELD();
}
}