发布时间:2025-02-22 10:32:48    次浏览
要使用队列,必须首先建立队列,建立队列后,在任务中检测队列中是否有数据,若有数据,则进行处理。xQueueHandlexQueueRx;staticvoidvOnCommunicationTask(void*pvParameters){portCHARcChar;xQueueRx = xQueueCreate(20, sizeof(u8));/*创建一个深度为20的队列*/while(1){if(xQueueReceive(xQueueRx, cChar, 10/portTICK_RATE_MS)==pdTRUE) /*队列中有数据*/{printf('%c',cChar);/*输出数据*///做其他处理}}}在串口中断服务程序中,将接收到的数据放入队列中,并检测是否有更高优先级的TASK被解除阻塞void USART1_IRQHandler(void){portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;u8 cChar;/*接收中断,并且接收缓冲不满*/if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET rec_f==0){cChar = USART_ReceiveData(USART1);xQueueSendToBackFromISR(xQueueRx, cChar, xHigherPriorityTaskWoken); /*有更高优先级的TASK被解除阻塞,ze xHigherPriorityTaskWoken为true*/portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );}}int main(void){/* 创建的队列用于保存最多5个值,每个数据单元都有足够的空间来存储一个long型变量 */prvSetupHardware(); /*硬件初始化*/xTaskCreate( v LEDTask, 'LEDTASK', configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL );xTaskCreate( vOnCommunicationTask, 'oncommunication', configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL );/*Start the FreeRTOSscheduler*/vTaskStartScheduler();while (1){}}原文链接:http://www.eeworld.com.cn/mcu/article_2016101830560.html