如何设计一个好的软件架构,如何提高软件的扩展性,移植性,复用性和可读性?
【嵌入式软件架构设计】很多做嵌入式开发的朋友经常会遇到这种情况:一个项目软件设计完成了,客户提出了一些新的功能需求 。这时侯如果客户新需求不多,软件增加一些新功能即可,但是增加新功能后程序容易出现各种异常问题;这时侯如果客户新需求很多,导致软件全局很多地方需要修改,甚至有可能导致软件重写 。造成这种结果的原因是,软件设计没有遵循软件设计原则,没有使用正确的设计模式和正确的软件架构 。
软件设计五大原则:单一原则,开闭原则,里氏代换原则,接口隔离原则,依赖倒置原则 。
27种设计模式:适配器模式,装饰模式,观察者模式,迭代器模式,拜访者模式等等(不一一列举) 。
软件架构:分层架构,过滤器架构,插件架构,MVC架构等等 。
规则和方法繁多,往往难以融会贯通地使用到实际项目中,接下来我用一个项目来介绍如何遵循软件设计原则,如何使用良好的设计模式和架构,这个项目是一个用于智能家具系统的网关软件设计项目 。
我们先来了解一下智能家居系统,它是由网关,智能触控屏,控制模块,检测模块等组成,实现对家居设备智能控制 。该系统可以控制灯,空调,窗帘,蓝牙音乐,地暖等家居设备 。用户可以通过语音指令,智能触控屏,手机App,电脑云端等方式监控家居设备状态 。该系统应用场景如图:
文章插图
网关功能描述
智能家居系统的控制枢纽是网关,网关的主要任务是实现对触控模块,控制模块,检测模块的状态监测和控制 。网关的功能如下:
1、使用嵌入式以太网控制器硬件实现TCP访问局域网内的本地服务器和外网的云端服务器 。本地服务器可以配置网关参数,可以通过网口对网关固件进行升级,用户通过手机APP使用云端服务器下发数据给网关 。
2、使用485总线接收面板的和环境传感器的上报数据,分析数据并下发485指令操作开关控制器实现对执行单元的控制 。
3、用户可以通过扩展的输入输出IO口,实现简单的开关输入和控制 。
网关硬件描述
网关的硬件使用华大的HC32F460单片机为核心,外围设备有485电路,RTC电路,LCD电路,以太网控制器电路,IO控制电路 。网关的硬件框图如下:
文章插图
软件框架
网关软件使用FreeRTOS操作系统,采用了模块化设计方法,每个功能独立成一个模块,每个单独的模块采用了分层设计 。软件框架图如下:
文章插图
软件使用了模块化设计的方法,模块化设计核心思想就是“分而治之”,就是把一个复杂的问题分解为若干个简单的问题,然后逐个解决 。在嵌入式软件设计中通常以硬件外设划分模块如:485模块,RTC模块,LCD模块,温湿度模块,ADC数据采集模块,GPIO控制模块等 。模块化设计提高了软件系统的扩展性,模块可以根据需求布署和删除,模块化设计遵循了单一原则 。软件工程源码中模块的划分如下:
文章插图
单独的功能模块采用了的分层设计,分层设计的核心思想也是“分而治之”,分层设计将软件功能水平分割成合理的多个子系统,软件中紧密关联的部分被集中放在一个层内 。分层设计的框图如下:
文章插图
分层架构有以下优点:
1、每一层都把一个具体功能抽象化 。
2、可以降低代码的相互依赖程度,更改代码时影响的层很少 。
3、层可以被复用 。
软件工程源码中GPIO任务的BSP层代码如下:
文章插图
每个层都有一个xxxx_interface()函数,上层文件通过这个函数使用下层提供的服务,这种设计原则为接口隔离原则 。3层模型的调用关系图如下:
文章插图
每个功能模块采用了3层的分层设计,第1层处理MCU寄存器相关操作,第2层处理驱动控制和逻辑控制,第2层用来处理与其他业务模块的数据交互.分层设计提高了软件系统的移植性,如果项目更换了MCU那么只用修改第1层,如果更换改了外设那么只用修改第2层,如果更改了业务逻辑那么只用修改第3层 。
推荐阅读
- 如何永久告别流氓软件,这5个杀毒神器,让你的电脑干干净净
- 单一职责原则:软件世界中最重要的规则 - DZone
- AMD|AMD RDNA3架构神了!RX 7900 XT曝光:浮点性能4倍于6900XT
- 有哪些简单好用的写作软件,可以提升文章质量?
- 火绒安全软件怎么样,火绒软件用起来怎么样
- 程序员必须要了解的10款终端软件
- Windows电脑必装的10款软件,个个都是精品
- 华为架构师整理Redis数据结构的大厂最佳实践
- 什么软件可以png转jpg-图片png格式怎么转换jpg格式-
- 详解Python软件安装教程和配置,小白都能看懂的教程,值得收藏