首页 >资讯 > > 正文

嵌入式多态原理详解-当前简讯

来源:CSDN-HiveIOE 2023-06-19 11:02:28

引言


(资料图)

在我们的嵌入式C 开发中经常会面对这样的一类需求:因为对接的设备支持的协议不同,自身的设备需要兼容这些协议,因此需要业务支持不同的协议解析方式。

比如有的协议用 tlv 的数据格式,有的用 xml 的格式,有些又用 json 这样的格式,面对如此多差异化的需求,我们该如何解决呢?

一种常见的做法是将协议解析和逻辑实现做到一起,每种协议对应一套代码,这种实现方式简单,没有什么设计可言,就是撸代码。

但是每当对接一种新的协议就要从头开发,这种重复造轮子的方式非常初级,代码的可扩展性也非常差,有没有一种更高级一点的方法呢?

答案是有的,也就是我们本文要讲的嵌入式多态。

嵌入式多态原理

我们首先审视一下上面的需求,上述需求的特点是协议是有多种的数据承载格式(tlv/json/xml),需要针对不同的协议做解析,但是解析完成后的数据处理,也就是业务逻辑的部分却可以保持不变。

因此我们完全可以使用一种模型将这两者分离开来,将易变的协议解析部分单独作为一个模块,将不易变的业务逻辑作为一个模块。

协议解析模块主要负责生成数据,而业务逻辑模块就主要对数据进行处理,中间链接这两者的模型,我们暂且称之为数据分发模型,负责将协议解析出的数据传给业务逻辑部分。

这样一来协议解析模块就可以在自己内部做任何变化,可以对不同格式的协议进行解析,而这对于业务逻辑来说都是不感知的,代码的扩展性更佳。

要想达到这种良好的可扩展性,我们引入了一个负责数据分发的模型,这个模型要怎么实现呢?

我们看到协议解析其实是有多种实现方式,而业务逻辑可以看作只有一种实现方式,这就是一种多对一的方式。

在数据分发模型中,负责将多种协议解析方式收敛成一种,我们想一下C语言中哪种方式可以实现这种多对一的收敛呢?没错,就是函数指针。

这是指针的一种非常高级的应用,它可以将函数的框架抽象出来,用指针的方式进行定义,我们知道指针可以初始化指向不同的地址,那函数指针就可以被指向多个不同的函数。

当我们调用函数指针时,就可以动态地切换到不同的函数实现上。想一下,虽然协议解析的方式不同,但是最终业务逻辑需要的数据是固定的,因此完全可以将函数的参数搞成一样的结构。

在面向对象的编程语言中,这种实现方式称之为多态,同一个接口(抽象级,没有具体实现)可以支持不同的具体实现。在我们嵌入式C开发中需要自己写这种多态的接口,但是也不难,笔者将一个模板写在了下一节中,读者可以参照这种写法,灵活修改。

嵌入式多态伪代码实现模板

定义数据分发的模型,抽象接口

1)伪代码

/*回调的函数钩子*/typedefint(*hook_func)(void*,int,void*);typedefstruct{/*初始化接口,定义诸如内存之类的问题*/void(*init)(void);/*注册服务对应的处理函数,如协议解析后的业务逻辑处理映射*/int(*register)(inttype,hook_funcfunc);/*将数据分发到对应的服务*/int(*distribute)(void*input,intlen,void*ret);}demo_param_s;

2)代码解析

在这个结构体中,我们定义了三个函数指针,分别是:

初始化接口,用来初始化内存之类,这个内存可以用来存储我们提供的服务类型和回调函数;

注册服务处理函数,主要用来建立服务类型和回调函数的映射,在我们的案例中主要将协议解析后,需要使用哪种业务逻辑处理,建立这样的一个模型;

数据分发服务,主要将协议解析后的数据作为参数,在服务映射表中找到对应的回调函数,然后进行回调。

如下图所示,可以非常详细的描述这个过程。

数据分发模型的初始化接口

1)伪代码

demo_param_s*g_demo_param=NULL;voiddemo_init(constdemo_param_s*param){g_demo_param=param;return;}

2)代码解析

上面的这部分代码非常简单,首先是定义了一个全局变量,这个全局编码是数据分发模型的类型,用来指向一个数据分发模型的具体实现,初始时,可以让这个全局变量指向空。

接下来,就是定义了一个初始化接口,这个接口是来初始化我们定义的这个全局变量的,你会看到这个全局变量指向了一个输入进来的参数,而这个参数就是数据分发模型中各个函数指针的具体实现函数,你将在下一节中看到。

每个函数指针的具体实现

1)伪代码

voidinit_impl(void);intregister_impl(inttype,hook_funcfunc);intdistribute_impl(void*input,intlen,void*ret);demo_param_sdemo_param={.init=init_impl,.register=register_impl,.distribute=distribute_impl};demo_init(&demo_param);

2)代码解析

这部分的伪代码主要是对3个函数指针实现,并进行初始化。

首先是三个具体的实现函数被声明和定义,第一个初始化函数,就是 malloc 出内存;第二个函数,建立服务和业务处理函数的映射关系;第三个函数,在需要某种服务时,通过查询第二个函数建立的映射表,回调具体的业务;

其次就是定义了一个数据分发模型的局部变量,然后初始化其中的每个函数指针;

最后调用我们在前面定义的数据分发初始化接口,将上面定义的局部变量的值传入,使其可以全局访问,在后面我们就可以直接用全局变量 g_demo_param 加上其中的参数的方式调用每个接口。

通过抽象接口调用注册和分发功能

1)伪代码

//分发for(i=0;i
//注册inttype=0;intlogic_func(void*input,intlen,void*ret);ret=g_demo_param.register(type,logic_func);

2)代码解析

上面就是我们的注册和分发的接口,其中注册的部分是在业务逻辑中实现的,分发的部分代码是在协议解析的部分实现的。

需要特别注意这个实现规则,因为只有这样才能达到业务逻辑和协议解析的分离,协议解析只依赖我们的数据分发模型,业务逻辑也只依赖我们的数据分发模型,这两者之间互不依赖,可以独立的编译或者打包。

首先我们看注册,有类型和具体函数实现,我们可以使用 g_demo_param.register 去创建两者的映射关系,将其保存在内存中。

然后当我们解析完协议,就来到我们的分发部分,当我们的类型在内存映射表中有存储时,就可以使用g_demo_param.distribute 实现分发,调用我们的业务逻辑代码。

小结

随着嵌入式软件变得越来越复杂,架构问题也变得越来越突出,市场上我们最多见的是对互联网这类架构的介绍,鲜有专门针对嵌入式软件的架构分析。本文通过一个案例浅谈了嵌入式多态的实现方式,目的是帮助读者在设计开发相关的场景时能够拿来借鉴,使自己的代码具有更好地扩展性。

审核编辑:汤梓红

上一篇:杭州亚运会观赛购票攻略来了,你最想看哪项?-全球热推荐 下一篇:最后一页
x
推荐阅读

嵌入式多态原理详解-当前简讯

2023-06-19

杭州亚运会观赛购票攻略来了,你最想看哪项?-全球热推荐

2023-06-19

每日快报!他会一直爱我吗拼音_他会一直爱我吗

2023-06-19

枪声频响!美国多地再现“血腥周末” ,数十人伤亡

2023-06-19

世界滚动:g的单位是什么_g的单位

2023-06-19

海口“天空之山”驿站:呈现滨海落日美景|前沿资讯

2023-06-19

观点:肺癌靶向治疗能活多久知乎(肺癌靶向治疗能活多久)

2023-06-19

记者实地打卡!广工2023年本科招生有啥亮点?

2023-06-19

每日一词|养成式智能

2023-06-19

广东、浙江等地提升金融服务实体经济质效 助力高质量发展

2023-06-19

新世纪新冥界_新世纪evangelion

2023-06-18

当前聚焦:今年“夏至连端午”,本世纪仅发生 4 次

2023-06-18

余文乐发型短发_余文乐发型怎么剪

2023-06-18

地质灾害预警!安徽江西等6省部分地区发生地质灾害气象风险较高

2023-06-18

观点:无锡附近大学有哪些大学211是个轻工业现在叫什么

2023-06-18

言论丨莫德里奇:“我总是说你不必看年龄,球员在球...|天天快播

2023-06-18

今日热讯:the zone:坚持才能生存_只有坚持才能保证国家安全决策

2023-06-18

厦门养老待遇申领怎么申请?厦门养老保险待遇申领办理流程如下-精选

2023-06-18

奔驰在学校操场倒车险撞人,当地教育局回应

2023-06-18

【全球独家】“黑龙江好粮油”中国行—走进福建地推活动在榕举行

2023-06-18

这家餐饮店,竟让执法人员感叹“脏到包浆”……

2023-06-18

电脑截屏怎么操作啊_电脑上怎么截屏按什么键

2023-06-18

电厂路、黎明路等多路段从明日起至21日分别停水|独家焦点

2023-06-18

谁还在乎618?-天天快看点

2023-06-18

北京消协发布食品安全问题通报 蜜雪冰城等商家上榜

2023-06-18

热文:纺织服装行业周报:5月新疆棉商业库存同比下降19.2%

2023-06-18

男篮名宿清华大学进修 朱芳雨参加高管教育班 广东老总不断升级

2023-06-18

环球速看:四季旅行|山东临朐:山水间的小城

2023-06-18

【新要闻】初级会计报名费怎么交钱_初级会计报名费怎么交

2023-06-18

“中国市场蕴藏着巨大发展机遇”

2023-06-18

【当前独家】小鹏P5汽车2022款最新款价格 小鹏p5汽车2022款最新款价格及图片

2023-06-18

日文上下结构念什(日文是什么字上下)|全球播资讯

2023-06-18

u盘system volume information删不掉_u盘system volume information|每日快看

2023-06-18

吐鲁番黑羊特点_吐鲁番黑羊

2023-06-18

从特朗普出庭应诉看美国政治乱象|焦点热议

2023-06-18

5种风格+100套穿搭,矮个子今夏这样穿,太美了!

2023-06-18

僵尸入侵突围什么时候出 公测上线时间预告

2023-06-18

偏执男主又超纲了_当前观点

2023-06-18

环球速读:墙面翻新用什么材料省钱(墙面翻新用什么材料)

2023-06-17

《中国商贸物流发展报告(2022年)》:物流运行保持恢复态势

2023-06-17

熊猫外貌描写片段_外貌描写片段100字左右|全球热推荐

2023-06-17

每日时讯!“跨界的边界”在何处?川音跨媒介雕塑邀请展正在讨论这个问题

2023-06-17

环球新消息丨简单易上手的家常菜,好吃美味又下饭,而且还非常卫生

2023-06-17

天天热议:得利斯:目前公司预制菜产能为15万吨 预计2023年底前将达到20万吨

2023-06-17

焦点速递![路演]新农开发:主要出口产品为甘草制品 出口前景良好

2023-06-17

全国首张大数据工程技术人员专业技术等级证书在重庆颁发|天天时讯

2023-06-17

外汇业务账务处理 外汇账务处理

2023-06-17

最新消息:6月初全球平均气温创新高 厄尔尼诺现象已出现

2023-06-17

统一科技:地铺石和一般的瓷砖有什么不同 当前速读

2023-06-17

铅球动作教学(铅球)-全球动态

2023-06-17

2868万!浙江这个无人岛被拍走了!新岛主是他

2023-06-17

贵州工程应用技术学院:以红色文化上好“思政课” 世界热消息

2023-06-17

《长方体和正方体的表面积》教学设计及反思_当前简讯

2023-06-17

41岁新娘挺着孕肚嫁给26岁新郎,笑得一脸幸福,新郎却生无可恋

2023-06-17

河南省气象台发布暴雨蓝色预警!这些地方有大到暴雨、局部大暴雨|天天新视野

2023-06-17

美图分享,电路板上的搬砖工 环球快讯

2023-06-17

#高质量发展调研行# 福建中科生物:拥有全球单体最大的LED植物工厂 日产绿色无污染蔬菜1.8吨|天天讯息

2023-06-17

南宁市气象台发布雷电黄色预警信号【III级/较重】【2023-06-17】 全球视讯

2023-06-17

果的笔顺怎么写_果的笔顺简述

2023-06-17

当前讯息:珠海冠宇:6月16日融券净卖出10.8万股,连续3日累计净卖出26.3万股

2023-06-17

c2m是什么概念_c2m

2023-06-17

全球热点!黑名单2017年上海亿媒出品电视剧

2023-06-17

世界最有钱的两个人一起吃饭了,谁买单?|全球最资讯

2023-06-17

环球微速讯:元旦节祝福语简短(元旦节祝福语简短15字

2023-06-17

汤加群岛地区附近发生6.4级左右地震

2023-06-17

琉璃碎了怎么粘牢固_琉璃碎_天天观点

2023-06-17

金箔怎么贴在首饰上(金箔怎么贴)-精选

2023-06-17

每日视讯:为市民奉上安全知识“大餐”,广东2023年“安全宣传咨询日在广州举行

2023-06-17

焦点热议:台式电脑怎么连接蓝牙设备上网_台式电脑怎么连接蓝牙设备

2023-06-17

潮汕景点旅游攻略_潮汕景点

2023-06-17

骑士千金马任务_ss千金马任务流程

2023-06-17

何为肌肤甲错?是何原因引起?(肌肤甲错什么意思)

2023-06-16

“国球进社区 国球进公园”启动仪式在石景山区举行_微动态

2023-06-16

大摩:予恒隆地产增持评级 目标价17.5港元

2023-06-16

飞入寻常百姓家的前一句飞入寻常百姓家的上一句是什么

2023-06-16

“千万工程”20年 | 浙江:一枝花共富一方百姓 当前快报

2023-06-16

辽宁防范高温旱情 大中型灌区已累计补水1.86亿立方米-每日观点

2023-06-16

郑州大学实验小学关注“三零”创建 构建平安校园

2023-06-16

我的世界怎么锁箱子 我的世界怎么锁箱子指令

2023-06-16

天房发展拟为子公司天蓟房地产3.4亿元融资提供担保|环球实时

2023-06-16

天天快资讯:《花戎》魔君随心所欲施法变出什么?

2023-06-16

市场日报丨贵州茅台股价重返1800元;盖茨访华引AI概念狂飙;“中字头”发力上攻

2023-06-16

工人日报e网评丨故宫禁止商拍,让旅游回归最初的意义 天天视点

2023-06-16

新业态有新担当!“温小爱”融入基层治理“大格局”-全球新动态

2023-06-16

海水产品进内陆暨“好品山东”渔业品牌全国推广活动走进西安

2023-06-16

高盛:维持水滴公司“买入”评级 目标价格3.2美元 |重点聚焦

2023-06-16

舆论战的窥豹一斑

2023-06-16

【世界速看料】乘风破浪的姐姐4三公排名发布 浪姐4三公排名

2023-06-16

观察:全国麦收进入尾声 各地“丰”景如画

2023-06-16

长城汽车申请GPT相关商标|当前滚动

2023-06-16

焦点精选!我看不懂但我大受震撼梗意思介绍

2023-06-16

今日热搜:房山区各基层工会广泛开展双沟通会,助力优化营商环境

2023-06-16

世界微头条丨福满满养老年金收益测算怎么样?值得买吗?

2023-06-16

B站申请注册电子羊商标 天天消息

2023-06-16

【新要闻】香农芯创6月16日快速回调

2023-06-16

电池级碳酸锂上涨1000元/吨,报314000元/吨 今日报

2023-06-16

【报资讯】四川省绵阳市2023-06-11 15:13发布大风蓝色预警

2023-06-16

A股房企挣扎退市,高管已经很淡定:退了也好,关起门来悄悄地干

2023-06-16

拉开荣威品牌新能源征程序幕 荣威中高级纯电轿车D7官图发布

2023-06-16

奥力给解释是什么意思_奥力给的解释

2023-06-16