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

[复制链接]
 楼主| 突然下起雨 发表于 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 | 显示全部楼层
  1. // 初始化ADC和DMA
  2. HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, BUFFER_SIZE);

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

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

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

  14. void ProcessADCHalfBuffer() {
  15.     // 处理半缓冲区的数据
  16. }
呐咯密密 发表于 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转换模式切换为 低速模式,或者通过降低采样速度来减少中断的频率。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

530

帖子

1

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