You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QEMU-KVM下无法多次触发性能监控中断问题咨询

排查计数器溢出中断无法多次触发的问题

这种情况我碰到过好多次,别光盯着中断掩码,大概率是下面这几个容易忽略的点没处理对:

  • 务必清除中断标志位,而不只是掩码
    很多MCU的计数器溢出中断触发后,会在状态寄存器里置位一个溢出标志(比如STM32里的TIMx->SR寄存器的UIF位)。如果不手动清除这个标志,哪怕中断掩码是打开的,内核也会认为中断还在处理中,不会再次触发。
    举个例子,在中断服务函数里一定要加清除标志的代码:

    void TIM2_IRQHandler(void) {
        // 先清除溢出中断标志
        TIM2->SR &= ~TIM_SR_UIF;
        // 你的业务代码
        counter++;
    }
    

    注意:有些MCU支持硬件自动清除标志,但大部分还是需要手动操作,别依赖默认行为。

  • 检查计数器的工作模式是否为循环计数
    如果你的计数器配置成了单次计数模式(比如向上计数到ARR后停止,而不是自动重装),那溢出一次后计数器就停在最大值了,自然不会再溢出。
    确认配置里开启了自动重装功能,比如STM32里要设置TIMx->CR1的ARPE位,并且保证计数器在溢出后会自动从0开始重新计数:

    // 开启自动重装预加载
    TIM2->CR1 |= TIM_CR1_ARPE;
    // 设置自动重装值(比如计数到10000溢出)
    TIM2->ARR = 9999;
    
  • 排查中断服务函数里的误操作
    有没有在ISR里不小心关闭了计数器的时钟,或者修改了计数器的使能位?比如误写了TIM2->CR1 &= ~TIM_CR1_CEN;这种代码,直接把计数器停了,那肯定不会再溢出。
    另外,ISR里的代码不要执行太耗时的操作,否则可能导致后续中断被延迟,但如果是完全不触发,大概率还是前面两个原因。

  • 确认中断优先级配置没有冲突
    虽然概率低,但如果有更高优先级的中断一直处于触发状态,会抢占这个溢出中断,导致你看起来像是没触发。可以暂时关闭其他中断,测试只保留计数器溢出中断的情况,看是否能多次触发。

先从第一点开始排查,绝大多数情况都是中断标志位没清干净导致的!

内容的提问来源于stack exchange,提问作者Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:59:49