007-ESP32_SDK开发-使用缓存管理传递数据

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

说明

esp32里面跑的是freertos,如果需要传递数据需要使用内部的缓存管理.

代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"

char data[10]="01234567";

static xQueueHandle xQueueHandle1 = NULL;

//任务函数
static void  function(void *pvParameters)
{
    char datarecv[12];
    while(1)
    {
        //如果缓存里面有数据;则取出数据(存储到datarecv); 无限期的等着(portMAX_DELAY),直到有数据
       if(xQueueReceive(xQueueHandle1, &datarecv, portMAX_DELAY)) {
            printf("datarecv=%s
", datarecv);
            fflush(stdout);
        }
    }
}
//任务函数
static void  function_1(void *pvParameters)
{
    while(1)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);//延时约1000ms
        //向缓存管理中存储数据; 如果缓存不够,则等待(最长等待10ms); 存储失败返回 pdFALSE
        xQueueSend(xQueueHandle1, (void *) &data, 10/portTICK_PERIOD_MS);
    }
}


void app_main(void)
{    
    //初始化缓存管理,缓存数据的最大条数是5条,每条数据的长度是10字节
    xQueueHandle1 = xQueueCreate(5, 10);

    xTaskCreate(function, "function", 2048, NULL, 10, NULL);

    xTaskCreate(function_1, "function_1", 2048, NULL, 11, NULL);
}

注意

初始化缓存的时候设置的数据长度是10字节

往缓存里面存储数据的时候,内部就会拷贝10字节.

所以大家伙一定要记住:你设置了缓存时的每一条数据是多大小,那么每次往缓存里面放数据的时候,内部就会拷贝多大小的数据.

如果在中断里面发送数据需要使用下面的函数(在后面的gpio章节中使用了这个)

xQueueSendFromISR

xQueueSendFromISR 和  xQueueSend 函数前两个参数相同

xQueueSendFromISR 的最后一个参数可以写 null

最后一个参数用于保存是否有高优先级任务准备就绪。

如果函数执行完毕后,此参数的数值是pdTRUE,说明有高优先级任务要执行,否则没有

portBASE_TYPE xHigherPriorityTaskWoken;
xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken ){
    /* 实际宏使用了特殊接口 */
  有高优先级别的任务要运行,可以在此切换任务.   
}

如果在中断里面接收数据需要使用下面的函数

xQueueSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );

原文地址:https://www.cnblogs.com/yangfengwu/p/15107764.html