和下土 发表于 2025-9-28 13:10

双缓冲与预加载机制

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

jcky001 发表于 2025-9-30 12:13

减少了中断依赖

jcky001 发表于 2025-9-30 12:13

提升系统实时性。

stormwind123 发表于 2025-9-30 12:14

建议增加同步保障,避免切换时序问题。

海滨消消 发表于 2025-9-30 13:14

适合实时性要求高、数据流连续的嵌入式应用。

jackcat 发表于 2025-10-6 19:03

实现数据的无缝切换            

plsbackup 发表于 2025-10-6 20:13

软件或数据结构层面的技术            

pentruman 发表于 2025-10-6 21:46

使用DMA+双缓冲驱动预加载            

uiint 发表于 2025-10-7 07:53

如何工作?               

mikewalpole 发表于 2025-10-7 20:37

A和B的角色交替互换。            

juliestephen 发表于 2025-10-7 22:49

使用两块独立的内存区域,实现数据准备与数据使用的并行。

sdlls 发表于 2025-10-8 12:38

低主频、无 Cache、依赖 Flash?

plsbackup 发表于 2025-10-8 14:05

低频率数据传输或内存受限的情况。

mmbs 发表于 2025-10-10 10:24

指针切换或缓冲区角色互换            

mollylawrence 发表于 2025-10-10 13:05

双缓冲和预加载机制都是为了解决“在运行过程中更新数据/配置,而不干扰当前正在进行的操作”这一问题的两种不同层面的技术。

everyrobin 发表于 2025-10-10 14:24

预加载机制主要用于定时器和 DMA 等外设,以解决在周期结束时重新配置参数所带来的延迟问题。

jkl21 发表于 2025-10-10 15:03

当缓冲区A的数据发送完成后,立即切换至缓冲区B作为新的前台缓冲区

chenci2013 发表于 2025-10-10 15:41

必须保证至少有一个缓冲区始终可用

lzmm 发表于 2025-10-11 10:47

更新的同步性            

kkzz 发表于 2025-10-11 13:52

通过动态重定向DMA目标地址实现缓冲切换。
页: [1] 2 3
查看完整版本: 双缓冲与预加载机制