前言
本文主要带大家了解队列的基本知识和队列的基本操作。
一、队列基本知识介绍
队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。(本段话取自正点原子freeRTOS开发手册这里只做简单介绍想要详细了解可以去看看原子的手册,这里主要教大家如何去配置和使用队列)
二、队列的基本操作
cubeMX配置
1.Queue name:队列名字
2.Queue size:队列大小
3.Lite size:队列里面每一个数据的类型
代码讲解
1.cubeMX自动生成的创建队列代码
/* Create the queue(s) */ /* definition and creation of myQueue01 */ osMessageQDef(myQueue01, 16, uint16_t); myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL); /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */
2.把一个消息写入队列函数
/** * @brief Put a Message to a Queue. * @param queue_id message queue ID obtained with \ref osMessageCreate. * @param info message information. * @param millisec timeout value or 0 in case of no time-out. * @retval status code that indicates the execution status of the function. * @note MUST REMAIN UNCHANGED: \b osMessagePut shall be consistent in every CMSIS-RTOS. */ osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) { portBASE_TYPE taskWoken = pdFALSE; TickType_t ticks; ticks = millisec / portTICK_PERIOD_MS; if (ticks == 0) { ticks = 1; } if (inHandlerMode()) { if (xQueueSendFromISR(queue_id, &info, &taskWoken) != pdTRUE) { return osErrorOS; } portEND_SWITCHING_ISR(taskWoken); } else { if (xQueueSend(queue_id, &info, ticks) != pdTRUE) { return osErrorOS; } } return osOK; }
3.从队列中读出消息函数
/** * @brief Get a Message or Wait for a Message from a Queue. * @param queue_id message queue ID obtained with \ref osMessageCreate. * @param millisec timeout value or 0 in case of no time-out. * @retval event information that includes status code. * @note MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS. */ osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec) { portBASE_TYPE taskWoken; TickType_t ticks; osEvent event; event.def.message_id = queue_id; event.value.v = 0; if (queue_id == NULL) { event.status = osErrorParameter; return event; } taskWoken = pdFALSE; ticks = 0; if (millisec == osWaitForever) { ticks = portMAX_DELAY; } else if (millisec != 0) { ticks = millisec / portTICK_PERIOD_MS; if (ticks == 0) { ticks = 1; } } if (inHandlerMode()) { if (xQueueReceiveFromISR(queue_id, &event.value.v, &taskWoken) == pdTRUE) { /* We have mail */ event.status = osEventMessage; } else { event.status = osOK; } portEND_SWITCHING_ISR(taskWoken); } else { if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) { /* We have mail */ event.status = osEventMessage; } else { event.status = (ticks == 0) ? osOK : osEventTimeout; } } return event; }
总结
队列操作大家可以试一试还是很简单的。