标题: 线程通信之邮箱个人理解,有错望高人指正! [打印本页]

作者: xuwei    时间: 2015-6-13 16:31
标题: 线程通信之邮箱个人理解,有错望高人指正!
线程和线程之间的通信可以靠邮箱来实现,从而完成线程间的通信,我做了一个小实验,来证明邮箱的建立和工作原理具体如下(其实很简单):
首先找到系统提供API函数接口,总共7个接口函数,只要关心四个就可以了,其他的视情况而定,分别是:
1:ACCEPT MESSAGE FROM MAILBOX
2:CREATE A MESSAGE MAILBOX
3.PEND ON MAILBOX FOR A MESSAGE
4.POST MESSAGE TO A MAILBOX
这四个函数就可以建立邮箱,等待,和发送消息,你要传送的变量或者说消息,API提供的是一个万能的VOID指针,所以你只要把你的消息搭载到邮箱里面就可以了,非常简单方便,只是定义数据类型号的时候一定注意邮箱是时间控制块的,所以一定要定义成时间类型的指针,这个不能搞错,还有建立的时候可以见一个而空的,或者已经有一则消息的都可以,视情况而定哦,很方便很简单那。下面看看到底消息被放到了油桶的那个位置?
看定义如下:
   void    *OSEventPtr;     //这就是一则消息的指针存放的载体!非常关键!消息就是被放到这里面的,但是什吗时间放,放什么,都是你决定的,API只是提供一个这样的载体的结构,所以不得不惊叹人家高人的水平啊,很牛叉。
下面是消息怎么被放进邮筒的:
pevent->OSEventPtr = msg;  
这就是结果!和明显了吧,这样一则消息就驻留到内存中的邮箱中等待被取,
消息怎么被取出?
  msg = pevent->OSEventPtr;
显而易见的事情了!
你要做的就是做几个指针接收这则消息就这么简单那而已!
注意空邮箱是要初始化的,还有就是邮箱的个数是由任务控制块决定在这里:
OSEventTbl[OS_MAX_EVENTS]
其实这个和就绪表是差不多的,也有一个指针指向空的任务控制块池,持的大小也是用户决定!相当爽!指针入下: *OSEventFreeList;  ,这个是只想当前空闲的任务控制块!
这是APP
static  void  AppTask_LED (void *p_arg)
{
INT8U mistak_mabox_led;//消息错误存储
INT8U *mes;
    (void)p_arg;

    while (1)                  
    {  
      
mes=(INT8U*)OSMboxPend (MBOX_LED, (INT16U )0, &mistak_mabox_led);
    if(*mes==3)
    {
        LED_On();
        OSTimeDlyHMSM(0,0,0,500);
        LED_Off();
  OSTimeDlyHMSM(0,0,0,500);
  }
  else
  {
    LED_On();
        OSTimeDlyHMSM(0,0,3,0);
        LED_Off();
  OSTimeDlyHMSM(0,0,3,0);
  
  }
    }
}
static  void  AppTask_LED1 (void *p_arg)
{
  static INT8U tab[4]={2,4};

    (void)p_arg;
   

    while (1)
    {        
      
      OSMboxPost (MBOX_LED,&tab);
// OSTimeDlyHMSM(0,0,5,0);
    }
}
一个简单的测试:消息=3执行短循环,反之执行长循环!
   王均伟

没发工资他大爷的!            









欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1