RTT-邮箱

RTT-邮箱

概念

邮箱是特别的消息队列
邮箱中每个邮件的长度固定,是4个字节
如果是大的buff,直接发送地址

接口

创建静态邮箱

rt_err_t rt_mb_init (rt_mailbox_t mb, const char *name, void *msgpool, rt_size_t size, rt_uint8_t flag)

删除静态邮箱

rt_err_t rt_mb_detach (rt_mailbox_t mb)

创建动态邮箱

rt_mailbox_t rt_mb_create (const char *name, rt_size_t size, rt_uint8_t flag)

删除动态邮箱

rt_err_t rt_mb_delete (rt_mailbox_t mb)

发送邮件

rt_err_t rt_mb_send (rt_mailbox_t mb, rt_uint32_t value)

接收邮件

rt_err_t rt_mb_recv (rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout)

用法

  1. 定义邮箱控制块
  2. 创建邮箱对象
  3. 发送邮件
  4. 接收邮件
/* 定义线程控制块指针 */
static rt_thread_t receive0_thread = RT_NULL;
static rt_thread_t receive1_thread = RT_NULL;
static rt_thread_t send_thread = RT_NULL;
/* 定义邮箱控制块 */
static rt_mailbox_t test_mail = RT_NULL;

char test_str1[] = "this is a mail test 1";/* 邮箱消息test1 */
char test_str2[] = "this is a mail test 2";/* 邮箱消息test2 */

/* 创建一个邮箱 */
    test_mail = rt_mb_create("test_mail", /* 邮箱名字 */
                             10,
                             RT_IPC_FLAG_FIFO);/* 信号量模式 FIFO(0x00)*/
if (test_mail != RT_NULL)
	rt_kprintf("creat mb success\n\n");

static void receive0_thread_entry(void *parameter)
{
    rt_err_t uwRet = RT_EOK;
    char *r_str;
    /* 任务都是一个无限循环,不能返回 */
    while (1)
    {
        /* 等待接邮箱消息 */
        uwRet = rt_mb_recv(test_mail, /* 邮箱对象句柄 */
                           (rt_uint32_t *)&r_str, /* 接收邮箱消息 */
                           0);/* 指定超时事件,一直等 */

        if (RT_EOK == uwRet) /* 如果接收完成并且正确 */
        {
            rt_kprintf("rev0:%s\n\n", r_str);
        }
        // else
        //     rt_kprintf("mb0 failed:0x%x\n", uwRet);
        
        rt_thread_delay(10);
    }
}

static void receive1_thread_entry(void *parameter)
{
    rt_err_t uwRet = RT_EOK;
    char *r_str;
    /* 任务都是一个无限循环,不能返回 */
    while (1)
    {
        /* 等待接邮箱消息 */
        uwRet = rt_mb_recv(test_mail, /* 邮箱对象句柄 */
                           (rt_uint32_t *)&r_str, /* 接收邮箱消息 */
                           0);/* 指定超时事件,一直等 */

        if (RT_EOK == uwRet) /* 如果接收完成并且正确 */
        {
            rt_kprintf("rev1:%s\n\n", r_str);
        }
        // else
        //     rt_kprintf("mb1 failed:0x%x\n", uwRet);
        
        rt_thread_delay(10);
    }
}

static void send_thread_entry(void *parameter)
{
    rt_err_t uwRet = RT_EOK;
    /* 任务都是一个无限循环,不能返回 */
    while (1)
    {
        //如果KEY1被单击
        if (Key_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)
        {
            rt_kprintf("KEY0\n");
            /* 发送一个邮箱消息1 */
            uwRet = rt_mb_send(test_mail, (rt_uint32_t)&test_str1);
            if (RT_EOK == uwRet)
                rt_kprintf("mb0 send success\n");
            else
                rt_kprintf("mb0 send failed\n");
        }
        //如果KEY2被单击
        if (Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
        {
            rt_kprintf("KEY1\n");
            /* 发送一个邮箱2 */
            uwRet = rt_mb_send(test_mail, (rt_uint32_t)&test_str2);
            if (RT_EOK == uwRet)
                rt_kprintf("mb1 send success\n");
            else
                rt_kprintf("mb1 send failed\n");
        }
        rt_thread_delay(20);     //每20ms扫描一次
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangYi0_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值