ti.sysbios.knl.Mailbox邮箱模块提供了一组管理邮箱的功能。邮箱能够用于将缓冲区从同一处理器上的一个任务传递到另一个任务。

一个邮箱实例可以由多个读写器使用

邮箱模块将缓冲区复制到固定大小的内部缓冲区。这些缓冲区的大小和数量是在创建(或构造)实例时指定的。通过Mailbox_post()发送缓冲区时,将完成复制。通过Mail_pend()检索缓冲区时发生另一个副本。

Mailbox_create()和Mailbox_delete()被用于创建和删除mailkoxes。也可以静态创建邮箱对象。

邮箱可用于确保传入缓冲区的流量不会超过系统处理这些缓冲区的能力。

邮箱创建时,可以指定内部邮箱缓冲区的数量和每个缓冲区的大小。由于在创建的时候指定了大小,因此与邮箱实例一起发送和接收的所有缓冲区的大小都必须相同。

下面时邮箱的创建和删除

Mailbox_Handle Mailbox_create(
	SizeT bufsize,
	UInt numBufs,
	Mailbox_Params *params,
	Error_Block *eb
)

Void Mailbox_delete(Mailbox_Handle *handle);

Mailbox_pend()用于从邮箱读取缓冲区。如果没有可用的缓冲区(则邮箱为空),则Mailbox_pend()将阻塞。timeout参数允许任务等待超时的时间,无限期等待(BIOS_WAIT_FOREVER),或者根本是不等待(BIOS_NO_WAIT)。时间单位是system clock ticks。
下面是函数原型:

Bool Mailbox_pend(
	Mailbox_Handle handle,
	Ptr buf,
	UInt timeout
);

Mailbox_post()用于将缓冲区投递到邮箱,,如果没有可用的缓冲区插槽(即邮箱已满),则mailbox_post()将阻塞,timeout参数允许任务等待超时的时间,无限期等待(BIOS_WAIT_FOREVER),或者根本是不等待(BIOS_NO_WAIT)。

Bool Mailbox_post(
	Mailbox_Handle handle,
	Ptr buf,
	UInt timeout
);

邮箱提供配置参数,允许您将事件与邮箱关联起来。者允许您同时等待一个邮箱消息和另一个事件。Mailbox提供两个配置参数来支持邮箱readerEvent和readerEventId的读取器事件。这允许邮箱读取器使用事件对象等待邮箱消息。Mailbox还为邮箱写入程序提供了两个配置参数writerEvent和writerEventId。这允许邮箱writers使用事件对象来等待邮箱中的空间。

请注意,这些事件句柄的名称可能会引起误解。readerEvent是邮箱读取器应该挂起的事件,但是它是由邮箱writer在Mailbox_post()调用中发布的。writerEvent是邮箱写入程序应等待邮箱未满时挂起的事件,以便使它能够成功执行Mailbox_post(),而不会因为邮箱已满而挂起。但是,每当成功读取邮箱时,writeEvent由邮箱读取器发布(即,Mailbox_pend()返回TRUE)

使用事件时,线程调用Event_pend()并等待多个事件。从Evnet_pend()返回时,线程必须调用Mailbox_pend()或Mailbox_post()这取决于它是reader还是writer,超时值为BIOS_NO_WAIT。

调用Mailbox_post()可能会导致在特定情况下重新启用硬件中断。

参考文献:

  1. 《TI-RTOS Kernel (SYS/BIOS) User’s Guide》