目录

1. 核心任务绑定

2. 双核通信机制

3. 开发环境关键配置

4. 实战案例

5. 调试与优化建议


1. 核心任务绑定

ESP32通过FreeRTOS的 xTaskCreatePinnedToCore() 函数将任务固定到指定核心:

  • 示例代码

    c

    xTaskCreatePinnedToCore(
      sendTask,     // 任务函数
      "sendTask",   // 任务名称
      10000,        // 堆栈大小
      NULL,         // 参数
      1,            // 优先级
      &xTask1,      // 任务句柄
      0             // 核心编号 (0或1)
    );
    • Core0:通常处理RF通信(Wi-Fi/蓝牙)
    • Core1:默认运行用户代码(如Arduino IDE中的loop()

2. 双核通信机制

使用队列(Queue) 跨核传递数据:

  • 创建队列

    c

    xQueue = xQueueCreate(5, sizeof(Data)); // 队列容量=5,数据类型为自定义结构体
  • 发送数据

    c

    Data data = {sender: 1, msg: "Hello"};
    xQueueSend(xQueue, &data, portMAX_DELAY);
  • 接收数据

    c

    Data received;
    if(xQueueReceive(xQueue, &received, 1000/portTICK_PERIOD_MS)) {
      Serial.println(received.msg);
    }

3. 开发环境关键配置

  • Arduino IDE
    • 需包含Arduino.hFreeRTOS.h
    • 通过xPortGetCoreID()获取当前运行核心ID
  • ESP-IDF环境
    • 在VS Code中配置IDF插件,支持双核调试
    • 优先使用Core0处理实时性要求高的任务(如传感器数据采集)

4. 实战案例

  • 场景1:LED控制与传感器读取并行

    c

    // Core1:控制LED闪烁
    void TaskLED(void *pv) {
      while(1) {
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
        vTaskDelay(500/portTICK_PERIOD_MS);
      }
    }
    
    // Core0:读取DHT11数据
    void TaskDHT(void *pv) {
      float temp = dht.readTemperature();
      Serial.printf("Temp: %.1f°C\n", temp);
      vTaskDelay(1000/portTICK_PERIOD_MS);
    }
  • 场景2:双核网络通信
    Core0处理TCP协议栈,Core1执行应用逻辑

 5. 调试与优化建议

  1. 核心负载均衡
    • 避免在Core0运行耗时任务(如复杂算法),防止阻塞射频通信
  2. 优先级设定
    • 关键任务优先级建议≥2(范围0-24,数值越高优先级越高)
  3. 资源冲突预防
    • 共享资源(如SPI/I2C总线)需使用互斥锁(Mutex)
  4. 核心绑定查询

    c

    TaskHandle_t xTask;
    UBaseType_t core = xTaskGetAffinity(xTask);  // 返回任务绑定核心
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐