# event **Repository Path**: showmsg/event ## Basic Information - **Project Name**: event - **Description**: 事件广播机制 支持同步触发和异步触发 支持消息参数 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2022-11-17 - **Last Updated**: 2022-11-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **event** ## **简介** 对于模块化编程来说,如何实现各模块间的解耦一直是一个比较令人头疼的问题,特别是对于嵌入式编程,由于控制逻辑复杂,并且对程序体积有控制,经常容易写出各独立模块之间相互调用的问题。 因此通过 event 组件的广播事件机制, 提供了一种模块间解耦的实现方法。 ## 原理 当程序运行至相应的位置时,可以通过 event 接口抛出一个事件(当前模块不需要关心在这个地方需要执行哪些其他模块的逻辑) 由其他模块通过注册的方式,监听这个事件,当事件发生时,调用注册的函数(同步或异步),能很大程度上实现模块间的解耦 由于使用注册的方式监听事件,会依赖于编译环境,目前仅支持keil(51内核不支持) 如果芯片是51内核时, 请切换到分支: 51-kernel ## API 导出事件(高优先级) (中优先级) (低优先级) #define EVENT_EXPORT_HIGH(_func, _event, _asynch) #define EVENT_EXPORT_MEDIUM(_func, _event, _asynch) #define EVENT_EXPORT_LOW(_func, _event, _asynch) * 参数 _func 回调函数 _event 监听的事件 _asynch 同步(`EVENT_SYNCH`) 或 异步(`EVENT_ASYNCH`) 广播事件(发送事件) void Event_Broadcast(unsigned short _event, void *_message); - 参数 _event: 事件 _message: 事件消息 异步执行事件回调函数(主函数调用) 当注册的是异步执行时, 事件发生后, 在此函数内执行回调函数 void Event_AsynchCallback(void) ## 使用 1. 注册 event 监听事件(在c文件中, 调用以下宏来导出监听事件) EVENT_EXPORT_HIGH(_func, _event, _asynch) EVENT_EXPORT_MEDIUM(_func, _event, _asynch) EVENT_EXPORT_LOW(_func, _event, _asynch) 2. 广播 event 事件(注册的是同步方式, 在这里执行回调函数) Event_Broadcast(unsigned short _event, void *_message); 3. 异步执行回调函数(注册的是异步方式, 在这里执行回调函数) Event_AsynchCallback(void); ## 例程 ```c #include "event.h" int main(void) { while (1) { Event_AsynchCallback(); } } /* 其他模块发送事件 */ void xxx() { /* 广播事件(发送事件) */ Event_Broadcast(1, NULL); Event_Broadcast(2, NULL); Event_Broadcast(3, NULL); } void test1(void *_message) { /* 用户代码 */ } EVENT_EXPORT_HIGH(test1, 1, EVENT_SYNCH); /* 同步方式, 回调将在事件发送时执行 */ void test2(void *_message) { /* 用户代码 */ } EVENT_EXPORT_MEDIUM(test2, 2, EVENT_ASYNCH); /* 异步方式, 回调将在事件发送后, 在主函数执行 */ void test3(void *_message) { /* 用户代码 */ } EVENT_EXPORT_LOW(test3, 3, EVENT_SYNCH); /* 同步方式, 回调将在事件发送时执行 */ ```