【嵌入式项目应用】__单片机STM32有什么好的裸机程序架构思路推荐?

news2025/1/22 21:43:11

目录

前言

没设计好程序架构,根本做不稳定。

按照我的思维,我会这样去设计程序:

那这样的好处是什么? 

(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 


前言

在我刚出来的时候,都没有程序架构的概念,基本一个while死循环干到底。

模块之间也没有封装好,导致代码写好以后,扩展性和维护性太差,类似的功能代码,也很难移植到新项目去复用。

早期我也是这样写的,反正实现功能就行了,代码好不好,功能上又看不出区别。

不过,等你接触到复杂的项目时,这招就行不通了。

没设计好程序架构,根本做不稳定。

我意识到这个问题,是碰到两种需求的时候:

  1. 是做一个 基于STM32的网关项目 ,项目做完以后,客户老是要改功能,客户不懂技术,在客户眼里,觉得改一个LED闪烁效果很简单,但对于程序架构没设计好的工程师来说,就是一个噩梦,比如 每隔5秒快闪2次 这种恶心的需求,搞不好很多代码都要重新组织。我经常会被这种问题搞到头痛,特别是客户又催得急的时候,经常加班加到焦头烂耳,越急又越搞不出来。
  2. 我做过的很多项目,其实很多功能都有重复的,比如很多产品都有 LED按键掉电参数存储串口协议解析 等等。但是程序架构没写好,导致想移植代码,过来新项目复用时,不太好改,比如老项目才1个LED,新项目有6个LED,类似的还有按键等等。后面为了有更多的时间摸鱼,我开始思考,怎么把程序写得,改起功能来很方便,代码复用性又很强那种,当时还不知道这个叫 程序架构设计

程序架构,我觉得是一个系统的学问,贯穿着整个项目,而不是具体某些细节

就是各种功能模块,比如LED特效功能,按键检测功能,菜单功能,系统参数存储功能、语音功能、OTA升级功能等等。

这些功能模块的设计,我通常是采用硬件驱动代码和功能逻辑代码分离的方式,用大白话来说,就是一个功能模块,我可能会分2个.c文件来写,硬件驱动代码我以hal_xxx.c命名,功能逻辑代码我以mt_xxx.c命名。

硬件驱动代码主要是和单片机外设的配置代码,比如设置 GPIOTimer串口SPI 这些,然后提供硬件接口给 mt_xxx.c 调用。

拿无际项目特训营的项目6来举例,这个项目可以实现远程控制,因为加了WiFi和4G模块。

如果你接触过类似项目,单片机和云平台之间,其实还有个串口通讯协议的,类似于下图这种。

按照我的思维,我会这样去设计程序:

单片机外设驱动的配置、串口发送数据、接收数据代码,我都放在 hal_uart.c 里。

串口协议数据发送和解析的代码,我会放在 mt_protocol.c 文件里。 

这样就能实现硬件驱动代码和功能逻辑代码彻底分离。

那这样的好处是什么? 

  1. 万一要换单片机了,如果通讯协议不变的情况下,mt_protocol.c文件代码可以不用改,只要改hal_uart.c硬件驱动程序,就能对接起来。
  2. 如果通讯协议格式变了,单片机不变,那只需要改mt_protocol.c文件代码就可以了。
  3. 调试方便,比如mt_protocol.c的功能,可以在PC上搭建一个开发环境先调试好,再对接硬件驱动接口,对于复杂的功能,这招还是很有用的,毕竟keil仿真调试没那么方便灵活。

这种设计,就是一种架构思维,解决了代码扩展性和移植性的问题

如果每个功能模块都采用这种思维去设计,最终从整体看,你的程序架构就非常好了,就像组装汽车一样灵活了。

所以,要设计好程序架构,真的不是靠一个课程能搞定的,需要完整地做几个复杂的项目,并且有资深工程师的思路和代码,可以参考和借鉴,这样才能高效,系统地掌握

每个功能模块都设计好以后,最后还需要有一个协调者。

类似于人的大脑,去协调手、脚、眼睛、耳朵、嘴巴。

这个大脑,一般就是程序的"地基",类似于RTOS,就是"协调者"身份,负责调度协调整个项目的各个功能模块。

RTOS本质也是一种程序架构,但是我很少用,因为它的处境,其实很尴尬。

没那么复杂的项目,上RTOS并没有优势,反而为后期调试带来不必要的麻烦,如果对系统不熟悉,就像埋了一个定时炸弹,可能会跑一段时间后死机的现象。

复杂的项目,有些直接上Linux了,现在很多国产芯片,成本也能做得很低。

所以,现在rtos的应用,我觉得主要集中在中等复杂的项目,要求实时性很高,同时工程师,又不具备设计程序架构的能力时。

不过,至今为止,我基本是用自己设计的架构去替代RTOS,目前大多数产品都够用。

 


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。 

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!

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

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

相关文章

Android笔记(十三):结合JetPack Compose和CameraX实现视频的录制和存储

在“Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能”,文中介绍了拍照功能的实现,在本文中将介绍结合JetPack Compose和CameraX实现视频的录制。 新建一个项目 在项…

nn.Embedding()的原理

nn.Embedding()的原理: 定义一个Embedding: embeddings nn.Embedding(num_embeddings10, embedding_dim3)vocab_size : 10 输出维度为: 3 假定输入inputs如下: inputs torch.tensor([[1,3,6, 8],[9,1,3,5] ],dtypetorch.lo…

达索系统SOLIDWORKS Electrical机电一体化协同设计

一秒读懂 SOLIDWORKS Electrical 问题点 电气、机械设计各自为政数据传递困难,存在设计错误 CHALLENGE电气设计面临挑战 问题点:电气、机械设计各自为政数据传递困难,存在设计错误 原理图绘制完毕后,再绘制接线图,人工统计BOM&a…

Valgrind——程序分析工具

目录 Valgrind一.摘要二.安装Valgrind三,简单上手和分析程序1(C程序):使用未初始化的内存程序2(C程序):在内存被释放后进行读/写程序3(C程序): 内存泄露程序4(C程序): 不匹配使用malloc free 和 new delete程序5(C程序): 两次释放内存 四.Qt中使用Valgrind五.内存泄露分析 Valg…

Java学习day12:static关键字,字符串声明,字符串常量池

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) 往期回顾: Java学习day11&…

HBase中的数据表是如何用CHAT进行分区的?

问CHA:HBase中的数据表是如何进行分区的? CHAT回复: 在HBase中,数据表是水平分区的。每一个分区被称为一个region。当一个region达到给定的大小限制时,它会被分裂成两个新的region。 因此,随着数据量的增…

Unity | 运行时显示调试信息

「公众号:游戏开发手记」 1 简介 在 Unity 编辑器中,我们可以通过点击 Stats 按钮来查看 Statistics 面板,这个面板显示了许多关于游戏渲染的信息,如每帧的渲染时间、Tris 和 Verts 的数量、SetPass Calls 的数量等。但在其他运…

Spring6(五):Resources、i18n、Validation

文章目录 7. 资源操作:Resources7.1 Resource接口7.2 Resource的实现类7.2.1 UrlResource访问网络资源7.2.2 ClassPathResource 访问类路径下资源7.2.3 FileSystemResource 访问文件系统资源7.2.4 其他 7.3 Resource类图7.4 ResourceLoader 接口7.5 ResourceLoaderA…

EV代码签名证书

为了增强软件的安全性和可信度,EV代码签名证书(Extended Validation Code Signing Certificate)成为了一种具有最高级别保障的关键工具。 EV代码签名证书是一种由受信任的证书颁发机构(CA)或证书供应商提供的高级别代…

linux之shell

一、是什么 Shell是一个由c语言编写的应用程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言 它连接了用户和Linux内核,让用户能够更加高效、安全、低成本地使用 Linux 内核 其本身并不是内核的一部分&#x…

创建SpringBoot项目后无法运行Java文件的解决方法

目录 1.无法运行 (1)解决方法一 (2)解决方法二 2.包无法下载 (1)查看pom.xml文件中包是否存在的方法 (2)如果仓库存在包的处理方式 1.无法运行 当我们创建好一个SpringBoot项目…

make和makefile

一、认识make和Makefile 1、会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 2、一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译…

借助Spire.Doc for Java控件,将 ODT 转换为 PDF。

在通过电子邮件发送或与其他人共享 ODT 文件之前,您可能需要将该文件转换为 PDF,以便任何人都可以跨多个操作系统访问该文件。在本文中,您将学习如何使用Spire.Doc for Java在 Java 中将 ODT 转换为 PDF。 Spire.Doc 是一款专门对 Word 文档…

中国生态功能保护区shp数据

代码 名称 类型 1 秦岭山地生态功能保护区 水涵养生态功能保护区 2 若尔盖一玛曲生态功能保护区 水涵养生态功能保护区 3 滇西北生态功能保护区 水涵养生态功能保护区 4 珠江源(云南部分)生态功能保护区 水涵养生态功能保护区 5 雅鲁藏布…

什么是游戏盾?怎么进行防护?

一.德迅游戏盾(抗D盾)概述 1.抗D盾是针对游戏行业推出的高度可定制的网络安全解决方案,可以针对大型DDoS攻击(T级别)进行有效防御,同时能彻底解决游戏行业特有的TCP协议的CC攻击问题。 2.抗D盾是新一代的智能分布式云接入系统&a…

骨传导蓝牙耳机排行榜,精选五款骨传导耳机推荐!

目前市面上的骨传导耳机大多是传统挂耳式,虽然佩戴更稳固,但是也限制住了其使用场景, 但近两年,有一款名为骨传导耳机的品类进入了大众的视野,它以独特的款式和超乎以往的佩戴舒适性迅速圈粉无数,并成为当下…

第一讲之递归与递推下篇

第一讲之递归与递推下篇 带分数费解的开关飞行员兄弟翻硬币 带分数 用暴力将所有全排列的情况都算出来 > 有三个数,a,b,c 每种排列情况,可以用两层for循环,暴力分为三个部分,每个部分一个数 当然注意这里,第一层fo…

【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

前言 我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 文章目…

关于CISSP中文版计算机化自适应考试(CAT),你需要知道的!

进入ISC2宣布CISSP简体中文的线性考试(Linear Test)被取消,逐步实行CISSP中文版计算机化自适应考试(CAT)。接下来我根据ISC2官网和互联网中关于CAT相关信息,给大家对CISSP认证CAT进行介绍。 一、什么是CISSP认证线性考试&#xf…

实时云渲染技术在智慧园区中的广泛应用

智慧园区是指通过运用先进的信息技术,利用物联网、大数据、云计算等技术手段,来实现对园区内各类设备、设施和资源进行监测、管理、控制和优化的平台。这一概念旨在提高园区运行的效率、实现资源的可持续利用,并通过数字化和智能化手段来推动…