突然下起雨 发表于 2024-8-31 23:55

频繁调用导致系统性能下降

HAL_ADC_ConvCpltCallback频繁调用导致系统性能下降
在每次ADC转换完成时都调用回调函数,可能会频繁中断主程序的运行,导致系统性能下降。

huangcunxiake 发表于 2024-9-2 21:39

可以降低采样频率,根据应用的实际需要设置采样的频率。

huangcunxiake 发表于 2024-9-2 21:40

另外,还可以考虑使用DMA传输采样结果。可以降低CPU开销。

huangcunxiake 发表于 2024-9-2 21:40

将多次ADC转换的结果累积到一个缓冲区中,并在缓冲区填满时才调用回调函数进行处理。
例如,可以在回调函数中对多个采样值进行平均处理,从而减少数据处理的频率。

huangcunxiake 发表于 2024-9-2 21:40

确保HAL_ADC_ConvCpltCallback中的代码执行效率高,避免在回调函数中执行耗时的操作。可以将数据处理移至主循环中,回调函数只负责标记数据准备就绪的状态。

huangcunxiake 发表于 2024-9-2 21:40

如果ADC回调函数确实需要频繁调用,可以降低ADC中断的优先级,使其不会过多干扰其他更重要的中断或任务。

huangcunxiake 发表于 2024-9-2 21:40

另外还可以在ADC有多个通道时,可以使用多通道扫描模式,并在所有通道都完成采样后再触发一次中断,这样可以减少中断的频率。

wanduzi 发表于 2024-9-2 21:41

// 初始化ADC和DMA
HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, BUFFER_SIZE);

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    // DMA传输完成时调用
    ProcessADCBuffer();
}

void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) {
    // DMA传输到一半时调用
    ProcessADCHalfBuffer();
}

void ProcessADCBuffer() {
    // 处理完整的ADC数据缓冲区
}

void ProcessADCHalfBuffer() {
    // 处理半缓冲区的数据
}

呐咯密密 发表于 2024-9-3 10:43

中断要合理使用,频繁的中断就是会这样

v26g7l 发表于 2024-12-31 19:19

最直接的方式是降低ADC的采样频率

OKAKAKO 发表于 2024-12-31 22:17

导致系统性能下降的操作很多需要重要关注

LOVEEVER 发表于 2024-12-31 22:47

性能下降也有可能是资源不足导致的

地瓜patch 发表于 2024-12-31 23:02

提高主频

地瓜patch 发表于 2024-12-31 23:02

huangcunxiake 发表于 2024-9-2 21:40
将多次ADC转换的结果累积到一个缓冲区中,并在缓冲区填满时才调用回调函数进行处理。
例如,可以在回调函数 ...

使用队列

地瓜patch 发表于 2024-12-31 23:03

huangcunxiake 发表于 2024-9-2 21:40
另外还可以在ADC有多个通道时,可以使用多通道扫描模式,并在所有通道都完成采样后再触发一次中断,这样可 ...

中断时间太短,频繁中断

我爱台妹mmd 发表于 2024-12-31 23:57

调整ADC的采样周期,可以通过增加 采样时间 或 降低采样频率 来减少ADC转换的次数。
如果系统对实时性要求不高,可以将ADC转换模式切换为 低速模式,或者通过降低采样速度来减少中断的频率。
页: [1]
查看完整版本: 频繁调用导致系统性能下降