zoukankan      html  css  js  c++  java
  • [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



  • 相关阅读:
    selenium获取Cookie操作
    分布式锁-常用技术方案
    合成模式(Composite)-结构型
    享元模式-结构型
    桥接模式-结构型
    适配器模式-结构型
    建造者模式-创建型
    单例和原型模式-创建型
    外观(门面)模式-结构型
    JDK QUEUE队列
  • 原文地址:https://www.cnblogs.com/lyyyuna/p/4123932.html
Copyright © 2011-2022 走看看