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 );

  • 相关阅读:
    begin lydsy 2731
    关于js中this关键字的补充
    js中this关键字测试集锦
    js文件中函数前加分号和感叹号是什么意思?
    好用的wget命令从下载添加环境变量到各参数详解
    一个解析json串并组装echarts的option的函数解析
    oschina代码仓库远程push,pull免密实操总结
    yii 核心类classes.php详解(持续更新中...)
    yii2.0归档安装方法
    配置windows 系统PHP系统环境变量
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/15107764.html
Copyright © 2011-2022 走看看