9.邮箱的使用

1.邮箱简介:

单个邮箱大小的限制:4字节,邮箱总大小:用户设置sizeof()/4

2.例程源码解析及邮箱的相关操作

    init初始化/creat创建        发送        接收        detach脱离/delete删除

邮箱控制块与存放邮件的内存池创建

/* 邮箱控制块 */
static struct rt_mailbox mb;
/* 用于放邮件的内存池 */
static char mb_pool[128];

邮箱静态初始化:

rt_err_t result;

    /* 初始化一个mailbox */
    result = rt_mb_init(&mb,
                        "mbt",                      /* 名称是mbt */
                        &mb_pool[0],                /* 邮箱用到的内存池是mb_pool */
                        sizeof(mb_pool) / 4,        /* 邮箱中的邮件数目,因为一封邮件占4字节 */
                        RT_IPC_FLAG_FIFO);          /* 采用FIFO方式进行线程等待 */
    if (result != RT_EOK)
    {
        rt_kprintf("init mailbox failed.\n");
        return -1;
    }

邮箱动态初始化

rt_mailbox_t mb_d;
mb_d=rt_mb_create("mb_d",32,RT_IPC_FLAG_FIFO);
if(RT_NULL==mb_d){rt_kprintf("creat mailbox failed.\n"); return -1;}

邮件的发送:

rt_mb_send(&mb, (rt_uint32_t)&mb_str1[0]);  
//发送成功返回RT_EOK;如果邮箱已经满了,返回-RT_EFULL。
rt_mb_send_wait(rt_mailbox_t mb,
                         rt_uint32_t  value,
                         rt_int32_t   timeout)//发送成功返回RT_EOK;如果邮箱已经满了,返回-RT_EFULL。

邮件的接收:

if (rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str);
            if (str == mb_str3)
                break;

            /* 延时10个OS Tick */
            rt_thread_delay(10);
        }

3.注意事项:

不能在中断中接收,会导致中断的挂起,但是可在中断中发送邮件  wait发送也不能在中断中使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值