rt_mb_send(&mb2, (rt_uint32_t)&mb_str1);
 if (rt_mb_recv(&mb1, (rt_ubase_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread1: get a mail from mailbox1, the content:%s\r\n", str);
            rt_thread_mdelay(50);
        }
    if(rt_mb_detach(&mb1) != RT_EOK)
        rt_kprintf("mb1 detach fail\r\n");
static void dynamic_entry(void *param)
{
    char *str;
    static rt_uint8_t cnt;

    while (cnt < 2)
    {
        cnt++;

        /* 发送 mb_str1 地址到邮箱中 */
        rt_mb_send(&mb2, (rt_uint32_t)&mb_str1);
        rt_kprintf("@thread1 send mb to thread2\r\n");

        /* 从邮箱中收取邮件 */
        if (rt_mb_recv(&mb1, (rt_ubase_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread1: get a mail from mailbox1, the content:%s\r\n", str);
            rt_thread_mdelay(50);
        }

        rt_thread_mdelay(50);
    }

    /* 执行邮箱对象脱离 */
    if(rt_mb_detach(&mb1) != RT_EOK)
        rt_kprintf("mb1 detach fail\r\n");
}
   /* 初始化一个 mailbox */
    result1 = rt_mb_init(&mb1,
                         "mbt1",                      /* 名称是 mbt */
                         &mb_pool1[0],                /* 邮箱用到的内存池是 mb_pool */
                         sizeof(mb_pool1) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                         RT_IPC_FLAG_FIFO);           /* 采用 FIFO 方式进行线程等待 */
    static rt_thread_t thread_id = RT_NULL;
    thread_id = rt_thread_create("thread1",           //名称
                                 dynamic_entry,   //线程代码
                                 RT_NULL,         //参数
                                 512,               //栈大小
                                 14,              //优先级
                                 20);             //时间片

    if (thread_id != RT_NULL)
        rt_thread_startup(thread_id);                         //线程进入就绪态
    else
        rt_kprintf("dynamic_thread create failure\r\n");
int MailBox_demo(void)
{

    rt_err_t result1, result2;

    /* 初始化一个 mailbox */
    result1 = rt_mb_init(&mb1,
                         "mbt1",                      /* 名称是 mbt */
                         &mb_pool1[0],                /* 邮箱用到的内存池是 mb_pool */
                         sizeof(mb_pool1) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                         RT_IPC_FLAG_FIFO);           /* 采用 FIFO 方式进行线程等待 */

    if (result1 != RT_EOK)
    {
        rt_kprintf("init mailbox1 failed.\r\n");
        return -1;
    }

    /* 初始化一个 mailbox */
    result2 = rt_mb_init(&mb2,
                         "mbt2",                      /* 名称是 mbt */
                         &mb_pool2[0],                /* 邮箱用到的内存池是 mb_pool */
                         sizeof(mb_pool2) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                         RT_IPC_FLAG_FIFO);           /* 采用 FIFO 方式进行线程等待 */

    if (result2 != RT_EOK)
    {
        rt_kprintf("init mailbox2 failed.\r\n");
        return -1;
    }

    //
    static rt_thread_t thread_id = RT_NULL;
    thread_id = rt_thread_create("thread1",           //名称
                                 dynamic_entry,   //线程代码
                                 RT_NULL,         //参数
                                 512,               //栈大小
                                 14,              //优先级
                                 20);             //时间片

    if (thread_id != RT_NULL)
        rt_thread_startup(thread_id);                         //线程进入就绪态
    else
        rt_kprintf("dynamic_thread create failure\r\n");

    //
    rt_thread_init(&static_thread,                          //线程handle
                   "thread2",                                     //线程名称
                   static_entry,                            //线程入口函数
                   RT_NULL,                                     //线程入口参数
                   &thread2_stack[0],               //线程栈地址
                   sizeof(thread2_stack),           //线程栈大小
                   15,                                              //线程优先级
                   10);                                             //线程时间片
    rt_thread_startup(&static_thread);                  //线程进入就绪态

    return RT_EOK;
}
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

/* defined the LED0 pin: PB5 */
#define LED0_PIN    GET_PIN(B, 5)
/* defined the LED1 pin: PE5 */
#define LED1_PIN    GET_PIN(E, 5)

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

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

static rt_uint8_t thread2_stack[512];                       //线程栈
static struct rt_thread static_thread;                      //线程控制块

static char mb_str1[] = "thread1 send information";
static char mb_str2[] = "thread2 send information";

int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(KEY0_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
}

//thread1
static void dynamic_entry(void *param)
{
    char *str;
    static rt_uint8_t cnt;

    while (cnt < 2)
    {
        cnt++;

        /* 发送 mb_str1 地址到邮箱中 */
        rt_mb_send(&mb2, (rt_uint32_t)&mb_str1);
        rt_kprintf("@thread1 send mb to thread2\r\n");

        /* 从邮箱中收取邮件 */
        if (rt_mb_recv(&mb1, (rt_ubase_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread1: get a mail from mailbox1, the content:%s\r\n", str);
            rt_thread_mdelay(50);
        }

        rt_thread_mdelay(50);
    }

    /* 执行邮箱对象脱离 */
    if(rt_mb_detach(&mb1) != RT_EOK)
        rt_kprintf("mb1 detach fail\r\n");
}

//thread2
static void static_entry(void *param)
{
    char *str;
    static rt_uint8_t cnt;

    while (cnt < 2)
    {
        cnt++;

        /* 从邮箱中收取邮件 */
        if (rt_mb_recv(&mb2, (rt_ubase_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread2: get a mail from mailbox2, the content:%s\r\n", str);
            rt_thread_mdelay(50);
            rt_kprintf("@thread2 send mb to thread1\r\n");

            /* 发送 mb_str2 地址到邮箱中 */
            rt_mb_send(&mb1, (rt_uint32_t)&mb_str2);
        }

        rt_thread_mdelay(50);
    }

    if(rt_mb_detach(&mb2) != RT_EOK)
        rt_kprintf("mb2 detach fail\r\n");

    rt_kprintf("Mailboxes demo finsh\r\n");
}

int MailBox_demo(void)
{

    rt_err_t result1, result2;

    /* 初始化一个 mailbox */
    result1 = rt_mb_init(&mb1,
                         "mbt1",                      /* 名称是 mbt */
                         &mb_pool1[0],                /* 邮箱用到的内存池是 mb_pool */
                         sizeof(mb_pool1) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                         RT_IPC_FLAG_FIFO);           /* 采用 FIFO 方式进行线程等待 */

    if (result1 != RT_EOK)
    {
        rt_kprintf("init mailbox1 failed.\r\n");
        return -1;
    }

    /* 初始化一个 mailbox */
    result2 = rt_mb_init(&mb2,
                         "mbt2",                      /* 名称是 mbt */
                         &mb_pool2[0],                /* 邮箱用到的内存池是 mb_pool */
                         sizeof(mb_pool2) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
                         RT_IPC_FLAG_FIFO);           /* 采用 FIFO 方式进行线程等待 */

    if (result2 != RT_EOK)
    {
        rt_kprintf("init mailbox2 failed.\r\n");
        return -1;
    }

    //
    static rt_thread_t thread_id = RT_NULL;
    thread_id = rt_thread_create("thread1",           //名称
                                 dynamic_entry,   //线程代码
                                 RT_NULL,         //参数
                                 512,               //栈大小
                                 14,              //优先级
                                 20);             //时间片

    if (thread_id != RT_NULL)
        rt_thread_startup(thread_id);                         //线程进入就绪态
    else
        rt_kprintf("dynamic_thread create failure\r\n");

    //
    rt_thread_init(&static_thread,                          //线程handle
                   "thread2",                                     //线程名称
                   static_entry,                            //线程入口函数
                   RT_NULL,                                     //线程入口参数
                   &thread2_stack[0],               //线程栈地址
                   sizeof(thread2_stack),           //线程栈大小
                   15,                                              //线程优先级
                   10);                                             //线程时间片
    rt_thread_startup(&static_thread);                  //线程进入就绪态

    return RT_EOK;
}

MSH_CMD_EXPORT(MailBox_demo, MailBox_demo);