zoukankan      html  css  js  c++  java
  • 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 );

  • 相关阅读:
    [Python_3] Python 函数 & IO
    [Python_2] Python 基础
    【一首小诗】每一个难捱的日子都是一首诗
    【排序算法】选择排序(Selection sort)
    【排序算法】冒泡排序(Bubble Sort)
    【待补充】[Python_1] Python 安装
    [IDEA_6] IDEA 集成 Python
    MySQL 的 CURD 操作
    [Spark SQL_1] Spark SQL 配置
    MySQL 基础
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/15107764.html
Copyright © 2011-2022 走看看