打印
[技术问答]

单片机如何避免全局变量过多混乱

[复制链接]
1630|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yorkbarney|  楼主 | 2025-2-27 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我来给大家分析下:
2.全局变量过多
就是这个项目程序逻辑,调到我快崩溃了。
不过一组合起来,功能之间就会相互冲突得很厉害,导致改了这里,那里又出问题。
如果你没经历过这种问题,你不会理解程序架构的重要性。
比如说全局变量,后面我也意识到了这个问题。
第一个是要避免全局变量名字重复,第二个如果哪个变量没做注释,1个月后干干净净。
但是,不用全局变量肯定也是不可能的。
我是怎么做的?
一般来说还有中间层,比如解析一些协议之类,项目中间层的代码不多,被我简化了。
跟我做的那个太阳能热水器控制板的程序对比,虽然全局变量的数量可能没变,但是很明显模块化的写法更加清晰。
可扩展性强,听起来是一个专业术语,可能很多新手不是很理解什么意思。
客户测试完,说要改功能,来来回回改个7,8次,你是不是离职的心都有了?
有经验的工程师,从学会有能力偷懒开始,再急的项目,你做完还有空闲时间那才牛X。
下面再来说说可移植性。
比如说这个项目以前我在STM32单片机上做的,现在芯片涨价了,老板要求换成GD32的替代。
有经验工程师写出来的程序,一般只需要改改硬件层的外设接口,应用层的产品逻辑功能代码基本不用动。
一个全局变量的问题,看似简单,要想解决,还是得站在整个程序架构的角度去思考。
就是用结构体。
比如说时间分为年、月、日、周、时、分、秒。
类似的还有很多,比如说GPIO也算一个对象,参数有端口号、引脚号、输入模式、输出模式、频率等。

使用特权

评论回复
沙发
updownq| | 2025-3-10 17:49 | 只看该作者
将程序划分为多个功能模块,每个模块有自己的.c和.h文件。
每个模块的全局变量定义在对应的.c文件中,避免全局变量的跨模块使用。

使用特权

评论回复
板凳
lihuami| | 2025-3-11 13:46 | 只看该作者
为全局变量定义统一的命名规范,避免变量名重复。

使用特权

评论回复
地板
fengm| | 2025-3-11 16:56 | 只看该作者
使用函数来访问和修改全局变量,避免直接操作全局变量。

使用特权

评论回复
5
abotomson| | 2025-3-11 21:33 | 只看该作者
合理使用单例模式,控制全局对象的创建和访问。

使用特权

评论回复
6
SophiaOP| | 2025-3-12 10:32 | 只看该作者
封装结构体出来啊

使用特权

评论回复
7
juliestephen| | 2025-3-12 17:16 | 只看该作者
对于常量值,使用#define宏定义或者enum枚举类型代替全局变量,以增加代码的可读性和易维护性。

使用特权

评论回复
8
治愈糖果屋| | 2025-3-13 09:12 | 只看该作者
模块化编程,就不会有变量乱飞的情况了

使用特权

评论回复
9
pmp| | 2025-3-14 10:26 | 只看该作者
建立统一的全局变量命名规则,使变量名具有明确的含义和可读性。可以采用有意义的单词或缩写来命名变量,避免使用模糊不清或容易混淆的名称。

使用特权

评论回复
10
sesefadou| | 2025-3-14 23:03 | 只看该作者
将相关的数据和操作封装成对象,通过对象的方法来访问和修改数据,而不是直接使用全局变量。这样可以隐藏数据的实现细节,提高代码的安全性和可维护性。

使用特权

评论回复
11
janewood| | 2025-3-15 02:29 | 只看该作者
在头文件中声明不透明的数据类型(如typedef struct {} Handle;),并在实现文件中定义具体的结构,通过函数接口操作这些数据类型。

使用特权

评论回复
12
mattlincoln| | 2025-3-15 05:47 | 只看该作者
对于只在本文件或本模块中使用的全局变量,可以使用static关键字进行修饰。这样该变量的作用域就被限制在当前的文件或模块内,避免了与其他文件中的变量冲突,同时也提高了代码的封装性。

使用特权

评论回复
13
plsbackup| | 2025-3-16 12:04 | 只看该作者
在单片机编程中,避免全局变量过多和混乱是非常重要的,因为这不仅影响代码的可读性和维护性,还可能导致意外的副作用和难以调试的问题。

使用特权

评论回复
14
cemaj| | 2025-3-16 12:31 | 只看该作者
使用枚举类型(enum)来定义一组相关的常量,而不是使用分散的全局变量。

使用特权

评论回复
15
alvpeg| | 2025-3-16 13:47 | 只看该作者
利用面向对象的继承和多态特性,可以提高代码的复用性和灵活性,减少全局变量的使用。

使用特权

评论回复
16
plsbackup| | 2025-3-16 14:28 | 只看该作者
用结构体将全局变量与功能进行分类:将具有相同或相关功能的变量组合成一个结构体,便于管理和传递。
封装数据结构:使用结构体封装复杂的数据结构,使代码更加清晰和模块化。

使用特权

评论回复
17
elsaflower| | 2025-3-16 14:58 | 只看该作者
在定义全局变量的地方,要添加详细的注释,说明变量的作用、取值范围、使用方法以及可能的修改时机等信息。

使用特权

评论回复
18
saservice| | 2025-3-16 15:14 | 只看该作者
​严格命名规范,避免命名冲突和作用域混乱。

使用特权

评论回复
19
SophiaOP| | 2025-3-17 20:52 | 只看该作者
尽量使用局部变量开发

使用特权

评论回复
20
jtracy3| | 2025-3-18 19:06 | 只看该作者
在.c文件中使用static关键字定义全局变量,这样变量的作用域仅限于该文件,避免跨文件的变量冲突。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

1358

帖子

1

粉丝