鱼C论坛

 找回密码
 立即注册
查看: 3068|回复: 1

[技术交流] 为C语言增加一个订阅发布模型

[复制链接]
发表于 2019-10-4 13:16:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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多行,内部使用了一些自定义库中的资源,链表(无头双向循环通用链表)。

仅供学习,不供商用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-4 13:19:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表