单片机开发项目全局变量太多怎么管理?

2023-05-16

转载于无际:https://blog.csdn.net/weixin_43982452/article/details/121387105?spm=1001.2014.3001.5502
大家好,我是无际。

最近有几个小伙伴反映说自己写程序感觉很乱,不知道怎么去规划,想到什么就写什么,全局变量满天飞,代码一多就出现好多问题。

而且如果自己写的程序不加注释的话,过几个月发现看不懂了。

一个工程师的成长过程,总是惊人地相似,曾经我也和大家一样,一直想解决程序如何写能更好这个问题。

全局变量太多难管理,看起来是个小问题,要想解决其实背后涉及很多东西,否则不如你直接加注释来得更直接。

变量确实要用,你省不了,你只能通过别的方式去规避乱的问题,比如说一些编程技巧和思维

后面经过无数项目洗礼,我个人领悟是:一个程序写得好不好,主要看程序算法程序架构

**先来说说算法好了,**算法不是刚需。

很多新手以为程序要想写得好,跟英语和数学水平有关系。

今天我给大家交个底,并不是,最多数学好算法能做得更优,大多数产品算法都不复杂,单片机能做多复杂的运算是吧?

很多算法,难在前端公式剖析,不管再复杂的项目都好,最后体现在程序里的都是加减乘除,与或等这些简单运算。

举个例子:

请给出能够计算出结果等于8的公式。

不同的人,计算出来的公式可能是不一样的,比如以下几种公式都能实现。

公式1:(1+1)*(2+2);

公式2: 1<<3

很明显,公式2的计算效率更高,主要是体现在汇编指令更少,机器周期自然更短,所以说算法更好。

实际上真正的算法比这个要复杂得多,这里只是举个例子而已。

像这种公式,一般我们在小笔记本上先算好,最后转成用加减乘除之类的公式用程序写出来。

大多数情况,只要产品实时性要求不是特别苛刻的,公式1和公式2你看不出任何区别。

并不是每个行业的产品都需要算法,每个行业的算法肯定也是不一样。

哪怕你数学很差,都没关系,你找个数学厉害的人,告诉他你要算什么。

让他用加减乘除、与、或、移位运算帮你算出一个最佳解题公式,你带入到程序直接用就行了。

所以我们在做产品的时候,不要过度去追求程序执行效率,只要能满足需求就好,并不是刚需。

研究算法是很浪费时间的,通用性也不强,反正就是性价比很低。

下面再来说说程序架构,这个实用性通用性极强

而且可以说不懂架构中大型项目绝对做不来,不是做不好,而是做不来!

可能很多人工程师做了几年,已经碰到了瓶颈期,一直想提升,又无能为力。

比如说,变量多了,函数多了,程序总是乱糟糟的,一整合起来一堆BUG。

这个功能好了,影响了别的功能,改了别的功能,这个功能又不行了。

最后马马虎虎把代码好不容易整合起来实现完整的产品功能了,也没BUG了。

挨千刀的老板又跟你说要改功能,在刚开始做研发那几年,我就最怕增加功能、改功能。

哪怕只是把LED改成每秒闪1次,又或者说增加一个按键这么小的功能,如果架构不好的话,都有可能花上你一周甚至更长。

那程序架构到底是什么?

我认为是一种成熟的编程思维,是经验的总结,比如RTOS就是属于一种程序架构,STM32固件库也是一种程序架构。

不同的人,编写出来的程序架构都不一样,有大的有小的,最重要是够用就好

全局变量多导致程序乱的问题,就可以用程序架构的模块化编程特点来解决。

具体怎么做?

1.以不同的层次不同的文件区分

img

一般在写STM32级别项目,我都会分为两层:硬件层应用层

硬件层主要负责单片机的相关外设配置和一些功能驱动。

拿我们无际单片机编程的wifi报警主机项目来举例。

硬件层有临界管理、喇叭PWM驱动、EEPROM存储、按键检测、LED特效功能、OLED屏驱动、无线数据软解码、定时器矩阵、串口数据收发这些功能。

每个功能都是单独的.c和.h文件,这样更好区分和管理各个不同功能模块代码。

如果把这些都写在一个.c文件里,那涉及的函数和全局变量非常多,很混乱,查找也不方便。

2.我一般会把不同功能模块的全局变量、数组定义到对应的.c文件里。

img

这样定义以后,只要你不搞extern声明,别的.c文件基本是访问不了你这些变量或数组的,一定程度上起到保护的作用。

img

还有一点就是,如果你在不同的.c文件定义了同一个变量名,编译器一般也会报错。

img

还有一种方法,可以解决这种可重名问题,就是用static关键词。

img

这样就明确告诉编译器,我这些数组的作用域仅限于该.c文件,变量也是一样的道理,这样修饰以后你在别的.c文件也可以定义名字一样的变量,两个是相互独立的。

还有一个很重要的细节就是,对于那些不需要给外部调用的函数,我都用static关键词修饰。

img

这样可以增强可读性,方便后期维护,你一看就知道哪些函数是本文件内使用,哪些是外部的接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机开发项目全局变量太多怎么管理? 的相关文章

  • 52个数据可视化图表鉴赏

    文章目录 1 弧线图2 面积图3 箭头图4 条形图5 布林线指标6 箱线图7 气泡地图8 子弹图9 凹凸图10 日历图11 烛台图12 卡通图13 弦图14 分级统计图15 组合图表16 连接地图17 控制图18 南丁格尔玫瑰图19 交叉表
  • 【程序员学理财】不同产业的市场规模

    程序员学理财 不同产业的市场规模 先来了解一些常识 三大产业 第一产业主要指生产食材以及其它一些生物材料的产业 xff0c 包括种植业 林业 畜牧业 水产养殖业等直接以自然物为生产对象的产业 xff08 泛指农业 xff09 第二产业主要指
  • 【程序员学理财】有哪些普通人应该知道的经济学常识?

    文章目录 一 前言二 宏观经济学1 名词定义2 主要内容 三 微观经济学1 名词定义2 研究内容3 对比区别 四 降息降准是什么意思 xff1f 五 一些常用术语1 沉没成本2 边际成本 一 前言 每天我们都在跟 经济 打交道 xff0c
  • 【程序员学理财】汽车行业、手机行业简单了解

    汽车行业 本文章不是专业的解读 xff0c 只是为了让自己对汽车行业建立一个大体的认知 先简单看两个新闻 xff1a 2021年销量出炉 xff0c 中国车企卷翻了 才一年 xff0c 智能车就不再是新势力专利 xff01 当然上面这些是从
  • 【LeetCode刷题日记】1996. 游戏中弱角色的数量

    题目 你正在参加一个多角色游戏 xff0c 每个角色都有两个主要属性 xff1a 攻击 和 防御 给你一个二维整数数组 properties xff0c 其中 properties i 61 attacki defensei 表示游戏中第
  • LEETCODE 编程训练

    转载于 xff1a https coolshell cn articles 12052 html Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题 xff0c 很多人通过刷这些题来应聘一些喜欢面试算法的公司 xff0c
  • 【程序员学理财】零和博弈和对股市的一些了解

    一 零和博弈 零和博弈 xff08 zero sum game xff09 xff0c 又称零和游戏 xff0c 与非零和博弈相对 xff0c 是博弈论的一个概念 xff0c 属非合作博弈 它是指参与博弈的各方 xff0c 在严格竞争下 x
  • C++11新特性之十:enable_shared_from_this

    enable shared from this是一个模板类 xff0c 定义于头文件 lt memory gt xff0c 其原型为 xff1a template lt class T gt class enable shared from
  • 【程序员学理财】曼昆:经济学十大原理,你都了解吗?

    经济学十大原理是哈佛大学经济学教授格里高利 曼昆在其著作 经济学原理 中提出 xff0c 通俗易懂 xff0c 是很多高校经济学考研的指定参考书 很多人觉得经济学一听就是高大上 xff0c 非常深奥 xff0c 其实并不是的 xff0c 今
  • 2022年java学习路线总结

    直接放两个非常好的文章 xff0c 链接如下 xff1a 2021年Java后端开发学习路线 xff08 建议收藏 xff01 xff09 Java后端学习路线图 xff0c 你真的只需要这一张 xff01 最后放一段守护石的 xff1a
  • web服务器与浏览器之间的网络通信过程

    浏览器与web服务器的交互过程 1 浏览器与web服务器的通信原理概述 网络编程 xff08 一 xff09 浅析web服务器与浏览器的实现原理
  • Tomcat部署Web项目的几种方法

    tomcat 部署web项目的四种方法 Tomcat部署Web项目的3种方式
  • 心跳机制详解

    心跳机制 心跳机制详解 什么是TCP心跳机制
  • 学习Spring之前要先学习什么?

    转载于 xff1a https zhuanlan zhihu com p 64001753 开门见山 xff0c 先放结论 要开始学习Spring xff08 以IOC和Spring MVC为核心 xff09 xff0c 只需要做好以下准备
  • 【程序员学理财】有关fd的一些了解

    https www 163 com dy article GJK2KL600535EAS7 html https www fangdaijisuanqi com https www 163 com dy article GMUC9K5805
  • 【Java学习路线之JavaWeb】JSP教程

    文章目录 为什么要学习JSP xff1f 读者阅读条件 JSP到底是什么JSP的由来Servlet与JSP异同点JSP相对于Servlet的优点1 xff09 易于维护2 xff09 快速开发 xff1a 无需重新编译和部署3 xff09
  • 用了五年 VS Code ,我决定换成 JetBrains……

    作者 Jeremy Liu 译者 许学文 策划 闫园园 审校 王强 本文最初发布于 Blankly 上 xff0c 经原作者授权由 InfoQ 中文站翻译并分享 在编程中 xff0c VS Code 作为我的主 IDE 长达 5 年之久 在
  • 分布式、分布式系统、分布式计算、分布式存储

    用大白话聊聊分布式系统 什么是分布式系统 xff0c 如何学习分布式系统 分布式学习最佳实践 xff1a 从分布式系统的特征开始 xff08 附思维导图 xff09 分布式系统 分布式 到底什么是分布式系统 xff1f 你需要了解这些 ht
  • 第19章 操作系统设计的思想

    19 1 操作系统的概述 操作系统的设计是将方方面面的技术和设计有机的结合起来 xff0c 构建一个掌控计算机的巨无霸软件系统 各种各样的技术细节不一定相互兼容或者相得益彰 xff0c 甚至有些是相互矛盾的 xff0c 操作系统能把进程管理
  • 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者阅读条件 MVC设计模式简介JSP 43 JavaBeanServlet 43 JSP 43 JavaBeanMVC优缺点优点缺点 Spring MVC是什么Spring MVC优点 第一个Spring MVC程序1 创建We

随机推荐

  • 【Java学习路线之JavaWeb】Spring Cloud教程(非常详细)

    文章目录 读者阅读条件 微服务是什么微服务 xff0c 我们可以从字面上去理解 xff0c 即 微小的服务 xff0c 下面我们从 服务 和 微小 两个方面进行介绍 微服务架构微服务架构 vs 单体架构微服务的特点微服务框架Java 微服务
  • 架构设计:如何实现一个高性能分布式 RPC 框架

    在前面的课程中 xff0c 我们由浅入深地讲解了 Netty 的基础知识和实现原理 xff0c 并对 Netty 的核心源码进行了剖析 xff0c 相信你已经体会到了 Netty 的强大之处 本身学习一门技术是一个比较漫长的过程 xff0c
  • 【Java学习路线之JavaWeb】Hibernate框架入门教程

    文章目录 Hibernate框架入门教程读者阅读条件 ORM是什么ORM 的缺点ORM 框架总结 Hibernate是什么什么是 ORM xff1f 什么是持久化 xff1f Hibernate 支持的数据库Hibernate 是一种全自动
  • JDBC快速入门教程

    JDBC快速入门教程 xff1a https www yiibai com jdbc jdbc quick guide html
  • 嵌入式中5个难查的软件问题

    在嵌入式开发软件中查找和消除潜在的错误是一项艰巨的任务 通常需要英勇的努力和昂贵的工具才能从观察到的崩溃 xff0c 死机或其他计划外的运行时行为追溯到根本原因 在最坏的情况下 xff0c 根本原因会破坏代码或数据 xff0c 使系统看起来
  • 【Go语言入门教程】Go语言简介

    文章目录 Go语言简介Go语言创始人1 Ken Thompson2 Rob Pike3 Robert Griesemer Go 是编译型语言为什么要学习Go语言Go语言吉祥物 Go语言的特性有哪些 xff1f 语法简单并发模型内存分配垃圾回
  • 【Go语言入门教程】Go语言基本语法

    文章目录 Go语言变量的声明 xff08 使用var关键字 xff09 标准格式批量格式简短格式 Go语言变量的初始化回顾C语言 变量初始化的标准格式编译器推导类型的格式短变量声明并初始化 Go语言多个变量同时赋值Go语言匿名变量 xff0
  • 【Go语言入门教程】Go语言容器(container)

    文章目录 其它语言中的容器 Go语言数组详解Go语言数组的声明比较两个数组是否相等遍历数组 访问每一个数组元素 Go语言多维数组简述Go语言切片详解从数组或切片生成新的切片1 从指定范围中生成切片2 表示原有的切片3 重置切片 xff0c
  • 跨平台组件方案设计

    转一篇看完有点收获的文章 xff1a https blog csdn net c12345423 article details 117914561 一 背景说明 模块是对业务的抽象 xff0c 组件是对功能的抽象 xff0c 组件化的目的
  • 996,活着抑或死亡

    就在昨天 xff0c 2021年元旦假期的最后一天 xff0c 网传某大厂多多买菜的23岁小姑娘离开了这个世界 不久之前 xff0c 也有另一大厂的朋友因工作强度太大 xff0c 在字节跳动与心脏跳动中选择了后者 还有更戏剧化的新闻是刚因大
  • 怎么用手机拍摄制作视频

    今天看了一个用手机拍摄视频的Up主讲解他用手机拍摄来制作视频的过程 xff0c 在此总结一下 xff0c 学习一下 任何形式的内容创作 xff0c 都需要及时记录 xff0c 现在手机这么方便 xff0c 用备忘录记录一下想法和灵感 写稿子
  • 2021年ML和NLP依然发展迅速,DeepMind科学家最近总结了过去一年的十五项亮点研究方向,快来看看哪个方向适合做你的新坑

    转载于 xff1a https mp weixin qq com s IDdY2Wd77fT3DkYXCnSBCA 最近 xff0c DeepMind科学家Sebastian Ruder总结了15个过去一年里高能 有启发性的研究领域 xff
  • BCD码-百度百科

    BCD码 xff08 Binary Coded Decimal xff09 xff0c 用4位二进制数来表示1位十进制数中的0 9这10个数码 xff0c 是一种二进制的数字编码形式 xff0c 用二进制编码的十进制代码 BCD码这种编码形
  • STM32单片机学习教程

    STM32单片机学习教程 64 先可以看一个简单的入门教程 xff1a STM32新手入门教程 后面就是整理于 xff1a https stm32 tech readthedocs io en latest base 00 E5 89 8D
  • 分享一份嵌入式软件工具清单

    文章目录 1 BowPad2 keil3 VSCode4 VS5 MinGW6 Source Insight7 VMWare8 Git9 Beyond Compare10 串口助手11 STM32Cube xff08 1 xff09 STM
  • beyond compare下载安装及使用教程

    一 下载安装 下载地址 xff1a https www beyondcompare cc 普通的软件安装 xff0c 直接点点点即可 二 简单使用教程 一般我们的使用场景是比较两个文件或者两个文件夹 推荐看官方的教程 xff1a Beyon
  • RT-Thread 编程风格

    文章目录 1 目录名称2 文件名称3 头文件定义4 文件头注释5 结构体定义6 宏定义7 函数名称 声明8 注释编写9 缩进及分行10 大括号与空格11 trace log信息12 函数13 对象14 格式化代码使用 astyle 格式化使
  • 程序人生文章汇总(持续更新,方便查阅)

    已经转载和写过不少关于程序人生的文章 xff0c 这篇就主要对这些文章进行主题分类 xff1a 我自己将这些内容分成以下主题 xff1a 提高认知方向选择 amp 学习路线学习方法 amp 做事方法总结重要技能其他 提高认知 程序员为什么越
  • 使用Github Pages和HTML+CSS搭建自己的个人简历网页

    最近看到一个使用Github Pages和HTML 43 CSS搭建的个人简历网页 xff0c 看起来还是不错的 xff0c 因此想重新整理一下这方面的内容 另外 xff0c HTML和Markdown之前也是可以在一定程度上转换的 xff
  • 单片机开发项目全局变量太多怎么管理?

    转载于无际 xff1a https blog csdn net weixin 43982452 article details 121387105 spm 61 1001 2014 3001 5502 大家好 xff0c 我是无际 最近有几