单片机程序构架--消息驱动机制

做过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;
}


在进入画面,以及退出画面的时候,以及当前画面循环,均会有消息产生。这样就非常方便程序的编写。此外,还可以接受按键,定时器,自定义消息等等。每个任务只需要对自己感兴趣的消息作出处理即可。

任务通过消息机制来进行处理,可以使得任务之间的耦合性降到最低,甚至可以在执行的过程中,动态的卸载某个任务,而不会对整个程序产生任何影响。这些都得益于消息机制,也是模块化程序的真正实现方法。

你可能感兴趣的:(单片机编程思想)