示例代码
/* * FreeRTOS 队列基本示例 * <url id="cvsda1ihra01qm1u9ho0" type="url" status="parsed" title="FreeRTOS queues - FreeRTOS™" wc="5451">https://www.freertos.org/Embedded-RTOS-Queues.html</url> */ // 引入 Arduino FreeRTOS 库 #include <Arduino_FreeRTOS.h> // 引入队列支持库 #include <queue.h> /* * 声明一个全局变量,类型为 QueueHandle_t,用于存储队列的句柄 * */ QueueHandle_t integerQueue; void setup() { /** * 创建一个队列 * <url id="cvsda1ihra01qm1u9hog" type="url" status="parsed" title="xQueueCreate - FreeRTOS™" wc="2439">https://www.freertos.org/a00116.html</url> */ integerQueue = xQueueCreate(10, // 队列长度(最多可以存储 10 个元素) sizeof(int) // 队列中每个元素的大小(以字节为单位) ); if (integerQueue != NULL) { // 如果队列创建成功,则创建任务 // 创建串口任务,用于从队列中读取数据并打印到串口 xTaskCreate(TaskSerial, // 任务函数 "Serial", // 任务名称(仅用于人类阅读) 128, // 堆栈大小(可以检查并调整堆栈高水位标记) NULL, 2, // 优先级,3(configMAX_PRIORITIES - 1)为最高优先级,0 为最低优先级 NULL); // 创建模拟输入读取任务,用于读取模拟输入并发送数据到队列 xTaskCreate(TaskAnalogRead, // 任务函数 "AnalogRead", // 任务名称 128, // 堆栈大小 NULL, 1, // 优先级 NULL); } // 创建 LED 闪烁任务 xTaskCreate(TaskBlink, // 任务函数 "Blink", // 任务名称 128, // 堆栈大小 NULL, 0, // 优先级 NULL ); } void loop() { // loop() 函数为空,因为所有逻辑都在任务中运行 } /** * 模拟输入读取任务 * 读取模拟输入引脚 0 的值,并通过队列发送读取的值 * 参考 Blink_AnalogRead 示例 */ void TaskAnalogRead(void *pvParameters) { (void) pvParameters; // 忽略未使用的参数警告 for (;;) { // 读取模拟输入引脚 0 的值 int sensorValue = analogRead(A0); /** * 向队列发送一个项目 * <url id="cvsda1ihra01qm1u9hp0" type="url" status="parsed" title="xQueueSend - FreeRTOS™" wc="2944">https://www.freertos.org/a00117.html</url> */ xQueueSend(integerQueue, &sensorValue, portMAX_DELAY); // 向队列发送 sensorValue 的值 // 为了稳定性,在读取之间延迟 1 个 tick(约 15ms) vTaskDelay(1); } } /** * 串口任务 * 从队列中读取项目,并将读取的值打印到串口监视器 */ void TaskSerial(void *pvParameters) { (void) pvParameters; // 初始化 Arduino 串口 Serial.begin(115200); // 等待串口连接。对于基于 32u4 的板子(如 LEONARDO, MICRO, YUN 等)是必需的 while (!Serial) { vTaskDelay(1); } int valueFromQueue = 0; for (;;) { /** * 从队列中读取一个项目 * <url id="cvsda1ihra01qm1u9hpg" type="url" status="parsed" title="xQueueReceive - FreeRTOS™" wc="4858">https://www.freertos.org/a00118.html</url> */ if (xQueueReceive(integerQueue, &valueFromQueue, portMAX_DELAY) == pdPASS) { // 如果成功从队列中接收到数据,则打印到串口 Serial.println(valueFromQueue); } } } /* * LED 闪烁任务 * 参考 Blink_AnalogRead 示例 */ void TaskBlink(void *pvParameters) { (void) pvParameters; // 设置内置 LED 引脚为输出模式 pinMode(LED_BUILTIN, OUTPUT); for (;;) { // 打开 LED digitalWrite(LED_BUILTIN, HIGH); // 延迟 250ms vTaskDelay(250 / portTICK_PERIOD_MS); // 关闭 LED digitalWrite(LED_BUILTIN, LOW); // 延迟 250ms vTaskDelay(250 / portTICK_PERIOD_MS); } }