单片机(嵌入式)程序分层架构
目录
功能模块层(Functional Module Layer)
前言
疫情带来的灾难,使得世界处于不稳定状态,全球缺芯片成为常态。对从事单片机和嵌入式底层的开发人员来增加很多的工作量,若是不注重代码分层或者分层不好的将是多么痛苦,老项目换芯片换个不停,新项目做好几套芯片方案。若有良好的分层思想,将是减少很多工作量!
最初的单片机开发语言是汇编语言,但汇编语言会随着单片机种类的不同而不同。程序设计起来难度较大。后来人们改用C语言作为单片机程序设计的通用语言。这种不依赖于机器硬件的语言,可以方便的在各类单片机系统中移植,极大的加快了单片机程序开发的时间。这是单片机从语言上进行分层带来便利。像PC 、手机等标准化产品已进行了系统性的标准分层。对于其他嵌入式产品行业分层架构方式较多,源于行业的标准化程度及行业特性决定!但整体思想是一致的。
本文罗列了市面常见的分层架构。对于复杂的系统产品分层方式较为统一,因为有人研究和专业的架构师岗位,以及产品标准化程度高。像单片机裸机软件分层架构相对较弱,因为硬件资源有限,分层越细会占用空间;项目简单,每个人都有自己的思想,没有统一的去研究;产品种类复杂标准化弱。不过还是有共性的,只是单片机裸机项目功能相对单一,分层不要过于太细,层级分的太多,隔离的太彻底,有时候反而增加了无谓的损耗,3~5层即可。
嵌入式3层软件架构
硬件层 | 嵌入式微处理器存储器,通用设备接口,io接口 |
中间层 | 底层硬件的初始化,数据的输入/输出操作,硬件设备的配置文件 |
软件层 | 多任务操作系统,文件系统,图形用户接口,网络系统,通用组件模块 |
嵌入式4层软件架构-1
嵌入式系统的软件体系是面向嵌入式系统特定的硬件体系和用户要求而设计的,是嵌入式系统的重要组成部分,是实现嵌入式系统功能的关键。嵌入式系统软件体系和通用计算机软件体系类似,分成驱动层、操作系统层、中间件层和应用层等四层,各有其特点。
驱动层
驱动层是直接与硬件打交道的一层,它为操作系统和应用提供硬件驱动或底层核心支持。在嵌入式系统中,驱动程序有时也称为板级支持包(BSP)。BSP具有在嵌入式系统上电后初始化系统的基本硬件环境的功能,基本硬件包括微处理器、存储器、中断控制器、DMA、定时器等。驱动层--般可以有三种类型的程序,即板级初始化程序、标准驱动程序和应用驱动程序。
操作系统层
嵌入式系统中的操作系统具有一般操作系统的核心功能,负责嵌入式系统的全部软硬件资源的分配、调度工作控制、协调并发活动。它仍具有嵌入式的特点,属于嵌入式操作系统(Embedded Operating System,EOS)。主流的嵌入式操作系统有Windows CE、Palm:OS、Linux、VxWorks.pSOS.QNX.LynxOS等。有了嵌入式操作系统,编写应用程序就更加快速、高效、稳定。
中间件层
中间件是用于帮助和支持应用软件开发的软件,通常包括数据库、网络协议、图形支持及相应开发工具等,例如:MySQL、TCP/IP、GU1等都属于这一类软件。
应用层
嵌入式应用软件是针对特定应用领域,用来实现用户预期目标的软件。嵌入式应用软件和普通应用软件有一定的区别,它不仅要求在准确性、安全性和稳定性等方面能够满足实际应用的需要,而且还要尽可能地进行优化,以减少对系统资源的消耗,降低硬件成本。嵌入式系统中的应用软件是最活跃的力量,每种应用软件均有特定的应用背景。尽管规模较小,但专业性较强,所以嵌入式应用软件不像操作系统和支撑软件那样受制于国外产品,是我国嵌入式软件的优势领域。
嵌入式4层软件架构-2
- 硬件层;
- 中间层;
- 系统软件层 ;
- 应用软件层 ;
硬件层
硬件层的结构如下:
嵌入式的硬件层主要分为三个部分:嵌入式微处理芯片、嵌入式存储系统 和 嵌入式 I/O 接口。
嵌入式微处理芯片
主要包括:嵌入式微处理器、嵌入式微控制器、嵌入式数字信号处理器、嵌入式片上系统等;嵌入式微处理器与通用 CPU 最大的区别在于将 CPU 中需要需要外部设备来完成的任务集成到了芯片内部。
- 嵌入式微处理器是嵌入式系统硬件层的核心部分;
- 微处理器最大的特点是:集成化、体积小、功耗小、成本低、稳定性高;
- 不同微处理器的体系结构不一样,主要分为冯诺依曼和哈弗结构;
- 即使同一体系结构的微处理器使用的时钟频率、数据总线宽度、集成的外设和接口也会不一样;
嵌入式存储器系统
主要包括:程序存储器、数据存储器和参数存储器,主要以 Cache、ROM、RAM、Flash、SD卡等;
- Cache:又叫高速缓冲存储器,是主存和处理器内核之间的一种容量小、速度快的存储器阵列,相当于在主存和内核之间构建了一条缓冲带。主要用于存放最近一段时间内核微处理器用到最多的指令和数据;Cache 分为指令 Cache 和 数据 Cache,微处理器尽量从 Cache 中读取指令和数据,减小在主存读取数据和指令的次数。Cache 存在提高了系统数据传输率和性能;
- 主存储器:主要用来存放用户的程序和数据,是嵌入式微处理器能直接访问的存储器。主存储器可以位于处理器内部和外部,常用的ROM类存储器为:EEPROM 、PROM;常用的 RAM 类存储器为:SRAM、DRAM、SDRAM等;一般容量较小(256KB – 1G ),读取速度快;
- 辅助存储器:通常指硬盘、NOR Flash, NAND Flash, CF卡, SD卡等,主要用来存放大容量的程序代码或数据。一般容量较大,读取速度慢;
嵌入式I/O接口
嵌入式系统与外接交互所需要的通用设备接口,通常为:
- GPIO;
- A/D 转换接口;
- RS-232接口(串行通信接口);
- SPI(串行外围设备接口);
- 以太网接口;
- USB(通用串行总线接口);
- I2C(现场总线接口);
- 音频接口;
- VGA视频输出接口;
- IrDA(红外线接口);
中间层
中间层也称为硬件抽象层(Hardware Abstract Layer,HAL) 或者叫板级别支持包(Board Support Package,BSP),位于硬件层和软件层之间,用于连接软件层和硬件层。
- BSP 是一个介于操作系统和底层硬件之间的软件层,为操作系统控制底层硬件提供了接口;
- BSP 具有硬件相关性和软件相关性:
- 硬件相关性:是指 BSP 需要和硬件平台相关联,不同硬件环境需要不同的 BSP 控制;
- 软件相关性:是指 BSP 也要迎合操作系统的接口,不同的操作系统具有不同的硬件操作接口;
- BSP 有一个很重要的功能是硬件初始化,嵌入式系统硬件初始化自下而上,从硬件到软件分为三个主要环节:片级初始化、板级初始化、系统级初始化;
- 片级初始化:主要是对微处理器进行初始化,包括:对处理器寄存器(包括数据寄存器和控制寄存器)的初始化,对处理器片内总线的初始化;
- 板级初始化:主要是对软硬两部分初始化,包括:对非处理器部分的初始化,设置软件系统运行需要的数据结构和参数;
- 系统初始化:主要是对操作系统和应用软件的初始化。首先,BSP 将处理器的控制权转交给操作系统,操作系统完成初始化,并创建应用程序环境;然后,操作系统将处理器控制权交给应用程序。
- BSP 中包含硬件相关的设备驱动程序,BSP 一般不直接调用这些驱动程序,而是操作系统通过 BSP 连接驱动程序,最终是应用程序调用操作系统接口使用设备驱动程序,实现对硬件设备的操作;
系统软件层
系统软件层通常包括实时多任务操作系统(Real-Time Operation System, RTOS)、文件系统、图像用户接口(Graphic User Interface,GUI)、网络系统、通用组件模块。其中, RTOS 是嵌入式应用软件的基础和开发平台。
RTOS
RTOS 的作用:
- 负责嵌入式系统资源分配(软件/硬件资源);
- 任务调度;
- 同步机制;
- 中断处理;
- 文件处理;
- 提供统一的设备驱动接口;
- 支持 TCP/IP 协议和其他协议;
- 提供 GUI 图形化界面操作接口;
RTOS 的特点:
- 强实时性;
- 可裁剪性;
- 可移植性;
- 硬件适应性;
- 开放性;
RTOS 和 应用软件被固化在嵌入式计算机的 ROM 中;
文件系统
嵌入式文件系统建立在 RTOS 之上,一般提供如下功能:
- 提供基本的文件存储、检索和更新功能;
- 支持 FAT32、JFFS2、YAFFS等几种标准文件格式;
- 支持修改文件权限;
- 支持建立、修改、改变和删除目录等服务;
- 支持创建、打开、读写、关闭和撤销等服务;
文件系统的特点:
- 强兼容性;
- 实时性;
- 可裁剪性;
GUI
GUI 为人机交互提供了非常人性化的接口。嵌入式GUI 与 PC 上的 GUI 有着明显的不同,嵌入式的 GUI 具有如下特点:
- 轻量型;
- 占用资源少;
- 高性能;
- -高可靠性;
- 便于移植;
- 可配置;
应用层
应用层软件就是根据实际需求开发的应用软件。嵌入式应用软件主要有以下特点:
- 反应快捷;
- 占用资源少;
- 同时方便多用户操作;
- 友好的人机界面;
嵌入式5层软件架构1
- 硬件驱动层
- 功能模块层
- 应用接口层
- 业务逻辑层
- 应用层
嵌入式5层软件架构2
- 硬件驱动层
- 功能模块层
- 系统层
- 业务逻辑层
- 应用层
嵌入式6层软件架构
简写 (英文全称) |
名称 | 内容 | 说明 |
HAL (Hardware Abstract Layer) |
硬件抽象层 | 内核驱动,主要是对SFR的配置,并将其封装起来。 | 硬件抽象层和硬件驱动层则是项目需求书中的功耗等硬件相关的需求变动而改变,若子功能的增加而硬件不支持,则也需更换硬件驱动。比如项目中的数据储存功能,硬件支持有AT24C02、W25Q128和芯片本身的FLASH,都可以支持数据储存功能,即使后期因为功耗或节约成本等问题,硬件的更换也不影响数据储存功能的实现(前提规划好标准规范的API函数定义)且避免了重写该功能代码所带来的各种问题,保证了该功能的稳定性。 |
HDL (Hardware Drvier Layer) |
硬件驱动层 | 对HAL层和OSL层进行封装,因为HAL层一般是厂家提供,不是特别方便直接使用 对一些非片内的硬件资源(HAL库不提供)进行驱动 |
|
OSL (Open System Layer) |
操作系统层 | 操作系统、文件系统、GUI | |
FML (Functional Module Layer) |
功能模块层 | 功能模块层是按照项目需求提取出来的功能,需要硬件抽象层和硬件驱动层的硬件支持才能实现,功能模块层根据项目的功能需求改变而改变。 | |
BLL (Business Logic Layer) |
业务逻辑层 | 按照流程来调用功能模块工作 | |
APL (Application Layer) |
应用层 | 调用不同业务逻辑来完成应用 |
个人软件架构
MCU抽象层(MCU Abstract Layer)
MCU是开发的核心和基础,所以应将其作为最底层,为上层提供基础支持。该层要求如下:
1,方便替换 单片机。
每家芯片寄存器或API库命名和操作都不相同,为了方便替换不对其他层代码改动,把MCU外设(GPIO,AD,UART....)抽象封装成统一的API或寄存器别名。
2,方便应用 不同项目。
MCU是专业通用芯片,会应用在不通产品,所以该层不能体现项目和方案信息,应内聚为MCU大类信息。
3,项目需要的进行抽象封装。
如果完全将MCU的库封装一遍工作量将十分巨大,也没必要,需要哪个就封装哪个。例如用到uart了那就只把uart的封装一下,像IIC、SPI等无关的可以不用封装。不过可以一个项目一个项目的沉淀,越往后工作量越少。
硬件驱动层(Hardware Driver Layer)
这一层是纯粹面向硬件设计的,对电路板的外设进行通用封装抽象(移植其他项目也可以用,与应用逻辑无关联),向上层提供硬件抽象接口。
如:常见的外围EEPROM芯片AT24C02,W25Q64等;控制电源芯片,AD采样芯片等;芯片级总线I2C、SPI,RS232协议、RS485协议、CAN总线等;按键,蜂鸣器,屏幕等驱动。
功能模块层(Functional Module Layer)
MCU层与硬件驱动层是为了功能模块提供的硬件驱动,从而实现项目需要的功能模块。如存储功能,电源设置功能,显示功能,算法库,文件库等。向上提供应用层的功能模块接口,向下调用驱动接口。
应用层(Application Layer)
应用层主要负责功能模块的使用和之间的逻辑关系处理等,实现产品整体功能系统逻辑。对于大部分单片机产品应用层一层就可以了,太复杂了,反而臃肿。但对于复杂的产品项目,可继续细分,如下:
应用接口层:提供公共的 API 接口供应用接口供上层调用。这些接口也可由下层的功能模块开放出来,应用接口层负责汇总。
业务逻辑层:如 CPU 卡处理,交通部卡处理,银联卡处理,M1 卡处理,通信记录上传,黑名单下载,票价参数下载等。
应用层:为程序的总体的运行框架,组织调用业务逻辑。可以用某种嵌入式操作系统实现几种任务 。如定时任务,卡处理任务,菜单任务,通信任务。