请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 328|回复: 0
收起左侧

邮箱例程

[复制链接]

16

主题

60

帖子

107

积分

初级会员

积分
107
QQ
发表于 2018-7-10 23:00:25 | 显示全部楼层 |阅读模式
/*
* 程序清单:邮箱例程
*
* 这个程序会创建2个动态线程,一个静态的邮箱对象,其中一个线程往邮箱中发送邮件,
* 一个线程往邮箱中收取邮件。
*/
#include <rtthread.h>
// #include "tc comm.h"
#define THREAD_STACK_SIZE 512
#define THREAD_PRIORITY  20
#define THREAD_TIMESLICE  20


/* 指向线程控制块的指针 */
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;


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


static char mb_str1[] = "I'm a mail!";
static char mb_str2[] = "this is another mail!";


/* 线程1入口 */
static void thread1_entry( void* parameter )
{
  unsigned 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:%s\n", str );


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


/* 线程2入口 */
static void thread2_entry( void* parameter )
{
  rt_uint8_t count;


  count = 0;
  while ( 1 )
  {
    count ++;
    if ( count & 0x1 )
    {
      /* 发送mb str1地址到邮箱中 */
                            rt_kprintf( "thread2: 发送mb str1地址到邮箱中\n" );
      rt_mb_send( &mb, ( rt_uint32_t )&mb_str1[0] );
    }
    else
    {
      /* 发送mb str2地址到邮箱中 */
                            rt_kprintf( "thread2: 发送mb str2地址到邮箱中\n" );
      rt_mb_send( &mb, ( rt_uint32_t )&mb_str2[0] );
    }




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


int mbox_simple_init()
{
  /* 初始化一个mailbox */
  rt_mb_init( &mb,
              "mbt", /* 名称是mbt */
              &mb_pool[0], /* 邮箱用到的内存池是mb pool */
              sizeof( mb_pool ) / 4, /* 大小是mb pool大小除以4,因为一封邮件的大小是4字节 */
              RT_IPC_FLAG_FIFO ); /* 采用FIFO方式进行线程等待 */


  /* 创建线程1 */
  tid1 = rt_thread_create( "t1",
                           thread1_entry, RT_NULL, /* 线程入口是thread1 entry, 入口参数是RT NULL */
                           THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE );
  if ( tid1 != RT_NULL )
    rt_thread_startup( tid1 );




  /* 创建线程2 */
  tid2 = rt_thread_create( "t2",
                           thread2_entry, RT_NULL, /* 线程入口是thread2 entry, 入口参数是RT NULL */
                           THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE );
  if ( tid2 != RT_NULL )
    rt_thread_startup( tid2 );


  return 0;
}


#ifdef RT_USING_TC
static void tc_cleanup()
{
  /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
  rt_enter_critical();


  /* 删除线程 */
  if ( tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE )
    rt_thread_delete( tid1 );
  if ( tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE )
    rt_thread_delete( tid2 );


  /* 执行邮箱对象脱离 */
  rt_mb_detach( &mb );


  /* 调度器解锁 */
  rt_exit_critical();




  /* 设置TestCase状态 */
  tc_done( TC_STAT_PASSED );
}


int tc_mbox_simple()
{
  /* 设置TestCase清理回调函数 */
  tc_cleanup( tc_cleanup );
  mbox_simple_init();


  /* 返回TestCase运行的最长时间 */
  return 100;
}
/* 输出函数命令到finsh shell中 */
FINSH_FUNCTION_EXPORT( tc_mbox_simple, a_simple_mailbox_example );
#else
/* 用户应用入口 */
int rt_application_init()
{
  mbox_simple_init();


  return 0;
}
#endif






承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ/微信/手机   13554527850
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-2-19 13:09 , Processed in 0.162433 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表