ESP32 Arduino 使用队列:FreeRTOS 实现异步数据传递
在 ESP32 上使用队列可以通过使用 FreeRTOS 的 API 来实现。下面是一个简单的示例代码,展示了如何在 ESP32 上使用队列:\n\ncpp\n#include \"Arduino.h\"\n#include \"freertos/queue.h\"\n\nconst int queueSize = 10;\nQueueHandle_t myQueue;\n\nvoid task1(void *pvParameter) {\n while (1) {\n // 从队列中接收数据\n int data;\n xQueueReceive(myQueue, &data, portMAX_DELAY);\n \n // 处理接收到的数据\n Serial.print("Received data: ");\n Serial.println(data);\n }\n}\n\nvoid task2(void *pvParameter) {\n int counter = 0;\n \n while (1) {\n // 发送数据到队列\n xQueueSend(myQueue, &counter, portMAX_DELAY);\n \n // 增加数据计数器\n counter++;\n \n // 等待一段时间\n vTaskDelay(1000 / portTICK_PERIOD_MS);\n }\n}\n\nvoid setup() {\n Serial.begin(115200);\n \n // 创建队列\n myQueue = xQueueCreate(queueSize, sizeof(int));\n \n // 创建任务\n xTaskCreate(task1, "Task 1", 10000, NULL, 1, NULL);\n xTaskCreate(task2, "Task 2", 10000, NULL, 1, NULL);\n}\n\nvoid loop() {\n // 空函数,不做任何事情\n}\n\n\n在这个示例中,我们创建了一个队列myQueue,它可以存储最多 10 个int类型的数据。然后我们创建了两个任务task1和task2,task1负责从队列中接收数据并处理,task2负责发送数据到队列。在task2中,我们使用xQueueSend函数将counter的值发送到队列中,然后增加counter的值,并使用vTaskDelay函数等待一段时间。在task1中,我们使用xQueueReceive函数从队列中接收数据,并进行处理。\n\n在setup函数中,我们初始化串口,并创建队列和任务。然后在loop函数中,我们什么都不做,只是让任务在后台运行。\n\n需要注意的是,ESP32 上的队列是固定大小的,当队列已满时,xQueueSend函数将会阻塞任务,直到队列中有空间可用。同样地,当队列为空时,xQueueReceive函数将会阻塞任务,直到有数据可用。\n\n希望这个示例能够帮助你在 ESP32 上使用队列。如果你有任何疑问,请随时进行追问。
原文地址: https://www.cveoy.top/t/topic/pN9H 著作权归作者所有。请勿转载和采集!