c - 通过中断或类似方式异步退出循环 (MSP430/C)

标签 c loops exit msp430 isr

我遇到了一个令我相当困惑的问题,因为我能想到的每个解决方案都有一个问题,导致它无法完全工作。我正在 MSP430FF529 上开发一款游戏,首次通电时,会使用循环和循环延迟无限地将两个图像绘制到屏幕上。我希望这样当用户按下开始按钮(端口上的一个简单的高边触发器)时,程序立即停止绘制这些屏幕,无论其处于进程的哪个部分,并开始执行其余部分运行游戏的代码。

我可以将将图像放在屏幕上的函数放在 do while 循环中,但这样它就不会是异步的,因为当前正在绘制的图像必须在继续之前完成。

我会使用break命令,但我认为这在ISR中不起作用,并且只有当它直接在循环中时才起作用。

我可以将程序的整个其余部分放入用于按下开始按钮的 ISR 中,这样屏幕绘图基本上就不会返回,但这确实很困惑,编码很差,并且会在以后引起很多问题。

本质上,我想做到这样,当按下按钮时,程序将立即跳转到程序中实际游戏的部分,而忘记在屏幕上绘制这些图像。是否有可能以某种方式让 ISR 在执行例程中的代码后不返回到当前发生的情况?基本上,一旦程序开始前进(按下开始按钮),我就不想回到绘制图像的函数,除非我再次显式调用它。

我唯一能想到的是 goto 命令,我觉得在这个特定的情况下它实际上不会太糟糕,尽管我想避免使用它,因为担心它成为一种习惯,因为它是一个糟糕的解决方案在多数情况下。然而,这甚至可能不起作用,因为我有一种感觉,在 ISR 中使用 goto 真的会弄乱堆栈。

有什么想法吗?如有任何建议,我们将不胜感激。

最佳答案

你想要的基本上是一个“上下文切换”。您应该修改程序计数器指针和堆栈指针,当您从 ISR 返回时,它们将被恢复,然后执行正常的 ISR 返回,以便清除中断掩码,恢复堆栈等。如问题评论中所述,这可能需要一些手动汇编代码。

我不熟悉 MSP430,但在其他架构上,这是内核堆栈或中断上下文堆栈上保存的寄存器的结构(或者可能只是某些微 Controller 上的“堆栈”),或者可能是在一些特殊的寄存器中,当CPU跳转到你的ISR时它会自动保存。所以你必须改变这些寄存器指针所在的位置。

关于c - 通过中断或类似方式异步退出循环 (MSP430/C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888439/

相关文章:

C 程序怪异行为——指针和内存

c - 如何将用户输入限制为预定数量的整数

java源代码刽子手

clojure - 如何结束/强制关闭程序(在Clojure中)

c - C 中的 fork() 和 exit()

c - 删除第一个节点后向后遍历 DLL

python - 从不同的 JSON 文件创建语料库

matlab - 如何避免 Matlab 中的嵌套 for 循环?

linux - 如何在 mutt 上发送电子邮件

c - 使用 typedef 动态分配 Matrix