历史上的今天
返回首页

历史上的今天

今天是:2025年12月21日(星期日)

2022年12月21日 | 单片机开发项目全局变量太多怎么管理?

2022-12-21 来源:zhihu

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


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

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


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


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


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


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

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

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

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

举个例子:

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

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

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

公式2: 1<<3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

那程序架构到底是什么?

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

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

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

具体怎么做?

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

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

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

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

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

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

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


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

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

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

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

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

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

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


推荐阅读

史海拾趣

BVLED公司的发展小趣事

在电子行业的初期,BVLED公司只是众多初创企业之一,面临着资金短缺、技术不成熟和市场认可度低等问题。然而,公司的创始人凭借对LED技术的深刻理解和市场需求的敏锐洞察,决定专注于研发高效、节能的LED产品。经过数月的努力,公司成功开发出了一款具有竞争力的LED照明产品,并成功获得了第一批订单。这一突破为公司的发展奠定了坚实的基础。

Elpida Memory公司的发展小趣事

在成立初期,Elpida Memory凭借先进的技术和强大的研发实力,迅速在全球DRAM市场占据了一席之地。然而,随着市场竞争的加剧和技术的快速发展,Elpida Memory也面临着巨大的挑战。尤其是在2008年全球金融危机爆发后,DRAM市场需求大幅下降,产品价格暴跌,Elpida Memory的经营状况也陷入了困境。

Esterline Technologies Corporation公司的发展小趣事

为了挽救Elpida Memory,日本政府采取了积极的援助措施。2009年,日本政府通过《产业再生法》修正案,向Elpida Memory提供了数百亿日元的公共资金和融资支持。这些资金帮助Elpida Memory度过了最困难的时期,并为其后续的重组和发展提供了有力的支持。

东软载波(EastSoft)公司的发展小趣事

随着市场的不断变化和技术的不断发展,东软载波始终保持对技术创新的重视。公司不断投入研发资源,相继开发出窄带低速、窄带高速、宽带低速、宽带高速等系列电力载波通信芯片,产品性能持续提升。同时,公司还形成了支撑电力线载波通信系统的三大重点核心技术,包括电力线通信网络与数据交换技术、电力线高精度同步和速率自适应扩频通信技术等。这些技术的突破使东软载波在行业中保持领先地位。

ECI公司的发展小趣事

随着全球环保意识的不断提高,ECI公司积极响应绿色环保的号召。公司投入大量资金研发环保型电子产品,采用环保材料和工艺生产产品。此外,ECI还积极参与各类环保公益活动,宣传环保理念。这种对环保的关注和投入不仅赢得了消费者的认可和支持,也为公司树立了良好的社会形象。

Hong Kong X'Tals Ltd公司的发展小趣事
由于环境温度和元件参数的变化,实际定时时间可能会有所偏差。在设计时需要考虑这一因素,并留出适当的裕量。

问答坊 | AI 解惑

μC/OS—II的嵌入式串口通信模块设计

在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个 ...…

查看全部问答>

不知道大家的示波器程序进展如何?

不知道大家的程序进展如何?是否可以和大家分享一下呢? [ 本帖最后由 daicheng 于 2009-8-13 16:45 编辑 ]…

查看全部问答>

【藏书阁】射频电路设计理论与应用

目录: 第1章 引言 .. 1.1 射频设计的重要性 .. 1.2 量纲和单位 .. 1.3 频谱 .. 1.4 无源元件的射频特性 .. 〖DW〗1.4.1 高频电阻 .. 〖DW〗1.4.2 高频电容 .. 〖DW〗1.4.3 高频电感 .. 1.5 片状元件及对电路板的考虑 . 1.5.1 片状电阻 ...…

查看全部问答>

监控摄像头监控蔬菜了

上海正全力加强158个迎世博重点蔬菜基地的建设,强化生产基地的监管,建立健全农产品质量安全可追溯体系。闵行区农委世博蔬菜基地除在场区实行全天候巡逻外,还在农田蔬菜大棚和装运车间安装了监控摄像头,实现世博重点蔬菜基地生产和运输过程的有 ...…

查看全部问答>

关于采样保持电路的问题

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 哪位大虾可以指导一下关于采样保持电路的几个问题: 1、最常用的有哪些芯片 2、电路应该如何设计及各个部分的作用是什么 3、AD的是否影响采样保持电路芯片的选择,如果有还麻烦您讲解一下啊 再 ...…

查看全部问答>

基于MOSFET内部结构设计优化的驱动电路

功率MOSFET具有开关速度快,导通电阻小等优点,因此在开关电源,马达控制等电子系统中的应用越来越广。通常在实际的设计过程中,电子工程师对其的驱动电路以及驱动电路的参数调整并不是十分关注,尤其是从来没有基于MOSFET内部的微观结构去考虑驱动 ...…

查看全部问答>

RVDS或者ADS环境下开发C++工程

     我在RVDS环境下把以前能够通过的c源代码的工程改为c++的工程,但是发生连接错误找不到Main函数:      Undefined symbol Main (referred from 2440init.o)。请大虾指点…

查看全部问答>

T9输入法 购买

问下大家:我们想购买T9输入法,但是http://www.t9.com/该产品根本没有提供联系方式呀,只要我留言,但是我留了又发不出去,真急人。有了解的朋友帮帮我哦:)…

查看全部问答>

[提建议]建立一个语音教学及互动平台

[提建议]建立一个语音教学及互动平台 我相信在坛子里面的学生应该不少吧。想在EEWorld里学到一些实践的经验和如何做项目。 我们论坛中已经有了 但是,我觉得我们eeworld是还会有更多的想法和活动的. 如:     链接:https:/ ...…

查看全部问答>