黄工无刷电机学习
直播中

chunhuahua

8年用户 1342经验值
擅长:接口/总线/驱动
私信 关注
[问答]

为何要进行嵌入式软件架构设计?如何设计?

为何要进行嵌入式软件架构设计?
如何进行嵌入式软件架构设计?

回帖(1)

黄锐

2021-11-1 09:48:15
一、前言

小生做MCU方面的开发已经很多年了,记得当初开始做项目的时候,实现功能就是我的目标,基本不会关注其它方面,功能的实现已经够让我折腾的了,也没有多少精力关注其它方面,后面慢慢对代码风格、编码规范有一定的讲究,有些代码看起来令人赏心悦目,而有些却不忍直视,再后来发现有些功能模块在一个产品上做了,然后换一个平台(mcu)后,又得调一遍,有些甚至调了一遍又一遍,多几次之后真是烦躁,哲学上有句话叫"人不能两次踏入同一条河流",而我却是一个坑踩了一次又一次,直到实在受不了了,我决定"再也不踩了",于是,软件框架设计思想慢慢浮现,从此,我一直基于软件框架开发,分层设计,低耦合高内聚,一个模块在一个产品上开发了,在另一个产品上基本可以直接拿过去用,避免了重复造轮子,开发速度直线上升,并且后期维护也是轻松方便,从此达到了人生巅峰!现在留下些许记录,当然有些也是参考了网友的!
二、为何要进行嵌入式软件架构设计

1、如果没有好的架构,移植将会是一件非常痛苦的事情。
2、如果没有好的架构,复用是不存在的,至少不能最大限度的复用原有的代码。
3、如果没有好的架构,一旦某处修改了,其它很多地方都要改,费时费力且很容易出错。
4、如果没有好的架构,与硬件相关的代码随处可见,看着会很混乱,维护起来非常困难。
5、要做到嵌入式软件逻辑清晰,避免重复造轮子,不断迭代积累,需要有好的软件架构。
三、如何进行嵌入式软件架构设计

首先,说到架构,你会想到什么?像建造一栋楼盘一样,首先要打地基,并且地基要打的牢靠楼盘才能建的高,抗自然灾害(地震、台风等)抗风险能力才更强,然后钢筋、水泥、预制板像堆积木一样,一层一层的造起来…
目前很多优秀的软件都是有框架的,像linux,android等,其框架都是非常清晰,层次化分明的,在其上开发也是需要了解其框架,也只有了解了其框架才能按其套路轻松的开发,因为了解了那些框架就相当于站在了巨人的肩膀上.
我们的嵌软架构也类似房屋建造与积木搭建,也是基于这种分层与模块化的思想,上层是建立在下层的基础之上,模块与模块之间相互独立、互不影响,具体分为驱动层(也叫BSP层), 模块层、逻辑层、应用层、加上各平台的HAL层(硬件抽象层)共五层,另外一列是公共的库、算法等文件以及操作系统,俗称"五横一纵"!如下图所示:





应用层:为程序的总体的运行框架,组织调用业务逻辑。可以用某种嵌入式操作系统(freeRTOS、rt-thread等)实现几种任务 ,如定时任务,电机控制任务,故障监测任务,耗时处理任务等。
业务逻辑层:如画图处理,底盘运动处理,手臂运动处理,电池信息处理,自动充电处理等。
功能模块层:可以封装不同的功能模块。如gps模块,wifi模块,tof模块,蓝牙模块等,向下调用驱动层接口,向上为应用接提供接口,模块之间尽量不要相互调用,做到低耦合,高内聚。
BSP层:也叫板级支持包层,由各个外设驱动组成,如gpio、timer,uart、iic、spi、dma、irq等外设的操作与控制,向上提供统一的接口。
HAL层(硬件抽象层):这层包含的是原生的芯片厂家官方库,像STM32标准/HAL库,NXP官方库、TI库等
注:功能模块层之上可以增加一个应用接口层,提供公共的api接口供上层调用。这些接口也可由下层的功能模块开放出来,应用接口层负责汇总。(一个文件就可以搞定,一般顺带放在业务逻辑层)
四、需要严格遵循的原则

1.每个模块提供出的接口要统一,后续只能增,不能改原来的接口(向后兼容)。
2.模块与模块之间相互独立,互不影响,不能相互调用,只能调用它下层的接口(高内聚低耦合)。
3.由模块构成层,层与层之间不能跨级调用。如在应用层中不能看到直接调用驱动层的代码。
4.模块中又可以继续分层,如硬件层、驱动层、接口层。 方便后续模块硬件更换。
如果驱动变动了,或者换不同平台了,只需更改驱动层,应用层不受影响。
如果功能模块变动了,只需升级功能模块,其他的模块不受影响,应用层也不受影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分