FreeRTOS队列及队列集操作示例

FreeRTOS队列及队列集操作示例 队列QueueHandle_t xQueue; /* 定义队列 */ #define QUEUE_LENGTH 5 /* 队列支持的消息个数 */ #define QUEUE_ITEM_SIZE sizeof(uint8_t) /* 队列中每条消息的大小 */ /* 创建队列 */ xQueue xQueueCreate(QUEUE_LENGTH, QUEUE_ITEM_SIZE); /** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; while (1) { key key_scan(0); if (key ! 0) { xQueueSend(xQueue, key, portMAX_DELAY); /* 将键值作为消息发送到队列中 */ } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint8_t queue_recv 0; uint32_t task2_num 0; while (1) { xQueueReceive(xQueue, queue_recv, portMAX_DELAY); switch (queue_recv) { case KEY0_PRES: /* LCD区域刷新 */ { lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]); break; } case KEY1_PRES: /* LED1闪烁 */ { LED0_TOGGLE(); break; } default: { break; } } } }队列集static QueueSetHandle_t xQueueSet; /* 定义一个队列集 */ QueueHandle_t xQueue1; /* 定义队列1 */ QueueHandle_t xQueue2; /* 定义队列2 */ #define QUEUE_LENGTH 1 /* 队列支持的消息个数 */ #define QUEUE_ITEM_SIZE sizeof(uint32_t) /* 队列中每条消息的大小 */ #define QUEUESET_LENGTH (2 * QUEUE_LENGTH) /* 队列集支持的消息个数 */ #define EVENTBIT_0 (1 0) /* 事件位 */ #define EVENTBIT_1 (1 1) #define EVENTBIT_ALL (EVENTBIT_0 | EVENTBIT_1) /* 创建队列集 */ xQueueSet xQueueCreateSet(QUEUESET_LENGTH); /* 创建队列 */ xQueue1 xQueueCreate(QUEUESET_LENGTH, QUEUE_ITEM_SIZE); xQueue2 xQueueCreate(QUEUESET_LENGTH, QUEUE_ITEM_SIZE); /* 将队列添加到队列集中 */ xQueueAddToSet(xQueue1, xQueueSet); xQueueAddToSet(xQueue2, xQueueSet); /** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; uint8_t eventbit_0 EVENTBIT_0; uint8_t eventbit_1 EVENTBIT_1; while (1) { key key_scan(0); switch (key) { case KEY0_PRES: /* 队列1发送消息 */ { xQueueSend(xQueue1, eventbit_0, portMAX_DELAY); break; } case KEY1_PRES: /* 队列2发送消息 */ { xQueueSend(xQueue2, eventbit_1, portMAX_DELAY); break; } default: { break; } } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint32_t event_val 0; uint32_t event_recv 0; QueueSetMemberHandle_t activate_member NULL; uint32_t task2_num 0; while (1) { activate_member xQueueSelectFromSet(xQueueSet, portMAX_DELAY); /* 等待队列集中的队列接收到消息 */ xQueueReceive(activate_member, event_recv, portMAX_DELAY); /* 接收队列中的消息 */ event_val | event_recv; /* 接收到的消息存入事件中 */ lcd_show_xnum(182, 110, event_val, 1, 16, 0, BLUE); /* 将事件值显示在LCD上 */ if (event_val EVENTBIT_ALL) /* 所有事件都发生 */ { event_val 0; lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]); /* LCD区域刷新 */ } } }