代码¶
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();