嵌入式软件架构的设计

article/2025/9/14 14:58:33

嵌入式软件架构的设计

大多数嵌入式程序员学习编程,都是从开发板的附带例程开始。之后工作也会继续参考那些例程,很多编程习惯、方式也会受之影响。

其实开发板式的编程方式与工作中实际需求的并不完全一致。

开发板的通常卖给初学者,注重“即插即用”,兼容各种模块,讲究功能的全面而不讲究性能、效率、成本、功耗等。很多时候为了兼容各种型号IC或者显示屏之类,程序累赘,逻辑混乱。开发板的程序往往是一个人完成,不需要讲究多人合作,这也影响了其编程方式。

实际工作中,开发一款产品,需要讲究成本(物料,开发,加工),稳定性,功耗(比如电池产品)。通常,由于项目开始的时候,往往没有明确的需求,或者在确认需求后却由于种种原因多次更改需求,为了更好的开发,编程方式更侧重于程序的移植性(需求变化可能导致更改MCU等),可读性(换人还能快速接手),稳健性。

当一个项目变得复杂,代码量很大时,往往需要一个良好的软件架构。否则很容易造成程序逻辑混乱,顾此失彼,移植困难,灵活性差。

一、分层

对软件进行分层,容易实现高内聚低耦合。

分层的原则有:1单向逐层调用;2针对接口编程;3依赖倒置;4封装变化。

分层数目,太多会导致产生不必要的开销,太少又会导致系统分离不够,结构不合理。

下图为安卓系统的软件层次体系

二、三层架构

回顾一下,软件开发流程一般为分为下面若干阶段:需求分析,概要设计,详细设计,编码,测试,交付验收,维护。

这里必须明白一点,包含单片机开发的项目一般都不会是纯粹的软件项目,甚至单片机软件本身都不一定是项目最重要的一部分。此类项目一般还会包括机械结构设计,平面设计,交互设计等等。

一个项目的生命周期,一般由四个主要阶段构成:概念阶段,定义阶段、开发阶段和结束阶段。

嵌入式软件工程师,通常会在定义阶段开始参与,协助主管做项目可行性分析。立项之后,再作需求分析。然而问题往往出现在这里:需求不明确,或者需求随意更改。这里不要说什么职责,责任范围,问责之类,毕竟理论是一回事,实际又是一回事。比如老板空降一个特别需求,主管也只能往下扔,你倒是敢向老板问责?

所以,为了更好地完成任务,一个灵活而合适的软件架构,是非常必须的。

一般使用单片机(比如STM32)开发的项目,分层数目为3比较合适。从下到上,分别为硬件驱动层(底层)、模块功能层(中间层)、业务逻辑层(顶层)。

硬件驱动层:包括MCU片内资源驱动代码与外部各类IC的底层驱动代码,MCU片内驱动代码与IC驱动代码最好也能各自保持独立。向上提供API接口。

模块功能层:隔离顶层与底层,实现与提供顶层所需的API接口。

业务逻辑层:具体业务逻辑代码,也可以说是应用层。

构建工程文件时,为各层建立单独文件夹,而MCU库,操作系统代码,文件系统代码,USB库,GUI系统代码等等独立部件也要单独设立文件夹。这有利于需要时方便地更换或者删除、添加。

在编程时,要遵循上面的几个分层原则。分层有时会导致性能下降,对性能要求高的关键地方,可灵活运用函数指针,内联,甚至函数别名减少开销。

假设,一个项目原本只需要显示静态图片,后来需求更改,还需要播放视频。之后选择修改方案:更换MCU,使用更大外置存储器。

那么,1.底层,我们只需要将原来的MCU相关代码与存储器IC驱动替换掉。2.中间层,添加视频播放相关API函数。

这样原来的代码大多还能复用,节省不少时间。

假如需求不变,只是更换一些功能IC(比如考虑成本,或者断货,或者新出的更好IC),甚至只需要更换硬件驱动层相关 IC文件即可。

三、举例

下面以一个实际项目为例做参考。

某项目用到显示屏显示网络数据。以显示模块为例,解析3层架构的运用。假设显示屏驱动为st7789,MCU采用FSMC方式st7789,定时器pwm控制背光。

下面只是说明显示模块部分。

1.硬件驱动层(底层):两个c文件以及对应头文件:单片机内部资源驱动文件mcu_bsp_drv.c,st7789驱动文件lcd_drv.c 。

mcu_bsp_drv.c,包括所有的各个功能模块所需要的MCU资源的初始化驱动代码,并且每个模块只用一个函数并且以_mcu_init结尾。这类函数一般只用一次,不要怕又臭又长,但必须要有详细的注释说明。显示模块初始化函数命名为lcd_mcu_init();

lcd_drv.c,这实际上是st7789的驱动文件,为什么不命名为st7789.c呢?因为如果更换了驱动IC,也不需要修改中间层的头文件包含代码。对于显示模块,一般需要提供一下接口:初始化函数,画点函数,单色方块填充函数,数据填充函数,显示打开关闭函数,背光控制函数。命名方式为lcd_drv_xxx()。这些函数在lcd_drv.h中声明,为中间层显式提供API;

2.模块功能层(中间层):lcd_api.c以及对应头文件

中间层实现显示相关函数:初始化函数,背光控制函数,各种几何图形(直线,圆,方框等)绘制函数,各种控件(窗口,按钮等)绘制函数,假如使用了第三方GUI系统,这些就不需要自己实现了。

3.业务逻辑层(顶层):这一层与具体业务有关,也是程序员最花时间与精力的一部分。如果业务复杂,还可以细化分层。


http://chatgpt.dhexx.cn/article/N5olajdW.shtml

相关文章

嵌入式软件设计(stm32快速上手)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 有很多的培训机构在培训嵌入式的时候,一上来会讲很多的理论知识。其实这个时候要是能通过实操帮助学员快速入门、快速上手、快速看到效果,或许这才是最重要的。 1、安装mdk软件 类…

举例说明嵌入式框架该如何分层

关注、星标公众号,直达精彩内容 素材来源:https://blog.csdn.net/weixin_46185705/article/details/122536374 整理:技术让梦想更伟大 | 李肖遥 前言 为了能够使得产品得到更好的开发速度与以后更好的迭代和移植,框架分层是很有必…

嵌入式软件架构设计

如何设计一个好的软件架构,如何提高软件的扩展性,移植性,复用性和可读性? 很多做嵌入式开发的朋友经常会遇到这种情况:一个项目软件设计完成了,客户提出了一些新的功能需求。这时侯如果客户新需求不多&…

《嵌入式软件设计方法》--设计原则

设计原则(SOLID) 使用各个原则的首字母组成了一个单词:SOLID。 SRP:Single Responsibility Principle,单一职责原则;OCP:Open Closed Principle,开闭原则;LSP:Liskov Substitution Principle,…

嵌入式软件设计之设计模式

文章目录 前言1.设计模式之适配器模式2.设计模式之单例模式3.设计模式之命令模式4.设计模式之门面模式 前言 在嵌入式软件设计过程中,也会用到一些设计模式,所以说设计模式并不是面向对象语言的专利,下面我通过查资料以及自己的思考总结的几…

2、【已解决】Oracle错误问题(ORA-03113)

在执行一条sql时出现了如下问题: 处理方案网上找了一下日志,说是备份日志满了的原因; 通过以下方法看了下错误日志信息: 1、export TIME_STYLE%Y-%m-%d %H:%M:%S #格式化文件日期,便于查找错误文件 2、sqlplus &qu…

搭建ADG过程中复制报错 RMAN-03009 ORA-03113

搭建ADG过程中复制报错 RMAN-03009 ORA-03113 猜测主备之间网络路由过多导致。。。 开启mrp进程报错 发现数据文件是主库ASM的路径,备库是单机的 switch database to copy; 报错RMAN-6571 report schema;switch database to copy; select name from v$datafile;s…

oracle 启动报错03113,oracle数据库无法启动,总报ora-03113错误

虚机上装的oracle,由于系统突然宕机,导致了以下问题: 问题: 1、监听无法启动: $ lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 22-NOV-2018 15:27:11 Copyright (c) 1991, 2013, Oracle. Al…

oracle 启动报错03113,Oracle 入门之Oracle启动报错“ORA-03113”

Oracle 入门之Oracle启动报错“ORA-03113” [日期:2010-09-25] 来源:Linux社区 作者:naruto6006 [字体:大 中 小] 早上连接Oracle,发现oracle无法正常工作,无法shutdown immediate方式关闭,shutdown abort方…

linux oracle 03113,Oracle数据库关闭时出现ORA-03113错误

Oracle数据库关闭时,出现ORA-03113错误: SQL> shutdown immediate ORA-03113: end-of-file on communication channel Process ID: 3437 Session ID: 125 Serial number: 5 SQL> startup ORA-24324: service handle not initialized ORA-01041: in…

oracle startup open ora 03113,oracle宕机,startup报错ora03113

一、故障情况 应用无法连接数据库,检查oracle发现已经宕机。 startup 后报错 ORA-03113: end-of-file on communication channel 二、查找原因 查看alter日志 tail -500 /oracle/database/oracle/diag/rdbms/udb/udb1/trace/alter_UDB1.log Unable to create archiv…

ora03113通信通道的文件结尾 会话id 149 序列号 3

ORA-19815: 警告: db_recovery_file_dest_size 字节 已使用100.00%, 尚有 0 字节可用。” 是db_recovery_file_dest_size也叫归档日志空间不足导致 解决方法 第一步,将空间设置大点,另一个就是将多余的文件删除掉即可,那么我们就将这两个办法…

ORA-03113:通信通道的文件结尾

转自--------------http://blog.csdn.net/zwk626542417/article/details/39667999 由来 今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去…

ORA-03113:通信通道的文件结尾-完美解决方案

今天发现系统登录和查询数据特别慢,orcl进程占用内存也特别高。打开程序调试用,存储过程调用时报错【ORA-03113:通信通道的文件结尾】 解决方案: oracle 文档中对这个错误这样解释: ORA-03113 错误就是说连接到数据…

ORA-03113: 通信通道的文件结尾

一、报错及错误原因 启动oracle数据库事报错:ORA-03113: 通信通道的文件结尾,报错内容如下图 出现问题后,去查看告警日志文件(D:\app\diag\rdbms\cjyorcl\cjyorcl\trace\alert_cjyorcl.log),日志报错内容如…

TinyPng:在线PNG图片压缩工具

本资源由 伯乐在线 - 卢伟 整理 TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具,只需要简单的两步就可以完成对PNG图片的高压缩而且还不会影响PNG图片的质量,这样就可以解决网页设计师因图片太大而影响网站加载网页速度的难题。 …

在线PNG图片压缩工具推荐——TinyPng

日常开发工作中时常需要对PNG图片压缩,今天推荐大家一个在线的图片压缩工具,ThinyPng 在线地址:TinyPNG – Compress WebP, PNG and JPEG images intelligently TinyPng:在线PNG图片压缩工具是一款可以帮助网页设计师们优化图片的工具&#x…

Image 图片

Image 图片 随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像。这里打印出的是纯粹的数字,而非自然图像。下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。 import matplotlib.pyplot as plt import numpy as npa np.array([0.…

libpng 处理png图片

尝试 最近遇到一个需求需要处理png 图片,由于处理过bmp 图片,所以想跟bmp 图片的处理过程一样直接去掉头信息,但是发现解开png之后发现头信息中数据长度和实际的的,data 数据量对不上,发现数据是压缩,跟bm…