1.框架分层是什么?
嵌入式软件开发架构的分层是指在软件设计过程中,将整个系统划分为不同层次的模块,每个层级都有特定的功能和责任,并且这些层次之间通过定义清晰的接口进行交互和通信。常见的嵌入式软件开发架构分层通常包括硬件层、中间件/驱动层、API 层和应用层。当然分层并不固定,根据项目的需求可以分为3层、4层、5层等等。
2.为什么要框架分层?
单一职责:在项目开发中,每个人负责的内容不一样,分层的目的是为了职责边界清晰,在大型项目中,每个人负责的部分不一样,加快整个项目的开发进度。
高内聚:分层是把相同的职责放在同一个层中,所有业务逻辑内聚在领域层。在测试的时候,只需要测试该领域的层即可,一般不需要考虑其他层的问题。
低耦合:依赖关系非常简单,上层只能依赖于下层,没有循环依赖。
易维护:面对变更容易修改。在平台更改后,如果只是改了驱动,其他层都不需要动,只需要把驱动层给更改,其他层的功能不需要更改。
易复用:如果功能模块变动了,只需升级相应的功能模块,硬件层不受影响。如果硬件层改变,模块层只需要修改调用硬件层的API即可,逻辑不变,这大大提高了代码的复用性。
3.嵌入式软件开发分层
3.1硬件抽象层(Hardware Abstract Layer)
硬件层是嵌入式系统的最底层,负责与具体的硬件设备进行交互。它提供固定的片内资源(常用的有I/O,ISR,TIME、ADC、SPI、IIC等)提供给开发者使用。硬件层的责任是提供对底层硬件的抽象接口,允许上层软件与硬件进行交互,而不必关心底层硬件的具体细节。大部分情况下该层都会有芯片厂商提供相应的库函数包或者配置工具生成对应API函数,基本只要知道如何配置和使用就行,硬件层不随项目的新增需求变动而变动。所以应将其作为最底层,为上层提供基础支持。
3.2硬件驱动层(Hardware Driver Layer)
与硬件抽象层不同,该层的作用是驱动片外外设的,嵌入式开发基本都会使用片外资源,如AT24C02,W25Q128等常见的外围EEPROM芯片,需要SPI通信(硬件SPI或I/O模拟的SPI)发送相应指令驱动该芯片,实现该芯片能正常工作。因此驱动这部分的API函数实现程序即为硬件驱动层。即使换了MCU,也只需将调用过硬件抽象层的API函数替换即可。
3.3功能模块层(Functional Module Layer)
硬件抽象层和驱动层主要就是为功能模块层提供的,该层是实现该项目具体需要的功能(主要写功能的逻辑),比如点灯操作,在该层所要做的操作是:初始化LED:负责初始化LED灯的相关硬件资源和设置默认状态。打开LED:通过调用驱动层提供的接口,控制GPIO引脚将对应的LED灯设置为亮的状态。关闭LED:通过调用驱动层提供的接口,控制GPIO引脚将对应的LED灯设置为灭的状态。设置LED亮度:如果灯具有可调节亮度的功能,则该模块还可以提供设置LED亮度的功能。而在硬件抽象层,我们需要初始化GPIO(速度、模式、是否复用等等)。
3.4应用程序层(Application Layer)
应用程序层主要负责的就是功能模块的使用和之间的逻辑关系处理等等,比如用户交互界面应用程序可能需要按键(KEY)、指示灯(LED)、显示屏(LCD)等,实现一系列的人机交互功能,通常应用程序层相对于功能模块层而言独立性较低。一般情况下也可细分出应用业务层,但是对于单片机产品来说,这一层的必要性反而不高,分层太多,反而显得臃肿。