esp32 arduino编程中,双核分配线程和主循环loop有什么关联
24 2025-08-24 09:32
esp32 arduino编程中,双核分配线程和主循环loop有什么关联
在 ESP32-Arduino 框架里,loop() 本身并不是“单独一个核”的专利,而是整个 Arduino 运行时(
arduino-esp32
核心)给你准备的一个“入口”。真正和“双核”发生关系的是ESP-IDF/FreeRTOS 的调度器:-
上电后,ESP-IDF 先把 FreeRTOS 跑起来。
-
FreeRTOS 默认在 核 0(PRO_CPU) 启动一个优先级为 1 的任务,名字叫
loopTask
(源码在cores/esp32/main.cpp
)。 -
loopTask
里就是你们熟悉的:
-
复制
setup(); for(;;) { loop(); vTaskDelay(1); // 让出 CPU,防止饿死 }
-
核 1(APP_CPU) 默认是“空”的,等待你放任务上去。
因此:
-
loop() 和“核 0”是绑定的,但它只是一个普通 FreeRTOS 任务,优先级 1,可以随时被其它任务抢占。
-
核 1 完全空闲,你可以用
xTaskCreatePinnedToCore()
把耗时或实时任务钉到核 1,也可以把 loop() 自己搬到核 1(自己再建一个任务即可)。 -
如果你什么都不做,loop() 就相当于“在核 0 的 loopTask 里不停地跑”,而核 1 完全闲着。
一句话总结:
loop() 只是 Arduino 框架帮你包好的一个 FreeRTOS 任务,默认固定在核 0;剩下一个核 1 任你随意创建线程/任务,两者是“并行”的,互不影响,但共享内存、外设,需要你自己做同步。
优先级1是高优先级还是低优先级
在 FreeRTOS(也就是 ESP32 底层用的实时操作系统)里:
-
任务优先级是一个 无符号整数(
UBaseType_t
类型)。 -
数值越大,优先级越高。
-
默认配置下,优先级范围是 0 到 24(
configMAX_PRIORITIES
默认是 25)。
所以:
优先级 1 是“比较低”的优先级,只比 0(空闲任务)高一点。
如果有优先级更高的任务(比如 2、3…24)处于就绪状态,它们会抢占优先级 1 的任务。
举例:
表格
复制
优先级 | 含义 |
---|---|
0 | 空闲任务(Idle Task) |
1 | Arduino 的 loopTask (跑你的 loop()) |
2~24 | 你可以创建的更高优先级任务 |
因此,loop() 的优先级并不高,很容易被其他任务打断。
全部评论