|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在语言开发中,经常听到一个词,耦合。耦合度的大小是一个代码评分的重要系数。低耦合度作品,能给代码的维护、更新带上一个新高度。
近期受微服务器的一些概念影响,想出为我们的嵌入式系统中增加一个发布/订阅模型。为一个工程内部建立起一个应用数据总线,降低各应用之间的直接调用关系。降低系统代码的耦合度。
多的不讲,直接上码。
typedef enum{
}Topic_e; //订阅主题,依据实际需求定义自己所需要的主题名。
主题信息接收,函数指针
typedef int (*pushFun)(void *msg); //消息推送返回值: 0:继续订阅, 非0:取消订阅(内部自动删除)
void Topic_init(void);
//主题推送接口: topic: 主题名, msg: 数据指针。
注:此数据接收者,只做读取,若数据需要保存取用,需自行考备。消息推送者在信息推送完毕后由推送端负责销毁或其他处理方式。
void Pushlisher(Topic_e topic, void *msg);
//主题订阅。 topic: 目标订阅主题名,subscribers:主题数据接收接口。
int Subscriber(Topic_e topic, pushFun subscribers); // 0:订阅成功,-1 订阅主题添加失败,-2 订阅节点添加失败
应用:
如一个系统中有一个LED,应用A、B、都需要知道LED的状态。
先定义主题:T_LED,
A、B应用初始化时:都添加主题订阅。
static int A_LEDStatus(u8_t *val){
printf("A app receive LED status: %d\r\n", *val);
return 0;
}
void A_init(void){
Subscriber(T_LED, (pushFun ) A_LEDStatus);
}
static int B_LEDStatus(u8_t *val){
printf("B app receive LED status: %d\r\n", *val);
return 1; //只订阅一次
}
void B_init(void){
Subscriber(T_LED, (pushFun ) B_LEDStatus);
}
void LED_status(void){
u8_t val = 1;
Pushlisher(T_LED, &val);
val = 99;
Pushlisher(T_LED, &val);
}
如此即会打印:
A app receive LED status: 1
B app receive LED status: 1
A app receive LED status: 99
A 应用与B应用中没有直接包含调用及查询LED状态,同时LED模块也没有直接调用A、B应用的相关接口,各应用之间通过:发布/订阅模型建立联系与驱动。有效降低各应用模块之前耦合关系。当整个系统中没有LED主题源或其他应用,都互不影响,各自在系统依旧正常运行。
说了这个么,如果不共享一下原码,大家肯定内心是想打人的啦。
原码共享在码云:https://gitee.com/unarty/topic.git,大家一起学习进步。有问题可回贴交流。
注:编码解决思路很重要,功能实现很简单。累计代码量100多行,内部使用了一些自定义库中的资源,链表(无头双向循环通用链表)。
仅供学习,不供商用。
|
|