我正在使用stm32f4xx微控制器进行C语言嵌入式项目开发。
我有一部分代码可以持续执行一个循环操作XYZ,而定时器TIM4中断会不时改变全局参数并导致操作XYZ重新启动。
代码大致如下:
for (;;) {
//line A
XYZ;
//line B
}
XYZ是一个涉及数据传输和缓冲区之间的复杂操作。
TIM4中断处理程序做的事情是:停止XYZ,改变一些影响XYZ操作的全局变量。
因此,基本上我希望XYZ能够重复执行,并且TIM4中断可以停止XYZ,改变参数,然后通过使用新的全局参数重新启动XYZ循环。
问题是:由于XYZ有许多指令,TIM4 IRQ可能会在其中间发生,在IRQ处理程序更改全局变量后,操作将从XYZ的中途恢复,这样会破坏程序。
我的初始解决方案:在A行使用__disable_irq()禁用中断,在B行使用__enable_irq()使其恢复。
失败,因为XYZ复杂操作必须使用其他中断(而不是TIM4)。
下一个解决方案:仅在A行禁用TIM4中断,使用:
TIM_ITConfig(TIM4, TIM_IT_Update , DISABLE)
使用以下方法在B线上重新启用它:
TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE)
失败的原因是我失去了中断:当恢复int时,XYZ期间到达的中断会被忽略。这是一个大问题(其中一个原因是TIM4 IRQHandler更改全局变量,然后再次激活TIM4以稍后产生中断,我这样做是因为中断之间的周期不同)。
有没有人能给我解决这个问题的方案?是否有更好的方法来禁用/恢复TIM4 IRQ而不会丢失任何中断?