主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发板用ESP-WROOM-32,其实坑还挺多的,慢慢来吧。
队列是任务间通信的主要形式,关于队列,主要有以下5个函数。
- 第1个是队列创建函数xQueueCreate(),有2个参数
①是队列的总容量
②是队列中每个成员所占内存大小
创建队列成功后会返回队列的句柄,后续对队列的读写操作都是通过队列句柄。
- 第2个是函数xQueueSend(),向队列头发送消息,有3个参数
①是队列句柄
②是要发送的消息指针,这里是将指针内容拷贝发送,而不是发送该指针
③是等待时间,超过等待时间后还没能成功发送将会返回FALSE
- 第3个是函数xQueueSendToBack,向队列尾部发送消息,和上一个函数基本一样,只是发送到尾部
- 第4个是函数xQueueReceive,从函数接收一条消息,有3个参数
①是队列句柄
②是接收消息缓冲区指针
③是等待时间,超时就会返回FALSE
- 第5个是函数xQueueSendFromISR,xQueueSend 的中断版本,带ISR的函数都是中断版本,只能在中断处理函数中执行,有3个参数。
①是队列句柄
②是消息指针
③是指出是否有高优先级的任务被唤醒,此参数的意思是,假如当前使用队列的任务A优先级是3,等待队列的任务B优先级是4,此时发生了中断,此函数发现高优先级的任务B就绪了,在中断结束后会手动调度,执行任务B以保证高优先级任务执行。
消息队列的简单应用代码如下,创建了两个任务,任务A用于从队列中读取数据并输出,任务B用于每1秒向队列写入递增的数据
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "esp_log.h"
#include <string.h>QueueHandle_t queue_handle_t = NULL;typedef struct {int value;
}queue_data_t;void taskA(void* param)
{queue_data_t data;while(1){if(pdTRUE == xQueueReceive(queue_handle_t , &data , 100)){ESP_LOGI("QUEUE" , "receive value : %d",data.value);}}
}void taskB(void* param)
{queue_data_t data;memset(&data , 0 , sizeof(queue_data_t));while(1){xQueueSend(queue_handle_t , &data , 100);vTaskDelay(pdMS_TO_TICKS(1000));data.value++;}
}void app_main(void)
{queue_handle_t = xQueueCreate(10 , sizeof(queue_data_t));xTaskCreatePinnedToCore(taskA , "taskA" , 2048 , NULL , 3 , NULL , 1);
xTaskCreatePinnedToCore(taskB , "taskB" , 2048 , NULL , 3 , NULL , 1);}
通过监视串口查看运行效果
工程可以下载