OSE RTOS中APP进程接收消息机制

在OSE运行的APP进程均有一个PCB结构体,结构体中包含了指向该进程signal list的指针,是一个链表,实际上是指向链表的头指针与尾指针,头指针结构中包含指向下一个signal的next指针。其他进程向该进程发送的消息,将用此链表维护。

PCB:  

    /* Signal buffers head of list.*/
    struct sigbuf *sigbuf_head;

    /* Signal buffers tail of list.*/
    struct sigbuf *sigbuf_tail;

sigbuf_head:

    /* Next signal in the list.*/
    struct sigbuf *next;

进程一旦启动,就进入while循环(Loop forever),msg_receive会调用OSE的receive系统函数接收消息。如果循环又从头开始执行,这时会通过msg_receive进入系统调用receive函数,receive函数执行有两种情况:

1,如果此时该进程的signal list不空,函数将取出链表头指针指向的signal,然后再调整下signal list,将链表的头指针指向signal list的下一个signal,最后返回取出的signal。

2,如果发现该进程的signal list是空的,函数将在判断signal list为空的分支代码处puts this process to sleep via system call "odo_wait". 在该进程sleep过程中,如果有A进程向该进程发送消息,OSE的send系统函数将会把消息挂到当前进程的signal list中,并且如果A进程优先级低于当前进程,会触发OSE从A进程切换到当前进程执行(OSE进程抢占式调度方式),然后当前进程继续从上次sleep代码处指向,在receive函数中对signal list遍历的for循环的下一次执行中,将会得到A进程所发的signal,并返回。

while(true)
{
      msg = msg_receive(WAIT_INFINITE);
      handler(msg);
      release(msg);
}


版权声明:本文为yiyeguzhou100原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。