继续上一篇任务创建
【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接收到数据,并打印接收的数据】
可以看到结果实验结果正确了。下一篇我们一起用事件组来任务通讯。