通过缓存机制实现数据准备与 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 始终有有效数据可传,消除切换间隙
|
|