我正在 stm32f4xx uC 上用 C 语言开发一个嵌入式项目。
我有一段代码连续执行循环操作 XYZ,有时 TIM4 中断会更改一些全局参数并导致操作 XYZ 重新启动。
代码是这样的:
for (;;) {
//line A
XYZ;
//line B
}
XYZ 是一项复杂的操作,涉及在缓冲区和其他缓冲区之间传输数据。
TIM4 中断处理程序执行此操作:停止 XYZ 并更改一些影响 XYZ 操作的全局变量。
所以基本上我希望 XYZ 重复执行,TIM4 中断来停止 XYZ,更改参数,然后必须通过使用新的全局参数重新启动 XYZ 来重新启动循环。
问题是:由于 XYZ 有许多指令,TIM4 IRQ 可能会在它的中间出现,并且在 IRQHandler 更改全局变量之后,操作从 XYZ 的中间恢复,这会破坏程序。
我的初始解决方案:使用 __disable_irq() 禁用线路 A 上的中断,并使用 __enable_irq() 在线路 B 上恢复它们
失败,因为 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 而不会丢失任何中断?