RT-Thread物联网操作系统介绍:12、事件标志组

程序运行,创建一个事件标志组,一个按键发送事件任务,一个接收事件任务,按键每按下KEY1或KEY2,
发送一个事件,接收任务全部接收到KEY1和KEY2发送的事件才会唤醒,事件发送、接收都会通过USB串口打印信息,串口波特率115200
工程参考例程在:
RT-Thread物联网操作系统介绍

#define BIT_0  (0x01 << 0)//设置事件掩码的位0
#define BIT_1  (0x01 << 1)//设置事件掩码的位1
/* 创建一个事件 */
	Sample_event = rt_event_create("Sample_event",/* 事件标志组名字 */
                                   RT_IPC_FLAG_PRIO);      /* 事件模式 FIFO(0x00)*/  
    if (Sample_event != RT_NULL)
        rt_kprintf("事件创建成功!\n\n");
/* 等待接收事件标志 */
rt_event_recv(Sample_event,                         /* 事件对象句柄 */
			 BIT_0|BIT_1,                           /* 接收线程感兴趣的事件 */
			 RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR, /* 接收选项 */
			 RT_WAITING_FOREVER,                    /* 指定超时事件,一直等 */
			 &Recv_EVENT);                          /* 指向接收到的事件 */
if(Recv_EVENT == (BIT_0|BIT_1)) /* 如果接收完成并且正确 */
{
    	rt_kprintf ( "Key1与Key2都按下\n");		
}
else
	rt_kprintf ( "事件错误!\n");
#include "MyIncludes.h"

#define BIT_0  (0x01 << 0)//设置事件掩码的位0
#define BIT_1  (0x01 << 1)//设置事件掩码的位1

static rt_event_t Sample_event = RT_NULL;   /* 事件控制块 */

static rt_thread_t TASK1_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : TASK1_Thread_Process
* Description    : 任务1线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void TASK1_Thread_Process(void* parameter)
{	
   	rt_uint32_t Recv_EVENT;
    /* 任务都是一个无限循环,不能返回 */
    while (1)
    {				
        /* 等待接收事件标志 */
        rt_event_recv(Sample_event,                         /* 事件对象句柄 */
                     BIT_0|BIT_1,                           /* 接收线程感兴趣的事件 */
                     RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR, /* 接收选项 */
                     RT_WAITING_FOREVER,                    /* 指定超时事件,一直等 */
                     &Recv_EVENT);                          /* 指向接收到的事件 */
        if(Recv_EVENT == (BIT_0|BIT_1)) /* 如果接收完成并且正确 */
        {
            rt_kprintf ( "Key1与Key2都按下\n");		
        }
        else
            rt_kprintf ( "事件错误!\n");		
    }
}

static rt_thread_t TASK2_Thread = RT_NULL;
/*******************************************************************************
* Function Name  : TASK2_Thread_Process
* Description    : 任务2线程函数
* Input          : None
* Output         : None
* Return         : None
* Note			 : None
*******************************************************************************/
static void TASK2_Thread_Process(void* parameter)
{	
    while (1)
    {
        Key_Read();    //扫描按键
		
		if(Key_Info.Num_Last != Key_Info.Num)  //按键值发生变化
		{
	        Key_Info.Num_Last = Key_Info.Num;
			
			if(Key_Info.Num != 0)
			{
				switch(Key_Info.Num)
				{
					case KEY_ONE:       
						 rt_kprintf ( "KEY1被单击\n" );
                         /* 发送一个事件1 */
                         rt_event_send(Sample_event,BIT_0);  
						 break;
					case KEY_TWO:   
                         rt_kprintf ( "KEY2被单击\n" );	
                         /* 发送一个事件2 */
                         rt_event_send(Sample_event,BIT_1);   
						 break;
					default: break;
				}
			}
		}
        
        rt_thread_delay(10);                  /* 延时10毫秒 */
    }
}

int main(void)
{
 /* 创建一个事件 */
	Sample_event = rt_event_create("Sample_event",/* 事件标志组名字 */
                                   RT_IPC_FLAG_PRIO);      /* 事件模式 FIFO(0x00)*/  
    if (Sample_event != RT_NULL)
        rt_kprintf("事件创建成功!\n\n");
    
    //LED线程
	TASK1_Thread =                        /* 线程控制块指针 */
	rt_thread_create("TASK1",             /* 线程名字 */
                    TASK1_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    15,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (TASK1_Thread != RT_NULL)
        rt_thread_startup(TASK1_Thread);
    else		
        return -1;
    
    //按键发送线程
    TASK2_Thread =                        /* 线程控制块指针 */
	rt_thread_create("TASK2",             /* 线程名字 */
                    TASK2_Thread_Process, /* 线程入口函数 */
                    RT_NULL,             /* 线程入口函数参数 */
                    512,                 /* 线程栈大小 */
                    12,                   /* 线程的优先级 */
                    20);                 /* 线程时间片 */
								 
	/* 启动线程,开启调度 */
    if (TASK2_Thread != RT_NULL)
        rt_thread_startup(TASK2_Thread);
    else		
        return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值