跳转至

代码

Warning

以下代码应基于发布代码中的代码,可能已更新。

完整代码请参考英文版文档。主要包含:

  • arch_dma_dual_core.h:架构3的头文件定义
  • arch_dma_dual_core.c:架构3的完整实现
  • Producer 任务实现(Core 0,填充双缓冲)
  • Consumer 任务实现(Core 1,处理已填充缓冲区)
  • 核心绑定逻辑
  • 跨核心同步
  • 双缓冲机制

关键实现

核心绑定

任务使用 xTaskCreatePinnedToCore() 显式绑定到特定核心:

// Producer 在 Core 0
xTaskCreatePinnedToCore(
    producer_task,
    "rt_dma_dc_producer",
    RT_DMA_DC_PRODUCER_STACK_SIZE,
    NULL,
    RT_DMA_DC_PRODUCER_PRIORITY,
    &s_producer_task_handle,
    RT_DMA_DC_PRODUCER_CORE  // Core 0
);

// Consumer 在 Core 1
xTaskCreatePinnedToCore(
    consumer_task,
    "rt_dma_dc_consumer",
    RT_DMA_DC_CONSUMER_STACK_SIZE,
    NULL,
    RT_DMA_DC_CONSUMER_PRIORITY,
    &s_consumer_task_handle,
    RT_DMA_DC_CONSUMER_CORE  // Core 1
);

跨核心同步

互斥锁和信号量跨核心工作:

  • 互斥锁:保护 Core 0(Producer)和 Core 1(Consumer)之间的缓冲区访问
  • 信号量:跨核心信号缓冲区就绪状态
  • 易失性标志:确保跨核心的正确可见性

Producer 任务(Core 0)

Producer 任务仅在 Core 0 上运行:

  • 核心验证:启动时记录核心 ID 用于验证
  • 专用 CPU:有专用 CPU 时间用于采集
  • 无干扰:不受 Core 1 上处理工作负载的影响

Consumer 任务(Core 1)

Consumer 任务仅在 Core 1 上运行:

  • 核心验证:启动时记录核心 ID 用于验证
  • 专用 CPU:有专用 CPU 时间用于处理
  • 无干扰:不受 Core 0 上采集工作负载的影响

使用示例

// 选择架构3
#define RT_PROCESS_ARCH_TYPE RT_ARCH_DMA_DUAL_CORE
#include "real-time-process-arch.h"

// 初始化
rt_process_config_t config = {
    .sampling_frequency_hz = 2000.0f,  // 2 kHz
    .queue_size = 256,
    .enable_mqtt = false,
    .enable_serial = true,
    .enable_accel_detection = false,
    .mqtt_topic = NULL
};

esp_err_t ret = rt_process_init(&config);
rt_process_set_sensor_handle(adxl355_handle);
rt_process_start();

// 验证核心分配(检查日志)
// Producer 应记录:"Producer task started on Core 0"
// Consumer 应记录:"Consumer task started on Core 1"

// 监控
rt_process_status_t status;
rt_process_get_status(&status);
ESP_LOGI("App", "运行中: %s, 缓冲区使用: %lu", 
         status.is_running ? "是" : "否", status.buffer_usage);

// 停止
rt_process_stop();
rt_process_deinit();