H HRTOS 示例
Communication Core

邮箱通信

邮箱机制用于实现任务间异步消息通信:发送任务写入数据,接收任务阻塞等待, 实现任务同步与数据传递。邮箱是 HRTOS 通信模型中的核心 IPC 机制之一。

示例目标

系统运行两个任务:sender 发送任务与 receiver 接收任务,通过邮箱机制实现消息传递。 发送任务持续写入数据,接收任务阻塞等待消息到达,验证任务间异步通信能力。

核心API os_mailbox_send
接收机制 阻塞等待
通信方式 异步消息
缓冲机制 邮箱缓冲区

核心机制

  • 消息发送与接收
  • 任务阻塞与唤醒
  • 邮箱缓冲区管理
  • 任务同步机制
Mechanism Definition

机制定义

邮箱通信的核心组成与工作原理

邮箱(Mailbox)是 HRTOS 中实现任务间异步通信的核心机制,由发送、缓冲、接收和任务同步四个关键部分组成。 它提供轻量级的数据交换能力,是进程间通信(IPC)的基础机制之一。

核心公式: Mailbox = Send + Buffer + Receive + Task Sync

发送机制

发送任务通过 os_mailbox_send API 将数据写入邮箱缓冲区。 如果缓冲区已满,发送任务可以选择阻塞或返回错误,确保数据不会丢失。

缓冲管理

邮箱维护一个固定大小的缓冲区,用于暂存待接收的消息。 缓冲区采用 FIFO(先进先出)策略,确保消息按发送顺序被接收。

接收机制

接收任务通过 os_mailbox_receive API 从邮箱读取数据。 如果缓冲区为空,接收任务进入阻塞状态,等待消息到达。

任务同步

当消息到达邮箱时,系统自动唤醒阻塞的接收任务,使其从 BLOCKED 状态转换为 READY 状态, 实现任务间的同步与协调。

核心判断: 邮箱通信是 HRTOS 中实现任务间异步通信的关键机制,通过缓冲区和任务同步机制, 实现了发送任务与接收任务的解耦,是嵌入式实时系统中任务间数据传递的基础。
Workflow

执行流程

邮箱通信的完整执行路径

1初始化邮箱:hrtos_main 中调用 os_mailbox_init 创建邮箱缓冲区
2发送任务运行:sender 任务循环调用 os_mailbox_send 写入消息
3接收任务阻塞:receiver 任务调用 os_mailbox_receive,因无消息而阻塞
4消息到达唤醒:新消息写入邮箱后,系统唤醒阻塞的接收任务
5数据处理:receiver 任务获取消息并处理,更新 LED 状态
hrtos_main → os_mailbox_init → os_task_create → sender 发送消息 → 邮箱缓冲区 → 接收任务阻塞 → 消息唤醒 → receiver 读取处理 → LED 更新
Core Code

核心代码

邮箱通信的完整实现

发送任务实现

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);
}
Expected Result

运行结果

示例执行后的预期行为

消息传递 sender 任务持续发送递增的消息值,receiver 任务按顺序接收
任务同步 receiver 任务在无消息时阻塞,消息到达后立即被唤醒
LED 状态 接收到的消息低两位用于控制 LED 状态变化
系统本质: 本示例的核心不是 LED 控制,而是验证 HRTOS 中:两个独立任务通过邮箱机制实现异步消息通信, 展示任务间数据传递与同步的能力。
Important Notes

注意事项

使用本示例时需要关注的关键点

邮箱缓冲区大小

邮箱缓冲区大小需要在初始化时配置,缓冲区过小会导致发送任务频繁阻塞, 缓冲区过大会占用过多内存。应根据实际消息频率和数据大小合理配置。

任务优先级设置

sender 任务优先级为 3,receiver 任务优先级为 2。 优先级设置影响任务调度行为,需要根据系统需求调整,确保消息及时处理。

阻塞超时处理

接收任务在邮箱为空时会阻塞等待。在实际应用中,可以设置超时参数, 避免任务无限期阻塞,提高系统的健壮性。

消息数据格式

本示例使用简单的 u8 类型消息。实际应用中,可以定义结构体或复杂数据类型, 通过邮箱传递更丰富的信息,但需要注意数据大小限制。