FreeRTOS队列

FreeRTOS队列遵循FIFO原则,支持多任务发送和接收。队列创建使用xQueueCreate(),发送数据可选xQueueSendToBack()或xQueueSendToFront(),接收数据用xQueueReceive()。队列操作支持阻塞,并且有优先级控制。

队列正如大家所知为FIFO,一个队列具有队列头与队列尾。FreeRTOS队列元素通过复制这个值到队列中实现。支持多个任务对同一个队列的发送、接收操作,但通常我们在实现业务代码时,使用队列是多个任务向队列发送数据,而一个任务接收队列中的数据,执行业务逻辑。

队列支持读写阻塞,阻塞时间可以由用户自由选择。当多个任务同时要向队列写元素时,如果队列只有一个位置,那么只有最高优先级的任务可以向队列写入。当多个任务同时要从队列读元素时,如果队列只有一个元素,那么只有最高优先级的任务可以从队列读出。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

队列在使用之前必须先创建,我们通过xQueueCreate()创建一个队列,若创建失败,将会返回NULL。我们在使用队列时,调用创建队列时返回的QueueHandle_t类型的句柄。

#define  xQueueCreate(uxQueueLength, uxItemSize)    

### 使用方法 在基于STM32F407 HAL库和FreeRTOS的开发中,队列是重要的任务间通信机制,允许任务间安全传递数据。在使用时,任务或者中断服务程序都能给消息队列发送消息。发送消息时,若队列未满或者允许覆盖入队,FreeRTOS会将消息拷贝到消息队列队尾;否则,会根据用户指定的阻塞超时时间进行阻塞。若队列一直不允许入队,该任务保持阻塞状态等待队列允许入队。当其他任务从其等待的队列中读取数据(队列未满),该任务自动由阻塞态转为就绪态。若任务等待时间超过指定阻塞时间,即使队列还不允许入队,任务也会自动从阻塞态转移为就绪态,此时发送消息的任务或者中断程序会收到错误码errQUEUE_FULL。发送紧急消息时,位置是消息队列队头而非队尾,以便接收者优先接收并及时处理。消息队列发送函数有多个,通过宏定义展开,有些只能在任务调用,有些只能在中断中调用 [^2][^3]。 ### 原理 队列FreeRTOS中为任务间的数据传递提供安全、可靠的机制。它的实现基于特定的数据结构和算法,保证数据在任务间有序传递。当发送消息时,系统会对队列状态进行检查,根据队列是否已满等情况进行不同处理,实现任务的阻塞和唤醒机制,确保数据的正确传递和任务的同步 [^1]。 ### 示例 以下是一个简单的伪代码示例,展示基本的FreeRTOS队列使用: ```c #include "FreeRTOS.h" #include "queue.h" // 创建队列句柄 QueueHandle_t xQueue; void vTaskSender( void *pvParameters ) { int valueToSend = 10; while(1) { // 发送数据到队列 if( xQueueSend( xQueue, &valueToSend, portMAX_DELAY ) == pdPASS ) { // 发送成功处理 } vTaskDelay( pdMS_TO_TICKS( 1000 ) ); } } void vTaskReceiver( void *pvParameters ) { int receivedValue; while(1) { // 从队列接收数据 if( xQueueReceive( xQueue, &receivedValue, portMAX_DELAY ) == pdPASS ) { // 处理接收到的数据 } } } void main( void ) { // 创建队列队列长度为10,每个元素大小为sizeof(int) xQueue = xQueueCreate( 10, sizeof( int ) ); if( xQueue != NULL ) { // 创建发送和接收任务 xTaskCreate( vTaskSender, "Sender", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); xTaskCreate( vTaskReceiver, "Receiver", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); // 启动调度器 vTaskStartScheduler(); } for( ;; ); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ArvinXD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值