单片机/嵌入式系统软件分层架构设计与实现
本文系统梳理了嵌入式系统常见的分层架构设计方法。针对当前芯片短缺背景下嵌入式开发面临的挑战,文章对比分析了3层至6层的多种架构方案,包括硬件层、驱动层、操作系统层、中间件层和应用层的功能划分。特别以咖啡机项目为例,详细展示了基于STM32CubeMX的6层架构实现方案,包含硬件抽象层(HAL)、设备驱动层(DRV)、服务层(SRV)、应用层(APP)等核心层级。文章强调分层设计应遵循单向依赖、接口
目录
前言
疫情给世界带来诸多挑战,全球局势不稳定,芯片短缺成为常态。对从事单片机与底层嵌入式开发的工程师而言,这不仅意味着工作量的显著增加,更凸显出代码结构设计的关键性。若缺乏合理的分层架构,开发过程将充满困难——老项目因芯片频繁更换而反复修改,新项目则需同时准备多套芯片方案;而若能贯彻清晰的分层思想,将极大减少不必要的工作负担。
早期单片机开发主要使用汇编语言,但其高度依赖具体芯片型号,不同单片机之间指令集差异大,导致开发难度高、移植性差。随着C语言的广泛应用,单片机开发迎来重要转折。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软件架构
以咖啡机为例,使用STM32CubeMX工具
分层架构总览表
| 层级 | 作用 | 目的 | 依赖 关系 |
业务相关程度 | 硬件相关程度 | 示例函数 |
|---|---|---|---|---|---|---|
| ENT (入口层) | 系统启动入口,统一初始化流程 | 协调各层初始化,启动调度器 | APP + SRV + BASE | 低 | 低 | ENT_Main(), ENT_InitAllLayers(), ENT_StartScheduler() |
| APP (应用层) | 实现咖啡机具体业务逻辑 | 处理用户场景和业务流程 | SRV + BASE | 高 | 低 | APP_BrewStart(), APP_HandleKeyInput(), APP_UpdateDisplay() |
| SRV (服务层) | 提供通用服务能力 | 跨业务复用,与硬件无关 | DRV + BASE | 中 | 低 | SRV_RegisterTask(), SRV_RunSched(), SRV_RunTempCtrl() |
| DRV (设备驱动层) | 封装设备级功能 | 硬件设备的标准化控制 | HAL + BASE | 中 | 高 | DRV_SetHeaterPower(), DRV_ReadTemp(), DRV_FlashWrite() |
| HAL (硬件抽象层) | 直接操作MCU硬件 | 提供寄存器级标准化接口 | MCU + BASE | 低 | 高 | HAL_SetGpioPin(), HAL_InitUart(), HAL_ReadAdc() |
| Common (通用基础层) | 全系统共用"通用语言" | 定义数据类型、常量、错误码、通用工具函数 | 无 | 无 | 无 |
分层文件夹目录结构(咖啡机项目+STM32CubeMX为例)
COFFEE_MACHINE_FIRMWARE/
├── MDK-ARM/ # Keil MDK工程文件夹(STM32CubeMX生成)
│ ├── CoffeeMachine.uvprojx # Keil项目文件
│ ├── CoffeeMachine.uvoptx # Keil选项文件
│ ├── startup_stm32f407xx.s # 启动文件
│ └── Objects/ # 编译输出
│ ├── CoffeeMachine.axf
│ ├── CoffeeMachine.map
│ └── *.o
│
├── Core/ # STM32CubeMX生成的核心文件(STM32CubeMX生成)
│ ├── Inc/ # 头文件
│ │ ├── main.h
│ │ ├── gpio.h
│ │ ├── usart.h
│ │ ├── adc.h
│ │ ├── tim.h
│ │ ├── i2c.h
│ │ ├── spi.h
│ │ └── freertos.h
│ └── Src/ # 源文件
│ ├── main.c
│ ├── gpio.c
│ ├── usart.c
│ ├── adc.c
│ ├── tim.c
│ ├── i2c.c
│ ├── spi.c
│ └── freertos.c
│
├── Drivers/ # STM32 HAL驱动(STM32CubeMX生成)
│ ├── CMSIS/ # Cortex微控制器软件接口标准
│ │ ├── Include/ # CMSIS核心头文件
│ │ └── Device/ST/STM32F4xx/ # 设备特定文件
│ └── STM32F4xx_HAL_Driver/ # STM32 HAL库
│ ├── Inc/ # HAL头文件
│ └── Src/ # HAL源文件
│
├── Middlewares/ # 中间件
│ └── Third_Party/
│ ├── FreeRTOS/ # FreeRTOS实时系统
│ │ ├── Include/
│ │ ├── portable/
│ │ │ └── RVDS/ARM_CM4F/
│ │ └── CMSIS_RTOS/
│ ├── lwIP/ # 网络协议栈
│ └── FatFS/ # 文件系统
│
├── UserCode/ # 用户自定义代码(分层架构)
│ ├── Common/ # 通用基础层
│ │ ├── utils/ # 工具函数
│ │ └── base.h
│ │
│ ├── HAL/ # 硬件抽象层(基于CubeMX HAL的封装)
│ │ ├── hal_gpio_ex.c/.h # GPIO扩展
│ │ ├── hal_uart_ex.c/.h # 串口扩展
│ │ ├── hal_adc_ex.c/.h # ADC扩展
│ │ ├── hal_pwm_ex.c/.h # PWM扩展
│ │ ├── hal_timer_ex.c/.h # 定时器扩展
│ │ ├── hal_i2c_ex.c/.h # I2C扩展
│ │ └── hal_rtos_wrapper.c/.h # RTOS封装
│ │
│ ├── DRV/ # 设备驱动层
│ │ ├── drv_heater.c/.h # 加热器驱动
│ │ ├── drv_temp_sensor.c/.h # 温度传感器
│ │ ├── drv_pressure_sensor.c/.h # 压力传感器
│ │ ├── drv_flow_sensor.c/.h # 流量传感器
│ │ ├── drv_keypad.c/.h # 按键扫描
│ │ ├── drv_display.c/.h # 显示屏驱动
│ │ ├── drv_motor.c/.h # 电机驱动
│ │ ├── drv_valve.c/.h # 电磁阀控制
│ │ ├── drv_buzzer.c/.h # 蜂鸣器
│ │ ├── drv_led.c/.h # LED指示灯
│ │ ├── drv_flash.c/.h # Flash存储
│ │ └── drv_wifi.c/.h # WiFi模块
│ │
│ ├── SRV/ # 服务层
│ │ ├── srv_scheduler.c/.h # 任务调度器
│ │ ├── srv_storage.c/.h # 存储服务
│ │ ├── srv_temperature.c/.h # 温度控制服务
│ │ ├── srv_pressure.c/.h # 压力控制服务
│ │ ├── srv_flow.c/.h # 流量控制服务
│ │ ├── srv_network.c/.h # 网络服务
│ │ ├── srv_alarm.c/.h # 告警服务
│ │ ├── srv_power.c/.h # 电源管理
│ │ └── srv_recipe.c/.h # 配方服务
│ │
│ ├── APP/ # 应用层
│ │ ├── app_brew_control.c/.h # 咖啡冲泡控制
│ │ ├── app_user_interface.c/.h # 用户界面处理
│ │ ├── app_network_handler.c/.h # 网络指令处理
│ │ ├── app_error_handler.c/.h # 异常处理
│ │ ├── app_power_manager.c/.h # 电源管理逻辑
│ │ └── app_recipe_manager.c/.h # 配方管理
│ │
│ └── ENT/ # 入口层(整合到CubeMX main.c)
│ ├── ent_main_ex.c/.h # 主程序扩展
│ ├── ent_init.c/.h # 初始化模块
│ └── ent_version.h # 版本信息
│
├── Config/ # 配置文件
│ ├── FreeRTOSConfig.h # FreeRTOS配置
│ ├── lwipopts.h # lwIP配置
│ └── mcu_config.h # MCU特定配置
│
└── Docs/ # 文档
├── README.md # 项目说明
├── Architecture.md
├── API_Reference.md
└── Hardware_Spec.md
分层架构图
┌───────────────────────────────────────────────────────────────────────────────┐
│ 0. 通用基础服务层(Common Base Service Layer)—— 文件夹缩写:Common │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:全系统共用的"通用语言",所有层(ENT/APP/SRV/DRV/HAL)均可依赖 │
│ 包含文件及内容: │
│ • base.h:数据类型别名、常量、宏、枚举 │
│ • 工具函数 │
└───────────────────────────────────────────────────────────────────────────────┘
▲ ▲ ▲ ▲ ▲
│ │ │ │ │
(ENT依赖) (APP依赖) (SRV依赖) (DRV依赖) (HAL依赖)
│ │ │ │ │
┌───────┴───────────────┴───────────────┴───────────────┴───────────────┴───────┐
│ │
│ 1. 入口层 (Entry Layer) —— 文件夹缩写:ENT │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:系统启动入口,统一初始化流程,启动调度器 │
│ 依赖:APP层接口 + SRV层调度服务 + Base层定义 │
│ 函数示例(层级名_大驼峰): │
│ • ENT_Main():程序主入口,返回BaseInt32 │
│ • ENT_InitAllLayers():按顺序初始化(BASE→HAL→DRV→SRV→APP) │
│ • ENT_StartScheduler():调用SRV_RunSched()启动任务调度 │
│ 包含文件:ent_main.c、ent_init.c │
└───────────────────────────┬───────────────────────────────────────────────────┘
│(调用/初始化)
┌───────────────────────────▼───────────────────────────────────────────────────┐
│ 2. 应用层 (Application Layer) —— 文件夹缩写:APP │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:实现咖啡机具体业务逻辑(用户场景相关) │
│ 依赖:SRV层服务接口 + Base层定义(类型/常量/错误码) │
│ 函数示例: │
│ • APP_BrewStart(BaseUint8 coffeeType):启动咖啡制作 │
│ • APP_HandleKeyInput():解析按键输入 │
│ • APP_UpdateDisplay(char* status):更新显示屏 │
│ • APP_HandleRemoteCmd(BaseUint8* cmd):处理远程指令 │
│ • APP_HandleError(BaseErrCode err):异常处理 │
│ 包含文件:app_brew.c、app_ui.c、app_net.c │
└───────────────────────────┬───────────────────────────────────────────────────┘
│(调用SRV层接口)
┌───────────────────────────▼───────────────────────────────────────────────────┐
│ 3. 服务层 (Service Layer) —— 文件夹缩写:SRV │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:提供通用服务能力(跨业务复用,与硬件无关) │
│ 依赖:DRV层驱动接口 + Base层定义(宏/错误码) │
│ 函数示例: │
│ • SRV_RegisterTask(void (*task)(void), BaseUint32 periodMs):注册周期任务 │
│ • SRV_RunSched():任务调度器 │
│ • SRV_SaveConfig(BaseUint8* config, BaseUint16 len):保存配置 │
│ • SRV_RunTempCtrl():温度PID控制 │
│ • SRV_WifiSendMqtt(char* topic, BaseUint8* data, BaseUint16 len):MQTT发送 │
│ 包含文件:srv_sched.c、srv_storage.c、srv_temp.c │
└───────────────────────────┬───────────────────────────────────────────────────┘
│(调用DRV层接口)
┌───────────────────────────▼───────────────────────────────────────────────────┐
│ 4. 设备驱动层 (Device Driver Layer) —— 文件夹缩写:DRV │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:封装设备级功能(硬件设备的标准化控制) │
│ 依赖:HAL层硬件接口 + Base层定义(类型/断言宏) │
│ 函数示例: │
│ • DRV_SetHeaterPower(BaseUint8 power):调节加热器功率 │
│ • DRV_ReadTemp(BaseFloat* temp):读取温度 │
│ • DRV_ScanKey():按键扫描 │
│ • DRV_FlashWrite(BaseUint32 addr, BaseUint8* data, BaseUint16 len):Flash写入 │
│ 包含文件:drv_heater.c、drv_sensor.c、drv_storage.c │
└───────────────────────────┬───────────────────────────────────────────────────┘
│(调用HAL层接口)
┌───────────────────────────▼───────────────────────────────────────────────────┐
│ 5. 硬件抽象层 (HAL) —— 文件夹缩写:HAL │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:直接操作MCU硬件,提供寄存器级标准化接口(屏蔽硬件差异) │
│ 依赖:MCU硬件平台 + Base层基础类型/宏 │
│ 函数示例: │
│ • HAL_SetGpioPin(BaseUint8 pin, BaseBool level):设置GPIO电平 │
│ • HAL_InitUart(BaseUint8 uartId, BaseUint32 baudrate):初始化串口 │
│ • HAL_ReadAdc(BaseUint8 adcId, BaseUint16* value):读取ADC原始值 │
│ • HAL_SetPwmDuty(BaseUint8 pwmId, BaseUint8 duty):设置PWM占空比 │
│ 包含文件:hal_gpio.c、hal_uart.c、hal_adc.c │
└───────────────────────────┬───────────────────────────────────────────────────┘
│(直接操作硬件资源)
┌───────────────────────────▼───────────────────────────────────────────────────┐
│ 6. MCU硬件平台 (MCU Hardware) —— 文件夹缩写:MCU │
├───────────────────────────────────────────────────────────────────────────────┤
│ 核心职责:提供物理硬件资源(处理器/外设/存储器等) │
│ 包含: │
│ • 处理器:Cortex-M4(如STM32F407)、NVIC中断控制器、DMA │
│ • 外设:GPIOx、TIMx(定时器)、USARTx、I2Cx、SPIx、ADCx、PWM │
│ • 存储器:512KB Flash、128KB RAM、AT24C02(EEPROM) │
│ • 时钟/电源:8MHz晶振、PLL、低功耗模式、LDO(3.3V) │
└───────────────────────────────────────────────────────────────────────────────┘
依赖关系图
ENT(入口层) ← APP(应用层) ← SRV(服务层) ← DRV(设备驱动层) ← HAL(硬件抽象层) ← MCU ↓ ↓ ↓ ↓ ↓ Common ←─────── Common ←────── Common ←────── Common ←────── Common (通用基础层)
设计原则
-
单向依赖: 上层只能依赖直接下层,不能跨层依赖
-
接口隔离: 每层通过明确定义的接口与相邻层交互
-
业务分离: 业务逻辑集中在APP层,硬件操作下沉到DRV和HAL层
-
复用性: SRV层提供可复用的服务组件
-
可移植性: 通过HAL层屏蔽硬件差异,便于移植到不同MCU平台
更多推荐
所有评论(0)