如何用一个实例来探讨嵌入式软件架构设计

如何⽤⼀个实例来探讨嵌⼊式软件架构设计
⼀、感慨
近公司新招了⼀个做嵌⼊式软件开发开发的童鞋,该童鞋是从上海的某⼀个上市公司出来的,因为我们这边⼈⼿不够,因此把他安排了去负责⼀个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置Flash的功能测试,测试完成之后,准备让他做⼀个该产品的概要设计。然后他花了2个星期的时间,给我们写出来⼀个概要设计,说实话,我看到这个概要设计,我就觉得是刚毕业的⼤学⽣写的。
pbs配方版本⼀的架构设计
2.1系统体系结构
系统分为两层:硬件驱动层、应⽤层。
2.1.1硬件驱动层
酸洗设备硬件驱动层包含板载硬件资源正常运⾏所需的所有驱动程序。
1)MCU初始化
脉动测速
2)I2C数据存取
3)SPI数据读取
4)加速度计初始化
5)蓝⽛模块启动
6)BC95模块启动
7)485通讯模块启动
2.2.2应⽤层
1)Mcu运⾏模式切换
2)震动及倾斜
3)数据解析
4)开/关锁
5)数据发送
6)历史数据保存
看到版本⼀的架构设计之后,说实话,我还是第⼀次见到这样来写架构设计的,居然是以序号来写的,这个让别⼈读起来,特别的别扭。 
耐腐蚀热电偶版本⼆的架构设计
看到版本⼆的架构设计之后,虽然颇感欣慰,但是想到达到我们所要求的,还要很⼤的⼀段距离,该架构设计,主要有以下⼏点问题:
1.对架构的理解还不是很清晰,既然是做架构设计,那就应该从整体来看,⽽不是仅仅只是局限于⼀个模块,或者功能⾥⾯。
2.还是每个层次的理解也还不是很清晰,⽐如讲MCU的初始化,归于硬件驱动层⾥⾯。MCU的初始化,严格意义上来说,是属于流程的⼀部分了,⽽不是驱动。⽐如电脑的开启启动,把这个归于硬件的驱动⾥⾯,肯定是属于⽜头不对马嘴的。
3.还有就是各个模块的启动,也是不能属于硬件驱动层的,也都是业务流程的⼀部分了,都不应该属于驱动层的⼀部分。
4.还有就是总线数据的读写,虽然驱动的作⽤也就是读写,但是数据总线的读写不能写成硬件驱动。
5.应⽤层的系统参数初始化,也还是属于流程。
6.数据的解析和数据的发⽣,都是属于通信功能⾥⾯的,不应该单独独⽴出来,属于单个的应⽤。
看到这⾥之后,说实话,我真的很惊讶,难倒从⼤企业出来的童鞋,能⼒都是这样的吗?从⼤企业出
来的童鞋们,⼯资也是要的⽼⾼⽼⾼的,难倒他们不知道,在昆明的⼯资,都是以K来计算的吗?在昆明能拿到8K的⼯资做开发的⼈就已经很少了。然后再到1W
以上的,童鞋们就更少了。
说实话,我们的这位童鞋,上班的时候,还经常看电⼦书,在实习期间还经常看电⼦书,我不知道,他哪来的实⼒,⼼可以放的这么宽,交代的活没有完成,还有时间来看电⼦书。当然托他的福,我的⼯资也终于涨到6K了,因为新⼈的⼯资,⽐⽼⼈⾼,
做的活还是⼀样的(结果⼀不⼀样我就知道了),为了考虑到⽼⼈的⼼⾥⾯不平衡,所以才给我加的⼯资的。领导们在批加⼯资的申请的时候,还专门把我叫去办公室,让我表决⼼啥的。。
然后,我让他去改,把我说的这些改改,然后再看⼀下,还有什么问题没?结果我看他在那抓⽿挠腮,还有各种叹⽓,然后和我说,改不了。
既然改不了,那我就只能亲⾃操⼑上阵了,毕竟同事⼀场。
打开收音机⼆、基本框架图
(1)架构设计的⽬的
1、应⽤的代码逻辑清晰,且避免重复的造轮⼦。
2、如果没有好的架构,移植将会是⼀件很痛苦的事情,因此⼀个好的架构设计,⽅便软件的移植。
3、最⼤限度的复⽤。
4、⾼耦合低内聚。
(2)设计思路
如何把硬件的驱动和⼀个功能封装成⼀个个的模块,然后可以像⼩朋友搭积⽊⼀个,⼀个个模块可以快速的拼接起来,组成⼀个个不同的模型。
我们的嵌⼊式架构思路也是来源于此,即功能模块化设计、分层设计。
这个设计和WEB开发的MVC模式类似,都是注重分层设计。
模块化设计:将收集到的需求,进⾏归类,总结和分析,将这些需求概括为⼀个个单独的功能,每⼀个功能,做成⼀个单独的功能模块。
分层设计⼀句话不好直接表达,其主要体现在⼀下⼏⽅⾯:
1、功能模块对外调⽤的模块封装成⼀个个API,将底层驱动做个API以供功能模块调⽤。(各个功能模块可以独⽴编译(如通信模块纯ANSI C,可在任意平台复⽤),或者调⽤驱动层接⼝(⽇志库模块调⽤了驱动读写Flash),总⽽⾔之,⾔⽽总之,封装出各个功能独⽴的可复⽤的功能模块。)
2、API分为驱动层API和应⽤层API,⽽不是所有程序都调⽤驱动层API。(整个应⽤中都调⽤驱动层API会导致应⽤中驱动调⽤随处可见,⽆法移植和最⼤限度的复⽤)
总体分硬件驱动层-->功能模块层-->业务逻辑层-->应⽤层
总体结构⽰意框图:
说明:
1.层与层之间不能跨层调⽤。
硝酸钙溶液2.模块与模块各⾃独⽴,⽆依赖关系。
3.模块提供统⼀的接⼝供上层调⽤,模块的内外接⼝分明。
4.模块的功能只能增,不能改。
5.各个功能模块层也还可以进⾏继续分层,⽐如接⼝层、驱动层、硬件层。
(3)模块层次说明
硬件驱动层
硬件驱动层包含板载硬件资源正常运⾏所需的所有驱动程序并提供API给功能模块调⽤。
功能模块层
功能模块层包括实现具体功能的函数,通过调⽤驱动层API实现相应功能,同时提供可调⽤的API给业务逻辑层。
业务逻辑层
业务逻辑层包括产品整体功能的各个业务流程,通过调⽤功能模块层的API实现。
应⽤层
应⽤层将各个业务逻辑进⾏整合调⽤,完成整个产品的功能。
(4)优势
如果驱动变动了,或者换不同平台,只需更改驱动层,应⽤层不受影响。
如果功能模块变动了,只需升级相应的功能模块,其他的模块不受影响,应⽤层也不受影响。
按照这种逻辑设计好之后,主要的⼯作就是在业务逻辑层。应⽤层则为程序的总体流程和框架,主要调⽤业务逻辑层实现不同的功能。

本文发布于:2024-09-25 16:40:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/280917.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:驱动   功能   模块   设计   硬件   架构设计   数据   逻辑
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议