线程间通信之邮箱

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.测试结果

在这里插入图片描述

详细文档
链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值