freeRTOS 消息队列
队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。
优先级继承:FreeRTOS 支持基于优先级的消息传递,确保高优先级任务在队列操作期间不会被低优先级任务阻塞,多个任务调用 xQueueReceive () 等待数据时,一旦队列有数据,最高优先级的等待任务会被优先唤醒
踩到的坑
我在Task3传入了&name,类型为char **,但是我在task2中用于接收的QueReceive2,类型为char*,这里应该传入&QueReceive2。此时由于我传入的等待时间为portMAX_DELAY,队列内找不到,task2会一直进入阻塞态。
void Task2()
{char *QueReceive2;BaseType_t res;while(1){//只有freeRTOS提供的vTaskDelay()才会让任务进入阻塞态res = xQueueReceive(Que2_Handle, QueReceive2, (TickType_t)portMAX_DELAY);if(res == pdPASS){printf("task2:%s\n\r", QueReceive2);}else{printf("task2:false\r\n");}vTaskDelay(500);}
}
void Task3()
{char *name = "cuijinyu";while(1){uint8_t keynum;keynum = Key_Detect();//判断Task1是否已经被删除if(keynum == KEY1_PRESS||keynum == KEY2_PRESS){xQueueSend(Que1_Handle, &keynum, (TickType_t) portMAX_DELAY);printf(" %d down\r\n", keynum);}else if(keynum == KEY3_PRESS){xQueueSend(Que2_Handle, &name, (TickType_t) portMAX_DELAY); }vTaskDelay(50);}
}