2010-07-17 53 views
2

我開始在我的應用程序atmega8上實現類似於任務切換的東西。主要思想是有一個指向「當前屏幕」結構的指針。 「當前屏幕」包含用於刷新屏幕,處理按鈕和中斷的處理程序。ATmega芯片安全的「任務切換」

不幸的是我發現改變函數指針是在2個操作中完成的。這意味着一些中斷可能會嘗試執行current_screen->handle_signal(...);,而current_screen部分更改。由於處理精確的時序,我不能僅僅在這個變化期間禁用和重新啓用中斷。設置一個關於被修改的處理函數的標誌可以做到這一點,因爲我不關心在任務改變過程中丟失了一些中斷(但是處理那些我不會錯過的代碼變得有點困難)。

我想過改變的過程中複製current_screencurrent_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

有沒有更好的方法來處理它?一些很好的成語?

回答

3

您可以使用雙緩衝。

也就是說,使用兩個函數指針和一個指向當前指針的數組。將非當前指針設置爲新值,然後切換索引。由於索引很小(0或1),因此它是原子的。

您需要確保在更改過程中訪問指針的任何任務可以暫停足夠長的時間,以免受到下一次更改的干擾。

+0

這是一個好主意。我會盡力做到這一點。 – viraptor 2010-07-17 20:38:57