事件驱动框架

事件驱动框架文档

事件驱动框架是一种异步事件处理机制,它通过事件分发和回调的方式,可以有效地提高系统的异步处理能力、解耦性和可扩展性。

事件驱动框架包含两个主要组件:事件服务器和事件客户端。

  • 事件服务器用于接收和分发事件,它内部维护一个事件队列用于存储待处理事件和一个事件列表用于存储注册的事件客户端。
  • 事件客户端用于处理特定类型的事件,它需要注册到事件服务器并提供一个回调函数。

当事件发生时,事件服务器会将事件插入到其事件队列中进行缓存。事件服务器会周期性地从事件队列中取出事件进行分发,找到对应的事件客户端,然后调用其注册的回调函数进行事件处理。

事件驱动框架原型

/* 事件服务器 */
struct event_server
{
    struct event_fifo queue;                                        /* 事件队列 */
    event_avl_t list;                                               /* 事件链表 */
};
  • object:对象(用于将事件服务器添加到容器中)。
  • queue:事件队列(用于存储要唤醒的客户端ID)。
  • list:服务器链表(用于存储客户端)。
/* 事件客户端 */
struct event_client
{
    struct event_avl list;                                          /* 事件链表 */
    
    mr_err_t (*cb)(event_server_t server, void *args);              /* 事件回调函数 */
    void *args;                                                     /* 事件回调函数参数 */
};
  • list:客户端链表(用于将客户端添加到服务器的客户端列表中)。
  • cb:回调函数。
  • args:回调函数参数。

初始化服务器

int event_server_init(mr_event_server_t server,mr_size_t queue_length);
参数描述
server服务器句柄
queue_length服务器队列长度(同时处理事件的个数)
返回
EVENT_ERR_OK添加成功
错误码添加失败

重置服务器

int event_server_uninit(event_server_t server);
参数描述
server服务器句柄
返回
EVENT_ERR_OK移除成功
错误码移除失败

通知服务器,事件发生

int event_server_notify(event_server_t server, uint8_t id);
参数描述
server服务器句柄
id发生事件的客户端id
返回
EVENT_ERR_OK通知成功
错误码通知失败

服务器分发事件,唤醒客户端

void event_server_handle(event_server_t server);
参数描述
server服务器句柄

查找客户端

event_client_t event_client_find(uint8_t id, event_server_t server);
参数描述
id客户端id
server服务器句柄
返回
客户端句柄查找成功
NULL查找失败

创建新客户端

int event_client_create(uint8_t id,
                        int (*cb)(event_server_t server, void *args),
                        void *args,
                        event_server_t server);
参数描述
id客户端id
cb回调函数
args回调函数参数
server服务器句柄
返回
EVENT_ERR_OK创建成功
错误码创建失败

删除客户端

int client_delete(uint8_t id, event_server_t server);
参数描述
id客户端id
server服务器句柄
返回
EVENT_ERR_OK删除成功
错误码删除失败

使用示例:

/* 定义事件 */
#define EVENT1                          1
#define EVENT2                          2
#define EVENT3                          3

/* 定义事件服务器 */
struct event_server event_server;

int event1_cb(event_server_t server, void *args)
{
    printf("event1_cb\r\n");
    
    /* 通知事件服务器事件2发生 */
    event_server_notify(server, EVENT2);
    
    return 0;
}

int event2_cb(event_server_t server, void *args)
{
    printf("event2_cb\r\n");
    
    /* 通知事件服务器事件3发生 */
    event_server_notify(server, EVENT3);
    
    return 0;
}

int event3_cb(event_server_t server, void *args)
{
    printf("event3_cb\r\n");
    
    return 0;
}

int main(void)
{
    /* 添加事件服务器到内核容器 */
    event_server_init(&event_server, 4);
    
    /* 创建事件客户端到事件服务器 */
    event_client_create(EVENT1, event1_cb, NULL, &event_server);
    event_client_create(EVENT2, event2_cb, NULL, &event_server);
    event_client_create(EVENT3, event3_cb, NULL, &event_server);
    
    /* 通知事件服务器事件1发生 */
    event_server_notify(&event_server, EVENT1);
    
    while (1)
    {
        event_server_handle(&event_server); 
    }
}

现象:

event1_cb
event2_cb
event3_cb

下载代码(路径:mr-library/ package / event)


许可协议

遵循 Apache License 2.0 开源许可协议,可免费应用于商业产品,无需公开私有代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个嵌入式事件驱动框架一般会包含以下几个关键组件: 1. 事件处理器(Event Handler):这是一个用于处理事件的函数或方法。当一个事件被触发时,相应的事件处理器会被调用。 2. 事件队列(Event Queue):这是一个存储事件的队列,所有即将发生的事件都会被加入到队列中。当事件被触发时,事件处理器会从队列中取出相应的事件并进行处理。 3. 事件触发器(Event Trigger):这是一个用于触发事件的函数或方法。当某个条件满足时,相应的事件触发器会被调用,从而触发相应的事件并加入到事件队列中。 4. 事件循环(Event Loop):这是一个无限循环的过程,它不断地从事件队列中取出事件,并将其交给相应的事件处理器进行处理。当事件队列为空时,事件循环会进入休眠状态,等待新的事件被加入到队列中。 基于以上组件,我们可以设计一个简单的嵌入式事件驱动框架的流程如下: 1. 在初始化过程中,创建一个事件队列,以及一个或多个事件触发器。 2. 进入事件循环。在循环中,不断地从事件队列中取出事件。 3. 对于每个事件,将其交给相应的事件处理器进行处理。 4. 在事件处理器中,根据事件类型进行相应的操作。如果需要触发新的事件,可以通过事件触发器来实现。 5. 当所有事件都处理完毕后,进入休眠状态,等待新的事件被加入到队列中。 需要注意的是,在嵌入式系统中,事件处理器的执行时间必须尽可能短,以避免阻塞其他任务的执行。因此,可以考虑采用一些轻量级的事件处理器,例如状态机、定时器等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值