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

