打印
[STM32L0]

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

[复制链接]
300|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
突然下起雨|  楼主 | 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转换的结果累积到一个缓冲区中,并在缓冲区填满时才调用回调函数进行处理。
例如,可以在回调函数中对多个采样值进行平均处理,从而减少数据处理的频率。

使用特权

评论回复
5
huangcunxiake| | 2024-9-2 21:40 | 只看该作者
确保HAL_ADC_ConvCpltCallback中的代码执行效率高,避免在回调函数中执行耗时的操作。可以将数据处理移至主循环中,回调函数只负责标记数据准备就绪的状态。

使用特权

评论回复
6
huangcunxiake| | 2024-9-2 21:40 | 只看该作者
如果ADC回调函数确实需要频繁调用,可以降低ADC中断的优先级,使其不会过多干扰其他更重要的中断或任务。

使用特权

评论回复
7
huangcunxiake| | 2024-9-2 21:40 | 只看该作者
另外还可以在ADC有多个通道时,可以使用多通道扫描模式,并在所有通道都完成采样后再触发一次中断,这样可以减少中断的频率。

使用特权

评论回复
8
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() {
    // 处理半缓冲区的数据
}

使用特权

评论回复
9
呐咯密密| | 2024-9-3 10:43 | 只看该作者
中断要合理使用,频繁的中断就是会这样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

276

帖子

1

粉丝