发送机制
发送任务通过 os_mailbox_send API 将数据写入邮箱缓冲区。 如果缓冲区已满,发送任务可以选择阻塞或返回错误,确保数据不会丢失。
邮箱机制用于实现任务间异步消息通信:发送任务写入数据,接收任务阻塞等待, 实现任务同步与数据传递。邮箱是 HRTOS 通信模型中的核心 IPC 机制之一。
系统运行两个任务:sender 发送任务与 receiver 接收任务,通过邮箱机制实现消息传递。 发送任务持续写入数据,接收任务阻塞等待消息到达,验证任务间异步通信能力。
邮箱通信的核心组成与工作原理
邮箱(Mailbox)是 HRTOS 中实现任务间异步通信的核心机制,由发送、缓冲、接收和任务同步四个关键部分组成。 它提供轻量级的数据交换能力,是进程间通信(IPC)的基础机制之一。
发送任务通过 os_mailbox_send API 将数据写入邮箱缓冲区。 如果缓冲区已满,发送任务可以选择阻塞或返回错误,确保数据不会丢失。
邮箱维护一个固定大小的缓冲区,用于暂存待接收的消息。 缓冲区采用 FIFO(先进先出)策略,确保消息按发送顺序被接收。
接收任务通过 os_mailbox_receive API 从邮箱读取数据。 如果缓冲区为空,接收任务进入阻塞状态,等待消息到达。
当消息到达邮箱时,系统自动唤醒阻塞的接收任务,使其从 BLOCKED 状态转换为 READY 状态, 实现任务间的同步与协调。
邮箱通信的完整执行路径
邮箱通信的完整实现
sender 任务函数,持续发送消息到邮箱
#include "hrtos.h"
#define MAILBOX_ID 0
void sender(void)
{
u8 msg = 0x55;
while(1)
{
os_mailbox_send(MAILBOX_ID, msg);
msg++;
os_delay(5);
}
}
receiver 任务函数,阻塞等待并处理消息
void receiver(void)
{
int msg;
while(1)
{
msg = os_mailbox_receive(MAILBOX_ID);
if(msg >= 0)
{
P1 = (P1 & 0xFC) | (msg & 0x03);
}
os_delay(1);
}
}
hrtos_main 函数,初始化邮箱并创建任务
void hrtos_main(void)
{
os_mailbox_init(MAILBOX_ID);
os_task_create((unsigned int)sender, 1, 3, 5);
os_task_create((unsigned int)receiver, 2, 2, 5);
}
示例执行后的预期行为
使用本示例时需要关注的关键点
邮箱缓冲区大小需要在初始化时配置,缓冲区过小会导致发送任务频繁阻塞, 缓冲区过大会占用过多内存。应根据实际消息频率和数据大小合理配置。
sender 任务优先级为 3,receiver 任务优先级为 2。 优先级设置影响任务调度行为,需要根据系统需求调整,确保消息及时处理。
接收任务在邮箱为空时会阻塞等待。在实际应用中,可以设置超时参数, 避免任务无限期阻塞,提高系统的健壮性。
本示例使用简单的 u8 类型消息。实际应用中,可以定义结构体或复杂数据类型, 通过邮箱传递更丰富的信息,但需要注意数据大小限制。
深入学习的相关资源