esp32 arduino编程中,双核分配线程和主循环loop有什么关联

24 2025-08-24 09:32

esp32 arduino编程中,双核分配线程和主循环loop有什么关联

在 ESP32-Arduino 框架里,loop() 本身并不是“单独一个核”的专利,而是整个 Arduino 运行时(arduino-esp32 核心)给你准备的一个“入口”。真正和“双核”发生关系的是ESP-IDF/FreeRTOS 的调度器
  1. 上电后,ESP-IDF 先把 FreeRTOS 跑起来。
  2. FreeRTOS 默认在 核 0(PRO_CPU) 启动一个优先级为 1 的任务,名字叫 loopTask(源码在 cores/esp32/main.cpp)。
  3. loopTask 里就是你们熟悉的:
     
  1. 复制
    setup();
    for(;;) {
        loop();
        vTaskDelay(1);   // 让出 CPU,防止饿死
    }
     
  2. 核 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 到 24configMAX_PRIORITIES 默认是 25)。
所以:
优先级 1 是“比较低”的优先级,只比 0(空闲任务)高一点。
如果有优先级更高的任务(比如 2、3…24)处于就绪状态,它们会抢占优先级 1 的任务。
举例:
表格
 
复制
优先级 含义
0 空闲任务(Idle Task)
1 Arduino 的 loopTask(跑你的 loop())
2~24 你可以创建的更高优先级任务
因此,loop() 的优先级并不高,很容易被其他任务打断。
 
 

全部评论

·