双缓冲与预加载机制
通过缓存机制实现数据准备与 DMA 传输的并行处理,减少中断依赖:c
运行
// 双缓冲区设计
#define BUFFER_SIZE 128
uint16_t pwm_buffer;// 双缓冲区
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);
// 通知应用层填充新缓冲区(通过信号量)
osSemaphoreRelease(buffer_sem);
}
// 应用层任务:预填充下一个缓冲区
void buffer_fill_task(void *arg) {
while(1) {
// 等待缓冲区可用信号
osSemaphoreAcquire(buffer_sem, osWaitForever);
// 填充下一组数据(可耗时操作)
generate_pwm_data(pwm_buffer, BUFFER_SIZE);
}
}
优势:
将数据生成的耗时操作转移到任务层,避免阻塞中断
双缓冲确保 DMA 始终有有效数据可传,消除切换间隙
减少了中断依赖 提升系统实时性。 建议增加同步保障,避免切换时序问题。 适合实时性要求高、数据流连续的嵌入式应用。 实现数据的无缝切换 软件或数据结构层面的技术 使用DMA+双缓冲驱动预加载 如何工作? A和B的角色交替互换。 使用两块独立的内存区域,实现数据准备与数据使用的并行。 低主频、无 Cache、依赖 Flash? 低频率数据传输或内存受限的情况。 指针切换或缓冲区角色互换 双缓冲和预加载机制都是为了解决“在运行过程中更新数据/配置,而不干扰当前正在进行的操作”这一问题的两种不同层面的技术。 预加载机制主要用于定时器和 DMA 等外设,以解决在周期结束时重新配置参数所带来的延迟问题。 当缓冲区A的数据发送完成后,立即切换至缓冲区B作为新的前台缓冲区 必须保证至少有一个缓冲区始终可用 更新的同步性 通过动态重定向DMA目标地址实现缓冲切换。