# event **Repository Path**: Lin_g/event ## Basic Information - **Project Name**: event - **Description**: 事件广播机制 支持同步触发和异步触发 支持消息参数 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 4 - **Created**: 2021-11-24 - **Last Updated**: 2024-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **event** ## **简介** 对于模块化编程来说,如何实现各模块间的解耦一直是一个比较令人头疼的问题,特别是对于嵌入式编程,由于控制逻辑复杂,并且对程序体积有控制,经常容易写出各独立模块之间相互调用的问题。 因此通过 event 组件的广播事件机制, 提供了一种模块间解耦的实现方法。 ## 原理 当程序运行至相应的位置时,可以通过 event 接口抛出一个事件(当前模块不需要关心在这个地方需要执行哪些其他模块的逻辑) 由其他模块通过注册的方式,监听这个事件,当事件发生时,调用注册的函数(同步或异步),能很大程度上实现模块间的解耦 由于使用注册的方式监听事件,会依赖于编译环境,目前仅支持keil(51内核不支持) ## API 导出事件(订阅事件) **EVENT_EXPORT_VERY_HIGH(_func, _funcType, _event)** **EVENT_EXPORT_HIGH(_func, _funcType, _event)** **EVENT_EXPORT_MID(_func, _funcType, _event)** **EVENT_EXPORT_LOW(_func, _funcType, _event)** * 参数 _func : 回调函数 _funcType: 回调类型 (同步: EVENT_FUNC_SYNC) (异步: EVENT_FUNC_ASYNC) _event : 监听的事件 产生事件(发送事件) **void event_invoke(const unsigned short _event, void** **_message)** - 参数 _event : 事件 _message : 事件消息 异步执行事件回调函数(放在主循环里调用)(订阅的是异步方式的话, 回调函数在这里执行) void event_loop_async(void) ## 例程 ```c #include "event.h" /* 定义事件 */ enum { EVENT_TEST1, EVENT_TEST2, EVENT_TEST3, EVENT_TEST4, } int main(void) { while (1) { event_loop_async(); } } /* 其他模块发送事件 */ void xxx(void) { /* 产生事件(发送事件) */ event_invoke(EVENT_TEST1, NULL); event_invoke(EVENT_TEST2, NULL); event_invoke(EVENT_TEST3, NULL); } void test1(void *_message) { /* 用户代码 */ } EVENT_EXPORT_HIGH(test1, EVENT_FUNC_SYNC, EVENT_TEST1); /* 同步方式, 回调将在事件发送时执行 */ void test2(void *_message) { /* 用户代码 */ } EVENT_EXPORT_MEDIUM(test2, EVENT_FUNC_SYNC, EVENT_TEST2); /* 异步方式, 回调将在事件发送后, 在主函数执行 */ void test3(void *_message) { /* 用户代码 */ } EVENT_EXPORT_LOW(test3, EVENT_FUNC_ASYNC, EVENT_TEST3); /* 同步方式, 回调将在事件发送时执行 */ ```