1.示例代码
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-02-07 冷月枫 the first version
*/
/* 初始化2个静态线程,一个静态的邮箱对象,其中一个线程往邮箱中发送邮件,一个线程往邮箱中收取邮件 */
#include <rtthread.h>
#define THREAD_PRIORITY 10
#define THREAD_TIMESLICE 5
/* 邮箱控制块 */
static struct rt_mailbox mb;
/* 用于放邮件的内存池 */
static char mb_pool[128]; // 128/4 = 32个邮件
static char mb_str1[] = "I am luatao!";
static char mb_str2[] = "this a another mail!";
static char mb_str3[] = "over!!!";
ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程1入口函数 */
static void thread1_entry(void* parameter)
{
char *str;
while(1)
{
rt_kprintf("thread1 try to recv a mail !\n");
/* 从邮箱中收取邮件 */
if(rt_mb_recv(&mb, (rt_uint32_t*)&str, RT_WAITING_FOREVER) == RT_EOK)
{
rt_kprintf("thread1 get a mail from mailbox,the content is %s\n",str);
if(str == mb_str3)
break; // 结束标志
rt_thread_mdelay(100);
}
}
/* 执行邮箱对象脱离 */
rt_mb_detach(&mb);
}
/* 线程2 入口函数 */
static void thread2_entry(void* parameter)
{
rt_uint8_t count;
count = 0;
while(count < 10)
{
count ++;
if(count & 0x1)
{
/* 发送mb_str1 地址到邮箱中 */
rt_mb_send(&mb,(rt_uint32_t)&mb_str1);
}else {
/* 发送 mb_str2 地址到邮箱中 */
rt_mb_send(&mb, (rt_uint32_t)&mb_str2);
}
rt_thread_mdelay(200);
}
/* 发送邮件告诉线程1, 线程2运行结束*/
rt_mb_send(&mb, (rt_uint32_t)&mb_str3);
}
/* 邮箱初始化 */
int mailbox_sample(void)
{
rt_err_t re;
/* 初始化一个mailbox */
re = rt_mb_init(&mb, // 邮箱控制块
"mb1", // 邮箱名
&mb_pool[0], // 邮箱的内存池
sizeof(mb_pool) / 4, // 邮箱中可存的邮件的数目
RT_IPC_FLAG_FIFO); // 操作 先进先出
if(re != RT_EOK)
{
rt_kprintf("init mailbox failed!\n");
return -1;
}
// 线程1
rt_thread_init(&thread1,
"thread1",
thread1_entry,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
THREAD_PRIORITY,
THREAD_TIMESLICE);
rt_thread_startup(&thread1);
// 线程2
rt_thread_init(&thread2,
"thread2",
thread2_entry,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY,
THREAD_TIMESLICE);
rt_thread_startup(&thread2);
return 0;
}
MSH_CMD_EXPORT(mailbox_sample, mailbox sample);
2.测试结果
详细文档
链接