ESP32-实时操作系统freertos
# ESP32-FreeRTOS
本文以ESP32-S3N16R8为例,介绍如何使用FreeRTOS。创建两个任务(Task)分别控制LED闪烁和串口打印消息。
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// 配置引脚(根据开发板调整LED引脚)
const uint8_t LED_PIN = GPIO_NUM_48; // 默认LED引脚(需根据开发板调整)
// 任务函数声明
void blinkLED(void *pvParameters);
void printMessage(void *pvParameters);
void setup() {
Serial.begin(115200); // 初始化串口
pinMode(LED_PIN, OUTPUT);
// 创建任务1:闪烁LED
xTaskCreate(
blinkLED, // 任务函数
"Blink Task", // 任务名称
2048, // 栈大小(字节)
NULL, // 任务参数
1, // 优先级(1较低)
NULL // 任务句柄
);
// 创建任务2:串口打印
xTaskCreate(
printMessage,
"Print Task",
2048,
NULL,
1,
NULL
);
// 如果setup结束,loop任务会自动运行(优先级为1)
}
void loop() {
// 低优先级任务(FreeRTOS调度器会管理任务)
vTaskDelay(pdMS_TO_TICKS(1000)); // 避免占用CPU
}
// 任务1:每500ms切换LED状态
void blinkLED(void *pvParameters) {
for(;;) { // 无限循环
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
Serial.println("LED状态切换");
vTaskDelay(pdMS_TO_TICKS(500)); // 非阻塞延时
}
vTaskDelete(NULL); // 安全退出(通常不会执行到这里)
}
// 任务2:每2秒打印消息
void printMessage(void *pvParameters) {
TickType_t lastWakeTime = xTaskGetTickCount();
const TickType_t period = pdMS_TO_TICKS(2000);
for(;;) {
Serial.println("[系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2");
Serial.println("------------------------------------");
vTaskDelayUntil(&lastWakeTime, period); // 精确周期延时
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 关键说明:
- LED引脚:
- 默认使用 GPIO48(常见开发板LED引脚)
- 如果LED不亮,请检查开发板文档并修改
LED_PIN
- 任务特点:
blinkLED
:使用vTaskDelay()
简单延时printMessage
:使用vTaskDelayUntil()
实现精确周期执行
- 串口监视:
- 打开Arduino IDE串口监视器(波特率115200)查看输出消息
- FreeRTOS优势:
- 双核处理(ESP32-S3有2个核心)
- 任务独立运行(LED闪烁不影响消息打印)
- 精确时间控制
# 预期输出:
LED状态切换
[系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2
------------------------------------
LED状态切换
LED状态切换
[系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2
------------------------------------
(持续交替输出...)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
编辑 (opens new window)