声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
队列用于通信的, 所以队列也可也叫消息队列.
队列出队阻塞
当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间.
(1) 当阻塞时间 设置为0 的时候为 不阻塞
(2) 当阻塞时间设置为0~portMAX_DELAY 为 阻塞时间就是 设置的时间. 阻塞的时间单位为时钟节拍数.
(3) 当阻塞时间设置为portMAX_DELAY 就是一直持续阻塞.
队列入队阻塞
情况和出队类似.
相关API函数以及使用
1.队列 创建
#define KEYMSG_Q_NUM 1 // 按键消息队列的数量
#define MESSAGE_Q_NUM 4 // 发送数据的消息队列的数量
QueueHandle_t Key_Queue; // 按键消息队列的句柄
QueueHandle_t Message_Queue; // 消息队列的句柄
Key_Queue=xQueueCreate(KEYMSG_Q_NUM,sizeof(u8)); // 创建消息 队列大小为1字节
Message_Queue=xQueueCreate(MESSAGE_Q_NUM,USART_REC_LEN); // 创建请求消息队列.
2.队列发送和接收信息
队列发送和接收信息有两种情况,
第一种 在任务中发送和接收消息
发送:
xQueueSend( xQueue, pvItemToQueue, xTicksToWait )
参数: xQueue 队列句柄
pvItemToQueue 要发送的消息. 在发送过程中是将数据拷贝到队列中的.
xCopyPosition 阻塞时间.
返回值: pdPASS 发送成功
errQUEUE_FULL 队列满了 发送失败
接收:
读取完以后删除消息数据.
xQueueReceive( xQueue, pvBuffer, xTicksToWait )
参数 xQueue 消息句柄
pvBuffer 消息缓冲区
xTicksToWait 阻塞时间
反回值: pdTRUE 接收完成
pdFALSE 接收失败.
第二种 在中断服务函数中发送和接收消息
发送:
xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken )
参数 Message_Queue 队列句柄
pvItemToQueue 要发送的消息
pxHigherPriorityTaskWoken 标记退出中断服务函数后是否需要进行任务切换
当等于pdTRUE 那么 在退出中断服务函数之前一定要进行任务切换
返回值: pdPASS 发送成功
errQUEUE_FULL 队列满了 发送失败
注意: 进行任务切换 即 调用 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken ); 参数传 发送消息的第三个参数进去, 即可.
接收:
读取完以后删除消息数据.
BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken )
参数: xQueue 队列句柄
pvBuffer 数据保存缓冲区
pxHigherPriorityTaskWoken 标记退出此函数以后是否需要进行任务切换. 如果此值为pdTRUE
那么在退出中断函数之前 需要进行任务切换.
反回值: pdTRUE 接收完成
pdFALSE 接收失败.
注意: 进行任务切换 即 调用 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken ); 参数传 接收消息的第三个参数进去, 即可.