2、FreeRTOS之队列管理

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(); 
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值