一、什么是队列?
队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任
务间传递信息。
为什么不使用全局变量?
如果使用全局变量,兔子(任务
1
)修改了变量
a
,等待树獭(任务
3
)处理,但树獭处理速度很
慢,在处理数据的过程中,狐狸(任务
2
)有可能又修改了变量
a
,导致树獭有可能得到的不是
正确的数据。
在这种情况下,就可以使用队列。兔子和狐狸产生的数据放在流水线上,树獭可以慢慢一个个依
次处理。
关于队列的几个名词:
队列项目
:队列中的每一个数据;
队列长度
:队列能够存储队列项目的最大数量;
创建队列时,需要指定队列长度及队列项目大小。
队列特点
1.
数据入队出队方式
通常采用
先进先出
(
FIFO
)的数据存储缓冲机制,即先入队的数据会先从队列中被读取。
也可以配置为后进先出(
LIFO
)方式,但用得比较少。
2.
数据传递方式
采用实际值传递,即将数据拷贝到队列中进行传递,也可以传递指针,在传递较大的数据的时候
采用指针传递。
3.
多任务访问
队列不属于某个任务,任何任务和中断都可以向队列发送
/
读取消息
4.
出队、入队阻塞
当任务向一个队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队。
阻塞时间如果设置为:

二、队列相关 API 函数
1. 创建队列

2. 写队列
写队列总共有以下几个函数:


3. 读队列
读队列总共有以下几个函数:


三、实操
实验需求
创建一个队列,按下
KEY1
向队列发送数据数据依次加一,按下
KEY2
向队列读取数据。
四、cubeMX配置

五、代码实现
/* USER CODE BEGIN Header_recive_fun */
/**
* @brief Function implementing the recive_task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_recive_fun */
void recive_fun(void *argument)
{
/* USER CODE BEGIN recive_fun */
/* Infinite loop */
for(;;)
{
uint16_t data=0;
BaseType_t status;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
{
osDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
osDelay(20);
printf("KEY2 press down\r\n");
status = xQueueReceive(myQueue01Handle, &data, 0);
if(status==pdTRUE)
{
printf("read succuse ,read data:%d\r\n",data);
}
else
{
printf("read error\r\n");
}
}
}
/* USER CODE END recive_fun */
}
/* USER CODE BEGIN Header_send_fun */
/**
* @brief Function implementing the send_task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_send_fun */
void send_fun(void *argument)
{
/* USER CODE BEGIN send_fun */
/* Infinite loop */
for(;;)
{
static uint16_t data=0;
BaseType_t status;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET)
{
osDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
osDelay(20);
data++;
printf("KEY1 press down\r\n");
printf("write succuse ,write data:%d\r\n",data);
status = xQueueSend(myQueue01Handle, &data, 0);
if(status==pdTRUE)
{
printf("write succuse\r\n");
}
else
{
printf("write error\r\n");
}
}
}
/* USER CODE END send_fun */
}
六、运行截图
