用uc/OS-II实现系统的消息循环

今天,作了uc/OS-II系统的消息循环的实验,写一些收获。编程

先说说消息机制的原理。经过消息循环能够实现基于时间驱动的应用程序,即每个事件都会产生特定的消息,而后这个消息被发送到某个/某些任务消息队列中,任务读取到消息后做出相应的处理。任务消息队列通常采用FIFO结构,即最早发送的消息任务会最早读取到。
windows

用uc/OS实现的系统消息循环感受相似windows编程的消息机制。系统不断轮询来从消息队列中取出最近的消息进行处理。固然,用uc/OS实现的消息机制就要比windows的简单多了。在uc/OS中,通讯机制里面有一种就是消息队列,经过这种通讯方式咱们就能在uc/OS中实现咱们的消息机制。数组

在uc/OS中,消息队列能够工做与一对一的工做方式,即一个任务发送消息到消息队列,而另外一个任务从消息队列中读取消息。这种方式简单也经常使用。另外还有一种多对一的工做方式,即多个任务发送消息队列到同一个消息队列,而另外只有一个任务从这个消息队列中读取信息,这种便是咱们实现消息机制须要用到的工做方式。固然,消息队列还有其余工做方式,可是都不经常使用。函数

咱们把消息队列做为任务消息队列,而后任务就能够经过读取消息队列中的消息来获取消息。固然,通常哪一个任务须要处理消息循环才会创建相应本身的任务消息队列。消息的储存须要空间,因此还须要定义一个数组来进行消息的储存。由于消息的类型不一样,因此数组的类型为void。而将任务队列与任务消息队列存储区链接起来的关键就是OS_EVENT  *OSQCreate (void **start, INT16U size)消息队列建立函数。任务消息的队列建立需在启动uc/OS以前。ui

实验中用到的关于消息函数已经有现成的了。在任务消息头文件中,咱们能够自定义消息。spa

如:指针

#define TM_KEY 5762队列

       #define TM_KEYDOWN 5763事件

......get

定义好消息结构体

typedef struct tagMSG

   uint32  message; // 消息值
    uint32  wParam; // 消息附加信息1
    uint32  lParam; // 消息附加信息2
} MSG;


而后是最重要的两个消息函数SendMessage()和GetMessage()。

  /****************************************************************************
* 名称:SendMessage()
* 功能:发送一个消息,即消息发送管理器。
*      根据实际状况,将消息分派到不一样的任务消息队列中。
* 入口参数:msg 所要发送的消息(指针)
* 出口参数:操做成功返回TRUE,不然返回FALSE。
****************************************************************************/
uint8  SendMessage(MSG *msg)
{  
uint32  message;
   TMQ   *target;
   uint8   err;


   message = msg->message;
   switch(message)
   {  
   case  TM_KEY:
case  TM_KEYDOWN:
 
 case  TM_KEYUP:
    target = task_tmq; // 如果键盘消息,向task1_tmq任务消息队列发送
     break;
     
   case  TM_UART0RCV:
      target = task_tmq; // 如果串口接收消息,向task1_tmq任务消息队列发送
      break;
     
      // (在此添加用户任务消息分派处理)
      
   default:  target = NULL;
      break;
   }
   err = OSQPost(target, msg);
   if(err==OS_NO_ERR) 
    return(TRUE);
   else  
    return(FALSE); 
}

/****************************************************************************
* 名称:GetMessage()
* 功能:等待一个消息。当接收到消息时才返回。
* 入口参数:tmq 等待的任务消息队列(指针)
* 出口参数:返回接收到的消息。
****************************************************************************/
MSG  *GetMessage(TMQ *tmq)
{  

uint8  err;
return(OSQPend(tmq, 0, &err));
}

具体实现的代码就不用写了,重要是这个思想和实现方法。

相关文章
相关标签/搜索