void SysTick_Handler(void)
{
/* enter interrupt */
rt_interrupt_enter();
HAL_IncTick();
rt_tick_increase();
/* leave interrupt */
rt_interrupt_leave();
}
看到了STM32的SysTick_Handler的驱动代码,发现没有清除中断标志位的地方,正常的中断服务例程中不都有清中断标志位的操作吗?我记得以前写裸机程序的时候都有清除中断标志位的操作,STM32比较特殊?
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
这两个函数都是STM32标准库中的函数,按你这上面的解释,岂不是说这些函数都是多此一举吗?硬件都自动清除标志了,为什么还写这些函数来清除标志呢?
所以我觉得你上面的解释是不对的,我觉得这个清除标志位的行为更像是你上面截图里面的清除中断请求的行为,也就是说:如果不清除中断标志,则意味着中断请求一直有效——这样的解释似乎更合理
@wuheng12358 也就是说,我们先要搞清楚,传统单片机编程意义上的“清除中断标志”,对应的是你截图里面的清除中断请求,还是清除悬起状态?
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
这两个函数应该是清除正在pending的中断,这些中断未执行还被挂起的时候,可以通过软件清除,清除后就这些被挂起的中断不会再执行。
而进入中断服务函数的时候(SysTick_Handler),表明这个中断已经被执行了,也就不需要调用这类函数。
传统单片机意义的清除中断标志,对应的是清除中断请求,否则此中断会一直产生,这个和芯片架构相关,比如arm的GIC中断控制器就不需要这个动作(准确地说是写GIC寄存器统一处理),但是像risc-v架构的中断(例如GPIO电平),需要清中断控制器状态,否则会一直触发。