嵌入式软件架构
扫描二维码
随时随地手机看文章
一 感慨
近公司新招了一个做嵌入式软件开发开发的童鞋,该童鞋是从上海的某一个上市公司出来的,因为我们这边人手不够,因此把他安排了去负责一个新产品的研发,前期让他负责加速度计、NB-IOT、舵机、外置Flash的功能测试,测试完成之后,准备让他做一个该产品的概要设计。然后他花了2个星期的时间,给我们写出来一个概要设计,说实话,我看到这个概要设计,我就觉得是刚毕业的大学生写的。版本一的架构设计123456789101112131415161718 | 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)架构设计的目的
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)模块层次说明
- 硬件驱动层
- 功能模块层
- 业务逻辑层
- 应用层