9.邮箱的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38245860/article/details/80681206

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发送也不能在中断中使用

猜你喜欢

转载自blog.csdn.net/sinat_38245860/article/details/80681206