FreeRTOS-在队列发送读取数据小实验
实验目的
创建一个队列,按下 KEY1 向队列发送数据,按下 KEY2 向队列读取数据。
实验代码:
void StarTaskSend(void const * argument)
{
/* USER CODE BEGIN StarTaskSend */
uint16_t buf = 100;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET) //判断PA0这个引脚是不是低电平,表示按键1被按下
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)//消抖操作
{
status = xQueueSend(myQueueHandle,&buf,0);
if(status == pdTRUE)//判断status中是否有值,有值代表写入成功
printf("写入队列成功,写入值%d\r\n",buf);
else
printf("写入队列失败\r\n");
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET);//当检测到按键1有上升沿的时候退出循环
}
osDelay(10);
}
/* USER CODE END StarTaskSend */
}
/* USER CODE BEGIN Header_StartTaskReceive */
/**
* @brief Function implementing the taskReceive thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTaskReceive */
void StartTaskReceive(void const * argument)
{
/* USER CODE BEGIN StartTaskReceive */
uint16_t buf ;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET) //判断PA0这个引脚是不是低电平,表示按键1被按下
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)//消抖操作
{
status = xQueueReceive(myQueueHandle,&buf,0);
if(status == pdTRUE)//判断status中是否有值,有值
printf("读入队列成功,读入值:%d\r\n",buf);
else
printf("读入队列失败\r\n");
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET);//当检测到按键1有上升沿的时候退出循环
}
osDelay(10);
}
/* USER CODE END StartTaskReceive */
}
实验结果:
结果分析:因为写入了两次100,所以可以读出两次100,在读第三次的时候,就会显示读取失败,同样的,输入16个数据之后,就会写入不进去,因为定义的队列是16大小的,必须要读出之后,才能写入。