RTT Nano学习笔记 10 - 邮箱

目录

1. 创建

2. 删除

3. 发送

4. 接收

5. 实例


邮箱用于进程间通信,不同于之前的互斥量,信号量和事件,邮箱具有数据交互功能。RTT的邮箱中每一封邮件只能容纳 固定的4字节内容 (针对32位处理系统,指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针),并且具备一定的存储功能,能够缓存一定数量的邮件数。

1. 创建

#define rtosMailboxCreate(                              \
    handle,                                             \
    name,                                               \
    size,                                               \
    flag                                                \
    )                                                   \
    {                                                   \
        handle = rt_mb_create(name, size, flag);        \
    }

参数size是邮箱支持的最大邮件数(分配给该邮箱的内存大小为size * 4)。参数flag同之前的定义,FIFO或PRIO。

handle的宏定义:

#define rtosMailbox_t                                   rt_mailbox_t

2. 删除

#define rtosMailboxDelete(                              \
    handle                                              \
    )                                                   \
    {                                                   \
        rt_mb_delete(handle);                           \
    }

3. 发送

#define rtosMailboxSend(                                \
    handle,                                             \
    value,                                              \
    timeout                                             \
    )                                                   \
    {                                                   \
         rt_mb_send_wait(handle, (uint32_t)&value,      \
                timeout);                               \
    }

RT Thread有2个发送函数,这里选择带超时参数的,另外一个其实就是timeout = 0。

参数value是邮件内容,32位的变量,注意发送的是变量的地址。

4. 接收

#define rtosMailboxReceive(                             \
    handle,                                             \
    value,                                              \
    timeout,                                            \
    ret                                                 \
    )                                                   \
    {                                                   \
        ret = rt_mb_recv(handle, (rt_uint32_t *)&value, \
            timeout);       \
    }

参数value是返回值,即接收到的邮件内容,也是变量的地址。

返回0表示接收到邮件。

5. 实例

2个进程,一个发送邮件,一个接收邮件。

static rtosMailbox_t mailbox = NULL;

static void threadMailboxReceive(void *parameter)
{
    while(1)
    {
        char *str;
        uint32_t ret;
        
        rtosMailboxReceive(mailbox, str, RTOS_WAIT_FOREVER, ret);
        if(ret == RTOS_EOK)
        {
            Printf("Got a mail:%s\n", str);
            rtosThreadSleep(100);
        }
    }
}

static void threadMailboxSend(void *parameter)
{
    while(1)
    {
        char str1[] = "I'm a mail";
        char str2[] = "I'm another mail";
        Printf("Send a mail:%s\n", str1);
        rtosMailboxSend(mailbox, str1, RTOS_WAIT_FOREVER);
        rtosThreadSleep(2000);
        Printf("\n");
        Printf("Send a mail:%s\n", str2);
        rtosMailboxSend(mailbox, str2, RTOS_WAIT_FOREVER);
        rtosThreadSleep(2000);
        Printf("\n");
    }
}

发送进程发送2个字符串,注意这里的字符串是发送进程中的变量。

而接收进程接收到邮件后将字符串打印处理。

初始化2个进程为不同的优先级。

static void mailboxTestInit(void)
{
    rtosMailboxCreate(mailbox, "mail", 2, RTOS_IPC_FLAG_FIFO);

    rtosCreateThread(
        handle1,
        "Mailbox R",
        threadMailboxReceive,
        (void *)0,
        NULL,
        256,
        RTOS_PRIORITY_MAX - 1, 
        100);
    rtosCreateThread(
        handle2,
        "Mailbox S",
        threadMailboxSend,
        (void *)0,
        NULL,
        256,
        RTOS_PRIORITY_MAX - 2, 
        100);
    rtosStartThread(handle1);
    rtosStartThread(handle2);
}

打印结果如下:

Send a mail:I'm a mail
Got a mail:I'm a mail

Send a mail:I'm another mail
Got a mail:I'm another mail

Send a mail:I'm a mail
Got a mail:I'm a mail

Send a mail:I'm another mail
Got a mail:I'm another mail

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值