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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值