Zephyr 中 Mailbox 的使用

来源:互联网 发布:sql 2005连接到服务器 编辑:程序博客网 时间:2024/05/29 07:09

Mailbox 是啥?

一般,在操作系统中,线程之间是要相互通信的,最简单的是叫做信号量,稍复杂一点的是 Mailbox。信号量用于通知对方一个简单的状态:可以通行或者不能通行,可以理解为这个信号量就是红绿灯,有红灯和绿灯两种状态,红灯表示你不能通行,绿灯表示你可以通行。用信号量时,一般是在信号量之外有约定,可以通行的情况下,是可以操作什么资源,这个“可以操作什么资源的信息”是没有在信号量上有记录的。Mailbox,中文翻译是邮箱,除了接收方地址以外,还有信里面的内容,传递了更多的信息。接收方发现邮箱中没有待处理的信件,则等待或者去干别的事情。发送方负责发送邮件,在发送前要确定接收方把所有邮件都处理完了。这里特别注意,一个mailbox同时只能传递一封邮件(即一个消息),这里不同于现实生活中的邮箱(现实生活中的邮箱可以塞很多邮箱,接收者可以累积多封邮件后一起处理,而zephyr中的mailbox则不同,发送方发送一个邮件后,只有等接收方处理完这个邮件后才能发送下一封邮件)。 发送方有两种方法来发送邮件: 1)发送后,等待对方接收,在等待时不能干其它事情,直到对方接收了这个消息后才继续去干活; 2)发送后,立即去干别的活,不管对方是否有接收完毕,但是,在发送下一封邮件前,要检查接收方是否接收了,如果没有接收,则不能发送。接收方对邮件的处理也有两种方法:1)查看是否有收到邮件,如果有收到,同时就把邮件取出来去处理掉;2)先查看,但是不去处理;待做了一些其它事情(也有可能没有做其它事情)后再去把邮件取出并处理。首先,需要先定义一个邮箱,让发送方和接收方都知道这个邮箱:用这个宏定义来定义邮箱: K_MBOX_DEFINE其次,对邮箱做初始化:k_mbox_init()发送方有两个函数可用(分别对应“发送后等待”和“发送后不等待”):k_mbox_put()k_mbox_async_put()接收方,统一用这个函数看邮箱:k_mbox_get()如果在调用上面这个函数时,其中一个参数为 NULL(用于存放接收的数据的地址空间),则先不处理消息,然后,再调用下面两个函数之一来处理消息:k_mbox_data_get()k_mbox_data_block_get()前者是普通的buffer机制,后者是 pool 机制。具体这两者的区别,请参考 zephyr 的官方文档。不属于本次讨论的范畴。

mailbox APIs (在 kernel.h中提供):

K_MBOX_DEFINEk_mbox_init()k_mbox_put()k_mbox_async_put()k_mbox_get()k_mbox_data_get()k_mbox_data_block_get()