关于单片机:事件驱动框架

2次阅读

共计 2324 个字符,预计需要花费 6 分钟才能阅读完成。

事件服务文档

事件服务器是一种异步事件处理机制, 它通过事件散发和回调的形式, 能够无效地进步零碎的异步解决能力、解耦性和可扩展性。

事件服务器蕴含两个次要组件: 事件服务器和事件客户端。

  • 事件服务器用于接管和散发事件, 它外部保护一个事件队列用于存储待处理事件和一个事件列表用于存储注册的事件客户端。
  • 事件客户端用于解决特定类型的事件, 它须要注册到事件服务器并提供一个回调函数。

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

事件服务原型

/* 事件服务器 */
struct event_server
{
    struct event_fifo queue;                                        /* 事件队列 */
    event_avl_t list;                                               /* 事件链表 */
};
  • 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 开源许可协定,可收费利用于商业产品,无需公开公有代码。

正文完
 0