单片机如何避免全局变量过多混乱
https://api.fanyedu.com/uploads/image/9d/f7789ceea54d75d581ad5071217be2.png我来给大家分析下:2.全局变量过多就是这个项目程序逻辑,调到我快崩溃了。不过一组合起来,功能之间就会相互冲突得很厉害,导致改了这里,那里又出问题。如果你没经历过这种问题,你不会理解程序架构的重要性。比如说全局变量,后面我也意识到了这个问题。第一个是要避免全局变量名字重复,第二个如果哪个变量没做注释,1个月后干干净净。但是,不用全局变量肯定也是不可能的。我是怎么做的?https://api.fanyedu.com/uploads/image/9f/6f08e852b3aca1aef357695a65ceff.png一般来说还有中间层,比如解析一些协议之类,项目中间层的代码不多,被我简化了。跟我做的那个太阳能热水器控制板的程序对比,虽然全局变量的数量可能没变,但是很明显模块化的写法更加清晰。可扩展性强,听起来是一个专业术语,可能很多新手不是很理解什么意思。客户测试完,说要改功能,来来回回改个7,8次,你是不是离职的心都有了?有经验的工程师,从学会有能力偷懒开始,再急的项目,你做完还有空闲时间那才牛X。下面再来说说可移植性。比如说这个项目以前我在STM32单片机上做的,现在芯片涨价了,老板要求换成GD32的替代。有经验工程师写出来的程序,一般只需要改改硬件层的外设接口,应用层的产品逻辑功能代码基本不用动。一个全局变量的问题,看似简单,要想解决,还是得站在整个程序架构的角度去思考。就是用结构体。比如说时间分为年、月、日、周、时、分、秒。https://api.fanyedu.com/uploads/image/3c/60b5c4c6f5b501810a3c7c18a5ac34.pnghttps://api.fanyedu.com/uploads/image/24/beae7961374ae1513e75b2aa4442fd.png类似的还有很多,比如说GPIO也算一个对象,参数有端口号、引脚号、输入模式、输出模式、频率等。将程序划分为多个功能模块,每个模块有自己的.c和.h文件。
每个模块的全局变量定义在对应的.c文件中,避免全局变量的跨模块使用。 为全局变量定义统一的命名规范,避免变量名重复。 使用函数来访问和修改全局变量,避免直接操作全局变量。 合理使用单例模式,控制全局对象的创建和访问。 封装结构体出来啊 对于常量值,使用#define宏定义或者enum枚举类型代替全局变量,以增加代码的可读性和易维护性。 模块化编程,就不会有变量乱飞的情况了 建立统一的全局变量命名规则,使变量名具有明确的含义和可读性。可以采用有意义的单词或缩写来命名变量,避免使用模糊不清或容易混淆的名称。 将相关的数据和操作封装成对象,通过对象的方法来访问和修改数据,而不是直接使用全局变量。这样可以隐藏数据的实现细节,提高代码的安全性和可维护性。 在头文件中声明不透明的数据类型(如typedef struct {} Handle;),并在实现文件中定义具体的结构,通过函数接口操作这些数据类型。 对于只在本文件或本模块中使用的全局变量,可以使用static关键字进行修饰。这样该变量的作用域就被限制在当前的文件或模块内,避免了与其他文件中的变量冲突,同时也提高了代码的封装性。 在单片机编程中,避免全局变量过多和混乱是非常重要的,因为这不仅影响代码的可读性和维护性,还可能导致意外的副作用和难以调试的问题。 使用枚举类型(enum)来定义一组相关的常量,而不是使用分散的全局变量。 利用面向对象的继承和多态特性,可以提高代码的复用性和灵活性,减少全局变量的使用。 用结构体将全局变量与功能进行分类:将具有相同或相关功能的变量组合成一个结构体,便于管理和传递。
封装数据结构:使用结构体封装复杂的数据结构,使代码更加清晰和模块化。 在定义全局变量的地方,要添加详细的注释,说明变量的作用、取值范围、使用方法以及可能的修改时机等信息。 严格命名规范,避免命名冲突和作用域混乱。 尽量使用局部变量开发 在.c文件中使用static关键字定义全局变量,这样变量的作用域仅限于该文件,避免跨文件的变量冲突。