嵌入式软件架构设计
layout: post
title: 嵌入式软件架构设计
description: 嵌入式软件架构设计
categories:
- 设计模式
tags: 架构
嵌入式软件架构设计
一、为何要进行嵌入式软件架构设计
如果没有好的架构,移植将会是一件非常痛苦的事情。
如果没有好的架构,复用是不存在的,至少不能最大限度的复用原有的代码。
如果没有好的架构,一旦某处修改了,其它很多地方都要改,费时费力且很容易出错。
如果没有好的架构,与硬件相关的代码随处可见,看着会很混乱,维护起来非常困难。
要做到嵌入式软件逻辑清晰,避免重复造轮子,不断迭代积累,需要有好的软件架构。
二、如何进行嵌入式软件架构设计
首先,说到架构,你会想到什么?像建造一栋楼盘一样,首先要打地基,并且地基要打的牢靠楼盘才能建的高,抗自然灾害(地震、台风等)抗风险能力才更强,然后钢筋、水泥、预制板像堆积木一样,一层一层的造起来…
目前很多优秀的软件都是有框架的,像linux,android等,其框架都是非常清晰,层次化分明的,在其上开发也是需要了解其框架,也只有了解了其框架才能按其套路轻松的开发,因为了解了那些框架就相当于站在了巨人的肩膀上.
我们的嵌软架构也类似房屋建造与积木搭建,也是基于这种分层与模块化的思想,上层是建立在下层的基础之上,模块与模块之间相互独立、互不影响,具体分为驱动层(也叫BSP层), 模块层、逻辑层、应用层、加上各平台的HAL层(硬件抽象层)共五层,另外一列是公共的库、算法等文件以及操作系统,俗称"五横一纵”!如下图所示:
应用层:为程序的总体的运行框架,组织调用业务逻辑。可以用某种嵌入式操作系统(freeRTOS、rt-thread等)实现几种任务 ,如定时任务,电机控制任务,故障监测任务,耗时处理任务等。
业务逻辑层:如画图处理,底盘运动处理,手臂运动处理,电池信息处理,自动充电处理等。
功能模块层:可以封装不同的功能模块。如gps模块,wifi模块,tof模块,蓝牙模块等,向下调用驱动层接口,向上为应用接提供接口,模块之间尽量不要相互调用,做到低耦合,高内聚。
BSP层:也叫板级支持包层,由各个外设驱动组成,如gpio、timer,uart、iic、spi、dma、irq等外设的操作与控制,向上提供统一的接口。
HAL层(硬件抽象层):这层包含的是原生的芯片厂家官方库,像STM32标准/HAL库,NXP官方库、TI库等
注:功能模块层之上可以增加一个应用接口层,提供公共的api接口供上层调用。这些接口也可由下层的功能模块开放出来,应用接口层负责汇总。(一个文件就可以搞定,一般顺带放在业务逻辑层)
Y.han@root321
三、严格遵守的原则
每个模块提供出的接口要统一,后续只能增,不能改原来的接口(向后兼容)。
模块与模块之间相互独立,互不影响,不能相互调用,只能调用它下层的接口(高内聚低耦合)。
由模块构成层,层与层之间不能跨级调用。如在应用层中不能看到直接调用驱动层的代码。
模块中又可以继续分层,如硬件层、驱动层、接口层。 方便后续模块硬件更换。如果驱动变动了,或者换不同平台了,只需更改驱动层,应用层不受影响。如果功能模块变动了,只需升级功能模块,其他的模块不受影响,应用层也不受影响。