一、队列简介:队列也称为消息队列,是一种用于消息间进行通信的数据结构,队列可以用于任务与任务之间、中断与任务之间传递消息,队列通常采用先进先出(FIFO)的数据缓冲机制。
二、队列常见的API函数
1.创建队列
2.写队列
3.读队列
三、实验操作
需求:创建一个队列,按下KEY1向队列发送数据,按下KEY2向队列读取数据。
CubeMX配置信息:
创建队列,CubeMX已经封装好了,和原始的函数有点差别:
StartTaskSend函数:
void StartTaskSend(void const * argument)
{
uint16_t buf = 100;
BaseType_t status;
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
{
status = xQueueSend(myQueue01Handle,&buf,0);
if(status == pdTRUE)
printf("写入队列成功,写入值%d\r\n",buf);
else
printf("写入队列失败\r\n");
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);
}
osDelay(1);
}
}
StartTaskRecive函数:
void StartTaskRecive(void const * argument)
{
uint16_t buf ;
BaseType_t status;
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
{
status = xQueueReceive(myQueue01Handle,&buf,0);
if(status == pdTRUE)
printf("读取队列成功,读出值%d\r\n",buf);
else
printf("读取队列失败\r\n");
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);
}
osDelay(1);
}
}
实验结果:通过按键1按三次,写入值三次;按按键2三次,读出值3次,按第四次读取失败。