在 ESP32 上,内部应用程序之间的数据交换可以通过多种机制实现。以下是一些常见的方法:
全局变量是最简单的方式之一。你可以在一个文件中定义全局变量,并在其他文件中声明它们。
// 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
}
ESP32 使用 FreeRTOS 作为其操作系统。FreeRTOS 提供了队列机制,可以在任务之间传递数据。
#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() {
// 主循环可以为空
}
信号量可以用于任务之间的同步和简单的数据传递。
#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() {
// 主循环可以为空
}
事件组可以用于任务之间的事件通知。
#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() {
// 主循环可以为空
}
消息缓冲区可以用于任务之间传递较大的数据块。
#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);
领取专属 10元无门槛券
手把手带您无忧上云