RTT-事件

RTT-事件

概念

事件和信号量类似,也是进程间的标志位
这是一个32位的标志位,每个bit位都可以用作一个标志

接口

创建静态事件

rt_err_t rt_event_init (rt_event_t event, const char *name, rt_uint8_t flag)

删除静态事件

rt_err_t rt_event_detach (rt_event_t event)

创建动态事件

rt_event_t rt_event_create (const char *name, rt_uint8_t flag)

删除动态事件

rt_err_t rt_event_delete (rt_event_t event)

发送事件

rt_err_t rt_event_send (rt_event_t event, rt_uint32_t set)

接收事件

rt_err_t rt_event_recv (rt_event_t event, rt_uint32_t set, rt_uint8_t option, rt_int32_t timeout, rt_uint32_t *recved)

用法

  1. 定义事件控制块
  2. 创建事件对象
  3. 发送事件
  4. 接收事件
/* 定义线程控制块指针 */
static rt_thread_t key0_thread = RT_NULL;
static rt_thread_t handler_thread = RT_NULL;
/* 定义事件控制块 */
static rt_event_t test_event = RT_NULL;
/* 定义事件标志位 */
#define KEY1_EVENT  (0x01 << 0)//设置事件掩码的位0
#define KEY2_EVENT  (0x01 << 1)//设置事件掩码的位1

/* 按键发送事件 */
test_event = rt_event_create("test_event",/* 事件标志组名字 */
                                 RT_IPC_FLAG_PRIO); /* 事件模式 FIFO(0x00)*/
if (test_event != RT_NULL)
	rt_kprintf("creat event success\r\n");

/* 创建事件对象 */
static void key0_thread_entry(void *parameter)
{
    while (1)
    {
        if (Key_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)       //如果KEY2被单击
        {
            rt_kprintf("KEY1 pressed\n");
            /* 发送一个事件1 */
            rt_event_send(test_event, KEY1_EVENT);
        }

        if (Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)       //如果KEY2被单击
        {
            rt_kprintf("KEY2 pressed\n");
            /* 发送一个事件2 */
            rt_event_send(test_event, KEY2_EVENT);
        }
        rt_thread_delay(20);     //每20ms扫描一次
    }

}

/* 接收处理事件 */
static void handler_thread_entry(void *parameter)
{
    rt_uint32_t recved;

    while (1)
    {
        /* 等待接收事件标志 */
        rt_event_recv(test_event,  /* 事件对象句柄 */
                      KEY1_EVENT | KEY2_EVENT, /* 接收线程感兴趣的事件 */
                      RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, /* 接收选项 */
                      RT_WAITING_FOREVER,/* 指定超时事件,一直等 */
                      &recved);    /* 指向接收到的事件 */
        if (recved == (KEY1_EVENT | KEY2_EVENT)) /* 如果接收完成并且正确 */
        {
            rt_kprintf("Key1 and Key2\n");
        }
        else
            rt_kprintf("failed\n");

    }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangYi0_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值