章节列表

邮箱的原理与创建

2018-05-29 03:39:42 +0000 李述铜

从本章开始,我们进入到邮箱模块的实现!

同信号量实现方法一样,邮箱结构也是基于事件控制块,在控制块的基础之上添加了一个有限长度循环的FIFO缓冲区。

能否正确理解该FIFO缓冲区的操作机制,是理解邮箱工作原理的关键。

主要内容

邮箱的实现如下图所求,可以看到其关键在于增加了循环缓冲区。

这种缓冲区是通过一个void *数组实现,然后通过读索引、写索引的动态调整,使得对该数组的访问呈现出一种“FIFO”或者”LIFO”的效果。

重点难点

缓冲区访问控制

本小节的难点在于理解怎样通过读索引、写索引的控制来实现对缓冲区的访问。

实现原理并不难,主要在于在读写到边界时强制调整下索引,“回绕到数组起始地址”。

消息类型

可以看到,在实现中要求收发消息均通过void *指针。因为这里是想设计出一个能收发任何类型的消息,所以自然不能限制消息的类型,使用void *替代。

其次,邮箱中只容纳指针,并不管理具体的消息存储区。这样无论在收发消息时,都可以非常快速,其次也不需要管理消息存储区的内存分配和释放。消息体的内存管理由任务控制,而通过我们只需发预先静态分配一些消息存储区,而不需要动态分配不同大小的消息存储区,所以这项工作由任务来完成并不困难。

注意事项

如果你接触过ucos,可能会发现这里的邮箱更像是ucos中的消息队列。是的,没错!

对于同样功能的东西,不同的人可能有不同的叫法,这是再正常不过的。所以,嗯,如果你想称这个模块为消息队列,那也没问题,只要你理解这个模块具体的功能,名称什么的关系不大。

应用实例

常见问题