我開始在我的應用程序atmega8上實現類似於任務切換的東西。主要思想是有一個指向「當前屏幕」結構的指針。 「當前屏幕」包含用於刷新屏幕,處理按鈕和中斷的處理程序。ATmega芯片安全的「任務切換」
不幸的是我發現改變函數指針是在2個操作中完成的。這意味着一些中斷可能會嘗試執行current_screen->handle_signal(...);
,而current_screen
部分更改。由於處理精確的時序,我不能僅僅在這個變化期間禁用和重新啓用中斷。設置一個關於被修改的處理函數的標誌可以做到這一點,因爲我不關心在任務改變過程中丟失了一些中斷(但是處理那些我不會錯過的代碼變得有點困難)。
我想過改變的過程中複製current_screen
到current_screen_old
並設置一個標誌,像這樣:
current_screen_old = current_screen; // safe to call current_screen->handler
during_update = 1; // safe to call current_screen_old->handler
current_screen = new_value;
during_update = 0; // safe to call current_screen->handler again
但我不是100%肯定這不包含其他一些技巧,如果處理程序要也改變current_screen
。
有沒有更好的方法來處理它?一些很好的成語?
這是一個好主意。我會盡力做到這一點。 – viraptor 2010-07-17 20:38:57