前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >007-ESP32_SDK开发-使用缓存管理传递数据

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

作者头像
杨奉武
发布2021-12-01 15:04:28
4610
发布2021-12-01 15:04:28
举报
文章被收录于专栏:知识分享知识分享

说明

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

代码

代码语言:javascript
复制
#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\n", 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,说明有高优先级任务要执行,否则没有

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • esp32里面跑的是freertos,如果需要传递数据需要使用内部的缓存管理.
    • 代码
    • 注意
      • 初始化缓存的时候设置的数据长度是10字节
        • 往缓存里面存储数据的时候,内部就会拷贝10字节.
          • 所以大家伙一定要记住:你设置了缓存时的每一条数据是多大小,那么每次往缓存里面放数据的时候,内部就会拷贝多大小的数据.
          • 如果在中断里面发送数据需要使用下面的函数(在后面的gpio章节中使用了这个)
            • xQueueSendFromISR
              • xQueueSendFromISR 和 xQueueSend 函数前两个参数相同
                • xQueueSendFromISR 的最后一个参数可以写 null
                  • 最后一个参数用于保存是否有高优先级任务准备就绪。
                    • 如果函数执行完毕后,此参数的数值是pdTRUE,说明有高优先级任务要执行,否则没有
                    • 如果在中断里面接收数据需要使用下面的函数
                      • xQueueSendFromISR( xQueueHandle pxQueue, const void *pvItemToQueue, portBASE_TYPE *pxHigherPriorityTaskWoken );
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档