我遇到了一個問題,我寧願因此而陷入困境,因爲我能想到的每個解決方案都有一個問題,使其無法正常工作。我正在開發一款MSP430FF529上的遊戲,當第一次啓動時,兩個圖像通過循環和循環延遲無限次地吸引到屏幕上。我想要這樣做,以便當用戶按下開始按鈕(一個簡單的高邊沿觸發器)時,程序立即停止繪製這些畫面,無論該進程的哪一部分進入,並開始執行其餘部分運行遊戲的代碼。通過interupt或類似的異步退出循環(MSP430/C)
我可以把屏幕上的圖像放在一個do while循環中,但它不會是異步的,因爲當前的圖像在移動之前必須完成。
我會使用break命令,但我認爲這不適用於ISR並且只有當它直接在循環中。
我可以把程序的整個其餘部分放在ISR中,我使用開始按鈕按下,這樣屏幕繪圖本質上永遠不會返回,但那真的是混亂,編碼不好,並且會在以後引發很多問題。
本質上,我想這樣做,當按鈕被按下時,程序將立即跳轉到實際遊戲的程序部分,並忘記在屏幕上繪製這些圖像。在執行例程中的代碼之後,是否有可能以某種方式使ISR不能返回到當前發生的狀態?基本上,一旦程序開始向前移動(按下開始按鈕),我不想回到繪製圖像的功能,除非我明確地再次調用它。
我能想到的唯一的東西就是goto命令,我覺得在這個特定的實例中實際上並不算太壞,儘管我想避免使用它,因爲它害怕它變成一個習慣,因爲它是一個窮人解決方案在大多數情況但是,這可能不起作用,因爲我有一種感覺,在ISR中使用goto會使堆棧變得非常糟糕。
任何想法?任何建議表示讚賞。
你可以使用某種RTOS。將遊戲線程設置爲比渲染線程更高的優先級,但將其懸掛在信號量上。在中斷處理程序中設置信號量並將處理程序退出到調度程序。一旦中斷結束,就會切換到遊戲。 –
這個問題太廣泛了,沒有一個好的答案。當然,你可以使用匯編程序跳到你想要的地方,但這超出了C語言。 C甚至沒有一個硬件中斷的概念,用於自由停頓的環境。或者,您可以在主代碼中通過您測試的中斷處理程序設置一個標誌。注意:機械按鈕會彈跳。您必須採取措施來防止單次按鍵檢測多個脈衝。 – Olaf
'goto'只能在單個函數中使用。一般來說,在代碼中瘋狂跳躍是一種糟糕的風格。請放心,如果不是瞬間的話,它最終會在以後造成麻煩。 – Olaf