继续上一篇任务创建
【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】-CSDN博客】
今天要实现消息队列进行任务的通讯
一、从上一篇信号量通讯demo拷贝一份重命名,还是之前的两个任务,重命名了。
xTaskCreatePinnedToCore(SendQueueTask,"SendQueueTask",2048,NULL,4,NULL,1);xTaskCreatePinnedToCore(GetQueueTask,"GetQueueTask",2048,NULL,4,NULL,1);
二、看下今天要用到的API
1、xQueueCreate(uxQueueLength, uxItemSize)创建队列【uxQueueLength队列长度,uxItemSize队列类型的大小】返回队列句柄
2、xQueueSend(xQueue, pvItemToQueue, xTicksToWait)发送消息【xQueue句柄,pvItemToQueue发送数据,xTicksToWait等待时间】
3、xQueueReceive(QueueHandle_t xQueue, void *const pvBuffer, TickType_t xTicksToWait)接收消息【xQueue句柄,pvBuffer接收缓存,xTicksToWait等待时间】
注意:中断中使用是要带FromISR的API
三、创建队列【注意队列的创建需要再任务之前就创建好】
三、函数中增加消息的发送和接收。
QueueHandle_t s_tQueue;void SendQueueTask(void *param)
{uint8_t ucSendData = 0;while(1){xQueueSend(s_tQueue, &ucSendData, 1000 / portTICK_PERIOD_MS);printf("send queue task,value=%d\r\n", ucSendData++);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}void GetQueueTask(void *param)
{uint8_t ucRecvData;while(1){if (pdTRUE == xQueueReceive(s_tQueue, &ucRecvData, portMAX_DELAY))printf("recv queue data = %d\r\n", ucRecvData);}
}
这里需要注意的是:
1、任务中数据类型要和创建时候定义的类型一样。当然也可以是结构体。
四、下载验证,【发送任务1000ms发送0开始加1的数据,接收任务1000ms接收到数据,并打印接收的数据】
可以看到结果实验结果正确了。下一篇我们一起用事件组来任务通讯。