内容纲要
从本章开始,我们进入到邮箱模块的实现!
同信号量实现方法一样,邮箱结构也是基于事件控制块,在控制块的基础之上添加了一个有限长度循环的FIFO缓冲区。
能否正确理解该FIFO缓冲区的操作机制,是理解邮箱工作原理的关键。
主要内容
邮箱的实现如下图所求,可以看到其关键在于增加了循环缓冲区。
这种缓冲区是通过一个void *数组实现,然后通过读索引、写索引的动态调整,使得对该数组的访问呈现出一种“FIFO”或者"LIFO"的效果。
重点难点
缓冲区访问控制
本小节的难点在于理解怎样通过读索引、写索引的控制来实现对缓冲区的访问。
实现原理并不难,主要在于在读写到边界时强制调整下索引,“回绕到数组起始地址”。
消息类型
可以看到,在实现中要求收发消息均通过void 指针。因为这里是想设计出一个能收发任何类型的消息,所以自然不能限制消息的类型,使用void 替代。
其次,邮箱中只容纳指针,并不管理具体的消息存储区。这样无论在收发消息时,都可以非常快速,其次也不需要管理消息存储区的内存分配和释放。消息体的内存管理由任务控制,而通过我们只需发预先静态分配一些消息存储区,而不需要动态分配不同大小的消息存储区,所以这项工作由任务来完成并不困难。
注意事项
如果你接触过ucos,可能会发现这里的邮箱更像是ucos中的消息队列。是的,没错!
对于同样功能的东西,不同的人可能有不同的叫法,这是再正常不过的。所以,嗯,如果你想称这个模块为消息队列,那也没问题,只要你理解这个模块具体的功能,名称什么的关系不大。