【发布时间】:2012-11-29 00:25:44
【问题描述】:
我正在 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 除外)。
NEXT SOLUTION 仅禁用线路 A 上的 TIM4 中断:
TIM_ITConfig(TIM4, TIM_IT_Update , DISABLE)
并在 B 行重新启用它:
TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE)
失败,因为我丢失了中断:当 int 恢复时,在 XYZ 期间到达的中断被忽略。这是个大问题(其中一个原因是 TIM4 IRQHandler 改变了全局变量,然后再次激活 TIM4 以便稍后发出中断,我这样做是因为中断之间的周期不同)。
谁能给我一个解决这个问题的方法?有没有更好的方法来禁用/恢复 TIM4 IRQ 并且不会丢失任何中断?
【问题讨论】:
-
XYZ 出于什么原因需要停止处理?是因为它的数据由于中断覆盖信息而无效,还是因为实际上希望在新的中断到来时停止XYZ?如果只是因为数据覆盖,在 ISR 中你可以将数据复制到一个临时的并设置一个标志,然后在主循环中使用标志来知道何时对新数据进行操作...
标签: timer embedded interrupt stm32 irq