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

 1、感慨架构

近公司新招了一个作嵌入式软件开发开发的童鞋,该童鞋是从上海的某一个上市公司出来的,由于咱们这边人手不够,所以把他安排了去负责一个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置Flash的功能测试,测试完成以后,准备让他作一个该产品的概要设计。而后他花了2个星期的时间,给咱们写出来一个概要设计,说实话,我看到这个概要设计,我就以为是刚毕业的大学生写的。框架

版本一的架构设计模块化

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)历史数据保存

看到版本一的架构设计以后,说实话,我仍是第一次见到这样来写架构设计的,竟然是以序号来写的,这个让别人读起来,特别的别扭。  函数

版本二的架构设计测试

看到版本二的架构设计以后,虽然颇感欣慰,可是想到达到咱们所要求的,还要很大的一段距离,该架构设计,主要有如下几点问题:spa

1.对架构的理解还不是很清晰,既然是作架构设计,那就应该从总体来看,而不是仅仅只是局限于一个模块,或者功能里面。架构设计

2.仍是每一个层次的理解也还不是很清晰,好比讲MCU的初始化,归于硬件驱动层里面。MCU的初始化,严格意义上来讲,是属于流程的一部分了,而不是驱动。好比电脑的开启启动,把这个归于硬件的驱动里面,确定是属于牛头不对马嘴的。设计

3.还有就是各个模块的启动,也是不能属于硬件驱动层的,也都是业务流程的一部分了,都不该该属于驱动层的一部分。日志

4.还有就是总线数据的读写,虽然驱动的做用也就是读写,可是数据总线的读写不能写成硬件驱动。blog

5.应用层的系统参数初始化,也仍是属于流程。

6.数据的解析和数据的发生,都是属于通讯功能里面的,不该该单独独立出来,属于单个的应用。

 

看到这里以后,说实话,我真的很惊讶,难倒从大企业出来的童鞋,能力都是这样的吗?从大企业出来的童鞋们,工资也是要的老高老高的,难倒他们不知道,在昆明的工资,都是以K来计算的吗?在昆明能拿到8K的工资作开发的人就已经不多了。而后再到1W

以上的,童鞋们就更少了。

说实话,咱们的这位童鞋,上班的时候,还常常看电子书,在实习期间还常常看电子书,我不知道,他哪来的实力,心能够放的这么宽,交代的活没有完成,还有时间来看电子书。固然托他的福,个人工资也终于涨到6K了,由于新人的工资,比老人高,

作的活仍是同样的(结果一不同我就知道了),为了考虑到老人的内心面不平衡,因此才给我加的工资的。领导们在批加工资的申请的时候,还专门把我叫去办公室,让我表决心啥的。。

 

而后,我让他去改,把我说的这些改改,而后再看一下,还有什么问题没?结果我看他在那抓耳挠腮,还有各类叹气,而后和我说,改不了。

既然改不了,那我就只能亲自操刀上阵了,毕竟同事一场。

 

 2、基本框架图

(1)架构设计的目的

一、应用的代码逻辑清晰,且避免重复的造轮子。

二、若是没有好的架构,移植将会是一件很痛苦的事情,所以一个好的架构设计,方便软件的移植。

三、最大限度的复用。

四、高耦合低内聚。 

 

(2)设计思路

如何把硬件的驱动和一个功能封装成一个个的模块,而后能够像小朋友搭积木一个,一个个模块能够快速的拼接起来,组成一个个不一样的模型。

咱们的嵌入式架构思路也是来源于此,即功能模块化设计、分层设计。

这个设计和WEB开发的MVC模式相似,都是注重分层设计。

 

模块化设计:将收集到的需求,进行归类,总结和分析,将这些需求归纳为一个个单独的功能,每个功能,作成一个单独的功能模块。

分层设计一句话很差直接表达,其主要体如今一下几方面:

一、功能模块对外调用的模块封装成一个个API,将底层驱动作个API以供功能模块调用。(各个功能模块能够独立编译(如通讯模块纯ANSI C,可在任意平台复用),或者调用驱动层接口(日志库模块调用了驱动读写Flash),总而言之,言而总之,封装出各个功能独立的可复用的功能模块。)

二、API分为驱动层API和应用层API,而不是全部程序都调用驱动层API。(整个应用中都调用驱动层API会致使应用中驱动调用随处可见,没法移植和最大限度的复用)

 

整体分 硬件驱动层-->功能模块层-->业务逻辑层-->应用层

整体结构示意框图:

说明:

1.层与层之间不能跨层调用。

2.模块与模块各自独立,无依赖关系。

3.模块提供统一的接口供上层调用,模块的内外接口分明。

4.模块的功能只能增,不能改。

5.各个功能模块层也还能够进行继续分层,好比接口层、驱动层、硬件层。

 

(3)模块层次说明

硬件驱动层

硬件驱动层包含板载硬件资源正常运行所需的全部驱动程序并提供API给功能模块调用。

功能模块层

功能模块层包括实现具体功能的函数,经过调用驱动层API实现相应功能,同时提供可调用的API给业务逻辑层。

业务逻辑层

业务逻辑层包括产品总体功能的各个业务流程,经过调用功能模块层的API实现。

应用层

应用层将各个业务逻辑进行整合调用,完成整个产品的功能。

 

(4)优点

若是驱动变更了,或者换不一样平台,只需更改驱动层,应用层不受影响。

若是功能模块变更了,只需升级相应的功能模块,其余的模块不受影响,应用层也不受影响。

按照这种逻辑设计好以后,主要的工做就是在业务逻辑层。应用层则为程序的整体流程和框架,主要调用业务逻辑层实现不一样的功能。

相关文章
相关标签/搜索