如何理解事件?

原创
03/10 14:51
阅读数 474

如何理解事件?

EventOS Nano项目地址,在Gitee EventOS Nano处。

事件机制,是EventOS的核心内容,是整个EventOS大厦的基础。那么,有必要了解一下什么是事件,才能正确的使用事件,编写合格的事件驱动的程序。很多嵌入式的小伙伴们,对事件机制一头雾水。但了解过事件机制的人,却对其非常推崇,因为借助于事件,我们可以写出极高性能和可靠性的程序。

个人认为,在嵌入式系统中,一切在发生或者已发生的事情,只要导致了内部数据的变化,都可以被认为是事件。事件,说到底,是对系统中所发生的事,进行的高级抽象。代码,是对物理世界的抽象;事件,是对物理世界所发生的事的抽象。比如,按键的按下或者抬起,串口接收到一组数据,CAN总线接收到一个报文,某个通信协议连接失败,定时500ms时间到,电池电量低于某个阈值,温度传感器高于某个阈值,避障传感器检测到障碍物,等等等等,所有这些,都可以认为是事件。

EventOS中,一个事件由几个元素构成:事件主题、数据长度和事件携带的数据。我们在EventOS Nano中,对事件所抽象的数据结构如下所示。

typedef struct eos_event {
    eos_topic_t     topic;
    void *          data;
    eos_u16_t       size;
} eos_event_t;

这和我们日常生活的体验,是一致的。比如,娱乐圈里发生了一个大新闻,某台湾女星,又结婚了。你会怎么向同事们描述这件事?“嘿!知道吗?最近发生一个大新闻(事件主题),大爱思又结婚了,跟一个韩国大叔!(事件携带的数据)”翻译成代码,就是下面这样的:

// 大爱思又结婚了
const char *news = "S has been married again with one Bangzi!"
eos_event_pub(Event_BigNews, (void *)news, strlen(news));

或者,也可以这么说:“嘿!知道吗?最近大爱思又结婚了(事件主题),跟一个韩国大叔!(事件携带的数据)”翻译成代码,就是下面这样的:

// 大爱思又结婚了
const char *news = "With one Bangzi called JuJunye!"
eos_event_pub(Event_S_Married, (void *)news, strlen(news));

(感谢他们夫妻二位提供素材!祝新婚快乐!)

事件无时无刻不在发生,但我们只关注和处理那些有用的事件。那么什么是有用的事件呢?比如某个机器人的电池电压,在使用中,一直在缓慢降低,时时刻刻都会产生事件,但我们仅仅关注两种事件即可,一个每隔10S(举例而已)的电压值,用于计算电池电量,另外一个是电池电量低于某个阈值(用于提醒机器人去充电)。

针对这样的数据结构,我们列举了几个事件组成。

事件源 主题 长度 数据
按键按下或抬起 Event_Button 1 状态值
串口接收数据 Event_UartRecieve N 数据
设备急停 Event_EmgStop 0
电池电量低 Event_LowPower 2 2750mv

根据EventOS Nano的API,在发送事件时的代码如下所示。

// 按下按下或者抬起
bool status_button = true;
eos_event_pub(Event_Button, (void *)&status_button, sizeof(bool));
// 串口接收数据
eos_u32_t uart_count_recv = 128;
eos_event_pub(Event_UartRecieve, (void *)buffer_uart_recieve, uart_count_recv);
// 设备急停
eos_event_pub_topic(Event_EmgStop);
// 电池电量低
eos_u16_t battery_voltage = 2750;               // mv
eos_event_pub(Event_LowPower, (void *)&battery_voltage, sizeof(eos_u16_t));

这样就很容易把事件及其携带的数据发送了出去。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部