微控制器程式構架--訊息驅動機制
做過windows win32開發的人員都知道,win32整個程式都是訊息驅動的。
在嵌入式系統裡面,訊息驅動的好處是可以真正實現模組化程式設計。此外,可以大大簡化程式的結構。方便程式的編寫。
由於訊息機制的弱實時性,因此在某些強實時性的場合下,通過中斷等方式來捕獲到實時事件,再將此實時事件封裝成訊息,
傳送到相應的模組進行處理。這樣程式結構不會耦合的那麼厲害。另外,通過訊息,可以方便的實現不同模組之間的通訊。
這對於改善程式結構是非常大的,也是程式能夠真正模組化的原因所在。
但訊息機制也有缺點,就是佔用ROM相應會增大一些,具體原因在於,在不同任務的訊息處理下,可能會存在重複編碼的地方。
另一方面,在人機互動的場合(如帶有液晶顯示屏或者數碼管的場合),使用訊息機制可以非常方便的進行程式的開發。
主程式構架如下:
while(1)
{
SoftTimerMainLoop();
//get message
MSG_GetMessage(&msg);
//send msg to ui co-thread
UIProcessMainLoop(&msg);
//update display
ST7920UpdateFromMem();
}
介面(任務)程式如下:
static EUISTATE UINullScreen(SYSMSG* pMsg)
{
EUISTATE eUIState = E_UI_STATE_NULL;
switch(pMsg->uMsg)
{
case MSG_UI_ENTER_SCREEN:
pMsg->uMsg = MSG_NULL;
break;
case MSG_UI_EXIT_SCREEN:
pMsg->uMsg = MSG_NULL;
break;
case MSG_UI_LOOP_SCREEN:
pMsg->uMsg = MSG_NULL;
break;
case MSG_KEY:
break;
case MSG_TIMER:
break;
case MSG_USER_DEFINED:
break;
}
return eUIState;
}
在進入畫面,以及退出畫面的時候,以及當前畫面迴圈,均會有訊息產生。這樣就非常方便程式的編寫。此外,還可以接受按鍵,定時器,自定義訊息等等。每個任務只需要對自己感興趣的訊息作出處理即可。
任務通過訊息機制來進行處理,可以使得任務之間的耦合性降到最低,甚至可以在執行的過程中,動態的解除安裝某個任務,而不會對整個程式產生任何影響。這些都得益於訊息機制,也是模組化程式的真正實現方法。