前言
对于模块化编程来说,如何实现各模块间的解耦一直是一个比较令人头疼的问题,特别是对于嵌入式编程,由于控制逻辑复杂,并且对程序体积有控制,经常容易写出各独立模块之间相互调用的问题。由此,cpost中的cevent组件
,通过模仿Android系统中的广播机制,提供了一种非常简单的模块间解耦实现
原理
cevent
借鉴的是Android系统的广播机制,一方面,各模块在工作的时候,都会有多个具体的事件点,在高耦合的编程中,可能会在这些地方调用其他模块的功能,比如说,在通信模块接收到指令的时候,需要闪烁一下指示灯
使用cevent
,我们可以在这些地方抛出一个事件,当前模块不需要关心在这各地方需要执行哪些其他模块的逻辑,由其他模块,或者用户定义一个事件监听,当具体的事件发生时,执行相应的动作
使用
cevent
使用注册的方式监听事件,会依赖于编译环境,目前支持keil,iar,和gcc,对于gcc,需要修改链接文件(.ld),在只读数据区添加:
_cevent_start = .;
KEEP (*(cEvent))
_cevent_end = .;
-
初始化cevent
系统初始化时,调用
ceventInit
ceventInit();
-
注册cevent事件监听
在c文件中,调用
CEVENT_EXPORT
导出事件监听CEVENT_EXPORT(0, handler, (void *)param);
-
发送cevent事件
在事件发生的地方,调用
ceventPost
抛出事件