【笔记2-5】ESP32:freertos消息队列

主要参考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);

}

通过监视串口查看运行效果
在这里插入图片描述

工程可以下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值