章节列表

邮箱的获取与释放

2018-09-11 05:38:32 +0000 李述铜

同学,想知道怎么样向邮箱收发消息吗?欢迎学习本小节课时!

当你学完这节课时之后,你就会理解当一个任务向另一个任务,或者中断向任务发送数据或者消息时,究竟是怎样一个过程?

这节课程所涉及的操作,和计数信号量的获取与释放类似,只不过多了从消息缓冲区中收发消息的操作。相信你能顺利掌握!

主要内容

同样的,学习本节课时的前提是你顺利掌握了事件控制块的等待与通知接口工作原理。

获取消息的操作,只不过是在事件控制块相应接口之上附加了从缓冲区中取消息的操作。以下就其中复杂点的操作说明下,其它简单的就不在此赘述。

从非空邮箱取消息

此时只需要从缓冲区中取出消息即可。参考【邮箱的原理与创建】课时,消息缓冲区是一个FIFO/LIFO的结构,所以取出时直接从读索引开始取。注意,不是从缓冲区起始地址处开始出。

向无任务等待邮箱发消息

邮箱在此时承担的角色相当于消息缓冲区。同上,发消息时是通过写索引开始写。

注意,虽然看起来读索引和写索引都是在各自独立地在自增及遇边界时回绕;但是在修改索引前,有预先判断是否允许修改(如写之前判断缓冲区是否有空闲),所以不会导致读索引比写索引更超前的情况。

重点难点

注意事项

消息类型

一般情况下,我们会为消息单独分配一个数据块,在其中填入要发送的内容后再向邮箱发送。

但有时,如果消息非常简单,比如只是一个简单整数(字符),可以将其强制转换为(void *)直接发送,这样反而节省空间且更方便用代码实现。所以,我们可以理解为:邮箱的消息缓冲区存放的是整数值,其最大的位宽与(void *)位宽相同。而不必认为一定要向其发送指针进去。

也许你会考虑将消息缓冲区的单元定义成uint32_t或者uint64_t,这也是可以的。只不过你在发送指针时,同样也要进行类型转换。

发消息等待

这门课程中没有实现发消息等待功能,即如果发送消息的任务必须等待另一任务接受到消息时才退出发送。

如果你对这个功能感兴趣,可以研究下实现过程。

常见问题