首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ESP32内部应用程序之间的数据交换机制

在 ESP32 上,内部应用程序之间的数据交换可以通过多种机制实现。以下是一些常见的方法:

1. 全局变量

全局变量是最简单的方式之一。你可以在一个文件中定义全局变量,并在其他文件中声明它们。

代码语言:javascript
复制
// global.h
#ifndef GLOBAL_H
#define GLOBAL_H

extern int sharedData;

#endif // GLOBAL_H

// main.cpp
#include "global.h"

int sharedData = 0;

void setup() {
    // 初始化代码
}

void loop() {
    // 使用 sharedData
}

// another_file.cpp
#include "global.h"

void someFunction() {
    sharedData = 42; // 修改 sharedData
}

2. FreeRTOS 队列

ESP32 使用 FreeRTOS 作为其操作系统。FreeRTOS 提供了队列机制,可以在任务之间传递数据。

代码语言:javascript
复制
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>

QueueHandle_t queue;

void producerTask(void *pvParameters) {
    int data = 0;
    while (true) {
        data++;
        xQueueSend(queue, &data, portMAX_DELAY);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void consumerTask(void *pvParameters) {
    int receivedData;
    while (true) {
        if (xQueueReceive(queue, &receivedData, portMAX_DELAY)) {
            Serial.println(receivedData);
        }
    }
}

void setup() {
    Serial.begin(115200);
    queue = xQueueCreate(10, sizeof(int));
    xTaskCreate(producerTask, "Producer", 2048, NULL, 1, NULL);
    xTaskCreate(consumerTask, "Consumer", 2048, NULL, 1, NULL);
}

void loop() {
    // 主循环可以为空
}

3. FreeRTOS 信号量

信号量可以用于任务之间的同步和简单的数据传递。

代码语言:javascript
复制
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>

SemaphoreHandle_t semaphore;
int sharedData = 0;

void producerTask(void *pvParameters) {
    while (true) {
        xSemaphoreTake(semaphore, portMAX_DELAY);
        sharedData++;
        xSemaphoreGive(semaphore);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void consumerTask(void *pvParameters) {
    while (true) {
        xSemaphoreTake(semaphore, portMAX_DELAY);
        Serial.println(sharedData);
        xSemaphoreGive(semaphore);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void setup() {
    Serial.begin(115200);
    semaphore = xSemaphoreCreateMutex();
    xTaskCreate(producerTask, "Producer", 2048, NULL, 1, NULL);
    xTaskCreate(consumerTask, "Consumer", 2048, NULL, 1, NULL);
}

void loop() {
    // 主循环可以为空
}

4. FreeRTOS 事件组

事件组可以用于任务之间的事件通知。

代码语言:javascript
复制
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>

EventGroupHandle_t eventGroup;
const int EVENT_BIT = BIT0;

void producerTask(void *pvParameters) {
    while (true) {
        xEventGroupSetBits(eventGroup, EVENT_BIT);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void consumerTask(void *pvParameters) {
    while (true) {
        xEventGroupWaitBits(eventGroup, EVENT_BIT, pdTRUE, pdFALSE, portMAX_DELAY);
        Serial.println("Event received");
    }
}

void setup() {
    Serial.begin(115200);
    eventGroup = xEventGroupCreate();
    xTaskCreate(producerTask, "Producer", 2048, NULL, 1, NULL);
    xTaskCreate(consumerTask, "Consumer", 2048, NULL, 1, NULL);
}

void loop() {
    // 主循环可以为空
}

5. FreeRTOS 消息缓冲区

消息缓冲区可以用于任务之间传递较大的数据块。

代码语言:javascript
复制
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/message_buffer.h>

MessageBufferHandle_t messageBuffer;

void producerTask(void *pvParameters) {
    const char *message = "Hello, World!";
    while (true) {
        xMessageBufferSend(messageBuffer, message, strlen(message), portMAX_DELAY);
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券