[RTT例程练习] 2.7 邮箱 mailbox

邮箱是操作系统中,一个进程给另一个进程发送消息的方式。在裸奔的单片机中,在两个函数中交换信息的时候,我们通常选择最简便的方式-全局变量,这种编程模式无疑是降低了安全性和可靠性。再且,邮箱还能起到挂起线程的作用。

本实验中创建一个邮箱,两个线程,线程2以一定周期发送邮箱,线程1以一定周期从邮箱中取出邮件。当线程2中发送20封邮件之后,发送一封特殊的邮件通知其他线程,自己已经运行结束。线程1取出邮件后,检查邮件是否是特殊邮件,如果是,则线程1也退出。

程序:

#include <rtthread.h>

void rt_init_thread_entry(void *parameter)
{

}

static struct rt_mailbox mb;

static rt_uint8_t mb_pool[128];

static rt_uint8_t mb_str1[] = "I'm a mail!";
static rt_uint8_t mb_str2[] = "This is another mail!";
static rt_uint8_t mb_str3[] = "Over!";

static rt_uint8_t thread1_stack[1024];
struct rt_thread thread1;
static void thread1_entry(void *parameter)
{
    char *str;
    
    while (1)
    {
        rt_kprintf("thread1: try to receive a mail.\n");
        
        /* receive a mail from the mailbox. */
        if (rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
        {
            rt_kprintf("thread1: get a mail from mailbox.\n");
            if (str == mb_str3)
                break;
                
            rt_thread_delay(10);
        }
    }
    
    rt_mb_detach(&mb);
}

static rt_uint8_t thread2_stack[1024];
struct rt_thread thread2;
static void thread2_entry(void *parameter)
{
    rt_uint8_t count;
    
    count = 0;
    while (count < 10)
    {
        count++;
        if (count & 0x01)
        {
            rt_mb_send(&mb, (rt_uint32_t)&mb_str1[0]);
        }
        else
        {
            rt_mb_send(&mb, (rt_uint32_t)&mb_str2[0]);
        }
        
        rt_thread_delay(20);
    }
    
    rt_mb_send(&mb, (rt_uint32_t)&mb_str3[0]);
}

int rt_application_init()
{
    rt_thread_t init_thread;
    rt_err_t result;
    
    result = rt_mb_init(&mb,
        "mbt",
        &mb_pool[0], sizeof(mb_pool)/4,
        RT_IPC_FLAG_FIFO);
    if (result != RT_EOK)
    {
        rt_kprintf("init mailbox failed.\n");
        return -1;
    }
    
    init_thread = rt_thread_create("init",
        rt_init_thread_entry, RT_NULL,
        2048,
        8, 20);
    if (init_thread != RT_NULL)
        rt_thread_startup(init_thread);
        
    rt_thread_init(&thread1,
                   "thread1",
                   thread1_entry,
                   RT_NULL,
                   &thread1_stack[0],
                   sizeof(thread1_stack),10,5);
    rt_thread_startup(&thread1);


    rt_thread_init(&thread2,
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),10,5);
    rt_thread_startup(&thread2);
    
    return 0;
}

结果

thread1: try to recv a mail
thread1: get a mail from mailbox, the content:I'm a mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:this is another mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:I'm a mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:this is another mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:I'm a mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:this is another mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:I'm a mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:this is another mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:I'm a mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:this is another mail!
thread1: try to recv a mail
thread1: get a mail from mailbox, the content:over



原文地址:https://www.cnblogs.com/lyyyuna/p/4123932.html