双缓冲与预加载机制

[复制链接]
670|4
和下土 发表于 2025-9-28 13:10 | 显示全部楼层 |阅读模式
通过缓存机制实现数据准备与 DMA 传输的并行处理,减少中断依赖:
c
运行
// 双缓冲区设计
#define BUFFER_SIZE 128
uint16_t pwm_buffer[2][BUFFER_SIZE];  // 双缓冲区
uint8_t active_buf = 0;               // 当前激活的缓冲区
uint8_t ready_buf = 1;                // 准备好的缓冲区

// DMA传输完成时切换缓冲区
void dma_transfer_complete_callback() {
    // 交换缓冲区
    active_buf = ready_buf;
    ready_buf = 1 - active_buf;

    // 重新设置DMA目标地址
    DMA_SetMemoryAddress(DMA1_Stream5, (uint32_t)pwm_buffer[active_buf]);

    // 通知应用层填充新缓冲区(通过信号量)
    osSemaphoreRelease(buffer_sem);
}

// 应用层任务:预填充下一个缓冲区
void buffer_fill_task(void *arg) {
    while(1) {
        // 等待缓冲区可用信号
        osSemaphoreAcquire(buffer_sem, osWaitForever);

        // 填充下一组数据(可耗时操作)
        generate_pwm_data(pwm_buffer[ready_buf], BUFFER_SIZE);
    }
}
优势:
将数据生成的耗时操作转移到任务层,避免阻塞中断
双缓冲确保 DMA 始终有有效数据可传,消除切换间隙

jcky001 发表于 2025-9-30 12:13 | 显示全部楼层
减少了中断依赖
jcky001 发表于 2025-9-30 12:13 | 显示全部楼层
提升系统实时性。
stormwind123 发表于 2025-9-30 12:14 | 显示全部楼层
建议增加同步保障,避免切换时序问题。
海滨消消 发表于 2025-9-30 13:14 | 显示全部楼层
适合实时性要求高、数据流连续的嵌入式应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

1405

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部