嵌入式软件架构规范之 - 分层设计

一、规范的核心思想:驱动文件的“独立性”与“复用性”

该规范的本质是通过分层隔离,实现驱动代码的高复用性、低耦合性,确保驱动模块仅关注“硬件操作逻辑”,不依赖上层业务或下层硬件接口的具体实现细节。其核心要求包括:

二、关键要点解析

1. 驱动文件不能包含应用层内容
  • 应用层定义:指与具体业务逻辑相关的代码(如业务状态机、数据处理逻辑、通信协议解析等)。
  • 原因
    • 驱动是“硬件操作的抽象层”,应专注于控制硬件(如GPIO读写、SPI通信时序),而非处理业务数据。
    • 若驱动包含应用层逻辑,会导致驱动与特定业务强绑定,无法在其他项目中复用。
  • 举例
    • 错误示范(驱动包含应用层逻辑):
      // 驱动文件(错误):在LED驱动中处理“按键状态→LED亮灭”的业务逻辑
      void LED_Driver_Process(void) {if (Key_GetState() == PRESS) {  // 调用应用层的按键状态获取函数LED_On();} else {LED_Off();}
      }
      
    • 正确示范(驱动仅封装硬件操作):
      // 驱动文件(正确):仅提供LED的硬件控制接口
      void LED_Init(void) {// 初始化GPIO引脚为输出模式
      }
      void LED_On(void) {// 写寄存器使LED点亮
      }
      void LED_Off(void) {// 写寄存器使LED熄灭
      }
      
    • 应用层调用驱动(业务逻辑与驱动分离):
      // 应用层文件:独立处理按键与LED的逻辑
      void App_Main(void) {while (1) {if (Key_Detect()) {  // 应用层自己处理按键检测LED_On();  // 调用驱动提供的接口} else {LED_Off();}}
      }
      
2. 驱动文件不能包含底层接口定义
  • 底层接口定义:指直接操作硬件寄存器的函数或宏(如寄存器地址定义、寄存器位操作等)。
  • 原因
    • 底层接口与具体芯片型号强相关(如STM32的寄存器地址 vs. 瑞萨的寄存器地址),若驱动依赖底层接口,会导致驱动无法跨芯片平台复用。
    • 应通过“硬件抽象层(HAL)”或“芯片适配层”隔离底层差异,驱动仅调用抽象后的接口。
  • 举例
    • 错误示范(驱动直接操作底层寄存器):
      // 驱动文件(错误):直接使用STM32的寄存器地址
      #define LED_GPIO_PORT GPIOA
      #define LED_GPIO_PIN GPIO_PIN_5
      void LED_On(void) {LED_GPIO_PORT->BSRR = LED_GPIO_PIN;  // 直接操作STM32的寄存器
      }
      
    • 正确示范(驱动调用底层抽象接口):
      // 底层抽象层(芯片适配层),提供统一接口
      // hal_gpio.h
      void HAL_GPIO_Write(GPIO_TypeDef* port, uint16_t pin, GPIO_State state);// 驱动文件(正确):通过抽象接口操作硬件
      void LED_On(void) {HAL_GPIO_Write(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_HIGH);  // 调用抽象接口
      }
      
    • 底层实现(以STM32为例)
      // hal_gpio.c(STM32适配)
      void HAL_GPIO_Write(GPIO_TypeDef* port, uint16_t pin, GPIO_State state) {if (state == GPIO_HIGH) {port->BSRR = pin;} else {port->BSRR = (uint32_t)pin << 16;  // BRR寄存器操作}
      }
      

三、分层架构示意图

应用层(业务逻辑)
├─ 调用驱动接口(如LED_On())
│
驱动层(硬件操作抽象)
├─ 调用底层抽象接口(如HAL_GPIO_Write())
│
底层适配层(芯片相关)
└─ 直接操作寄存器(如STM32的GPIO寄存器)

四、遵循规范的优势

  1. 驱动复用性最大化
    • 同一驱动(如LED驱动)可直接用于STM32、瑞萨、ESP32等不同芯片平台,只需修改底层适配层。
  2. 维护成本降低
    • 硬件变更时(如更换芯片型号),只需修改底层适配层,驱动层和应用层代码无需改动。
  3. 分工清晰
    • 驱动开发人员专注于硬件操作逻辑,应用开发人员专注于业务逻辑,底层开发人员专注于芯片适配,提高协作效率。

五、常见反例与修正

反例场景错误代码(驱动文件)修正后代码(驱动文件)
驱动包含业务逻辑void LCD_ShowData(int data)
(直接处理数据格式化)
void LCD_DrawPixel(int x, int y)
(仅提供画点接口,数据格式化由应用层处理)
驱动依赖具体芯片寄存器#define UART_DR (*(volatile uint32_t*)0x40013804)调用 HAL_UART_Transmit(&huart1, buf, len, timeout)
(通过HAL库抽象接口)

六、总结

该规范是嵌入式软件“分层设计”的核心原则之一,核心目标是通过驱动层→底层适配层→应用层的解耦,实现“一次编写,多平台复用”的驱动代码。实际开发中,可结合具体项目需求,通过硬件抽象层(HAL)或板级支持包(BSP)实现底层接口的隔离,确保驱动模块的独立性和可移植性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/80896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt5绘图全攻略:QPainter、QPen、QBrush与QPixmap详解

摘要&#xff1a;掌握PyQt5绘图核心控件&#xff0c;轻松实现窗体绘图、文字渲染、几何图形绘制及图像加载。本文附带完整代码示例与效果图&#xff0c;助你快速上手GUI图形开发。 绘图基础&#xff1a;为什么需要这些控件&#xff1f; 在GUI开发中&#xff0c;绘图功能是数据…

C++学习:六个月从基础到就业——多线程编程:std::thread基础

C学习&#xff1a;六个月从基础到就业——多线程编程&#xff1a;std::thread基础 本文是我C学习之旅系列的第五十四篇技术文章&#xff0c;也是第四阶段"并发与高级主题"的第一篇&#xff0c;介绍C11引入的多线程编程基础知识。查看完整系列目录了解更多内容。 引言…

【计算机网络】TCP如何保障传输可靠性_笔记

文章目录 一、传输可靠性的6方面保障二、分段机制三、超时重传机制四、流量控制五、拥塞控制 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 源网站 按TCP/IP 4层体系&#xff0c;TCP位于传输层&#xff0c;为应用层提供服务 一、传输可靠性的6方面保障…

2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展

文章目录 1. 美化 Powershell 缘起2. 安装 oh-my-posh 和 posh-git3. 安装文件夹美化主题【可选】 1. 美化 Powershell 缘起 背景&#xff1a;用了 N 年的 Windows 系统突然觉得命令行实在太难用了&#xff0c;没有补全功能、界面也不美观。所以&#xff0c;我决定改变它。但是…

基于Mongodb的分布式文件存储实现

分布式文件存储的方案有很多&#xff0c;今天分享一个基于mongodb数据库来实现文件的存储&#xff0c;mongodb支持分布式部署&#xff0c;以此来实现文件的分布式存储。 基于 MongoDB GridFS 的分布式文件存储实现&#xff1a;从原理到实战 一、引言 当系统存在大量的图片、…

【Linux】Linux安装并配置Redis

目录 1.安装 2.启动服务 3.配置 3.1.绑定地址 3.2.保护模式 3.3.持久化选项 3.3.1.RDB 持久化 3.3.2.AOF 持久化 3.3.3.如何选择 1.安装 Redis 可以从默认的 CentOS 软件仓库中安装。运行以下命令来安装 Redis sudo dnf install redis -y 响应如下 2.启动服务 安装完成后&…

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据&#xff0c;对数据进行处理&#xff0c;然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据&#xff0c;matplotlib 生成图表&#xff0c;并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…

黑马点评相关知识总结

黑马点评的项目总结 主要就黑马点评项目里面的一些比较重要部分的一次总结&#xff0c;方便以后做复习。 基于Session实现短信登录 短信验证码登录 这部分使用常规的session来存储用户的登录状态&#xff0c;其中短信发送采取逻辑形式&#xff0c;并不配置云服务验证码功能。…

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中&#xff0c;总共有一百四十四张牌&#xff0c;这些牌被分为多个类别&#xff0c;每个类别又包含了不同的牌型。具体来说&#xff0c;麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中&#xff0c;包含有万子、条子和筒子&#xff0c;每种花色…

【Java高阶面经:数据库篇】17、分库分表分页查询优化:告别慢查询与内存爆炸

一、分库分表基础&#xff1a;策略与中间件形态 1.1 分库分表核心策略 分库分表是应对海量数据存储和高并发访问的关键架构设计&#xff0c;其核心在于将数据分散到不同的数据库或表中&#xff0c;以突破单库单表的性能限制。常见的分库分表策略包括&#xff1a; 1.1.1 哈希…

贪心算法之跳跃游戏问题

问题背景 本文背景是leetcode的一道经典题目&#xff1a;跳跃游戏&#xff0c;描述如下&#xff1a; 给定一个非负整数数组 nums&#xff0c;初始位于数组的第一个位置&#xff08;下标0&#xff09;。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…

Label Studio:开源标注神器

目录 一、Label Studio 是什么&#xff1f; 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…

创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k

在 Java 生态中&#xff0c;HttpClient 和 Feign 都是调用第三方接口的常用工具&#xff0c;但它们的定位、设计理念和使用场景有显著差异。以下是详细对比&#xff1a; DIFF1. 定位与抽象层级 特性HttpClientFeign层级底层 HTTP 客户端库&#xff08;处理原始请求/响应&#…

从零基础到最佳实践:Vue.js 系列(7/10):《常用内置 API 与插件》

引言 Vue.js 是一款轻量且强大的前端框架&#xff0c;因其易用性和灵活性受到广泛欢迎。无论是初学者还是资深开发者&#xff0c;都可以通过其内置 API 和插件生态快速构建高效、可维护的 Web 应用。本文将从基础用法讲起&#xff0c;逐步深入到进阶技巧&#xff0c;结合大量实…

线性代数:AI大模型的数学基石

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

Java-System工具类深度解析

Java-System工具类深度解析 前言一、System 类概述1.1 基本定义与特点1.2 重要成员变量 二、标准输入输出功能2.1 标准输入&#xff08;System.in&#xff09;2.2 标准输出&#xff08;System.out&#xff09;2.3 标准错误输出&#xff08;System.err&#xff09; 三、系统属性…

删除用户凭证

Git 部分仓库无法操作&#xff0c;部分仓库没问题 问题出现 我用个人电脑修改了项目&#xff0c;提交了git。然后第二天在公司电脑git pull的时候失败&#xff0c;只有部分仓库&#xff0c;git colne直接失败&#xff0c;部分仓库无问题。 解决方式 删除git相关凭证&#xff…

19. 结合Selenium和YAML对页面实例化PO对象改造

19. 结合Selenium和YAML对页面实例化PO对象改造 一、架构升级核心思路 1.1 改造核心目标 # 原始PO模式&#xff1a;显式定义元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式&#xff1a;动态属性访问 self.username.send_keys(Tester) # 自动触发元素定…

鸿蒙App开发学习路径

以下是一份系统的鸿蒙&#xff08;HarmonyOS&#xff09;App开发学习路径&#xff0c;适合从零开始逐步掌握相关技能&#xff1a; 1. 基础知识储备 1.1 理解鸿蒙系统 鸿蒙核心特性&#xff1a;分布式能力、一次开发多端部署、原子化服务、ArkUI框架。与Android/iOS的区别&…

spring boot启动报错:2002 - Can‘t connect to server on ‘192.168.10.212‘ (10061)

错误代码 10061 通常表明无法建立到指定服务器的网络连接。这个错误属于 Windows Sockets 错误代码&#xff0c;具体指的是无法建立网络连接&#xff0c;通常是因为目标地址不可达。以下是一些解决此问题的步骤&#xff1a; 检查 IP 地址和端口&#xff1a; 确保你输入的 IP …