嵌入式软件中的全局变量
因为要编写编译器,到了变量管理这一步,特意查了下大家对全局变量的看法。一篇比较中肯,引用甚广的文章是这么认为的:
对于全局变量的看法,做嵌入式尤其是做控制的工程师和做非嵌入式的软件工程师之间存在严重分歧。
做控制的工程师认为全局变量方便。首先,代码远不是他们的全部,需要关心的更多是控制的结果,毕竟要考虑各种算法,滤波、反馈等等的调试。代码只要能工作就行。变量名污染,低耦合之类根本顾不过来。做非嵌入式的PC软件工程师认为应当尽量避免全局变量,一定要用,也要设置严格的访问权限。
我的编译器要做实时嵌入式控制开发平台的,因此站在嵌入式(尤其是控制)工程师的角度为全局变量做一下辩护。
许多对全局变量的责难其实不是全局变量本身的问题,而是代码架构不规范导致的。网上列举的全局变量所造成的问题多种多样,其实是不规范的代码自然导致多种多样的问题——各种bug都极富创新型。新手们围绕全局变量作出了各种创新性的bug,于是禁用全局变量,于是新手们去别的地方搞创新去了。
其实,全局变量唯一的问题就是它可以出现在各个地方,增加各个函数/文件之间的耦合度,维护时梳理起来不方便。然而,对于嵌入式尤其是单片机控制系统来说,这点其实问题不大,首先代码量小,文件屈指可数,而且现在的编译环境都很先进——点几下鼠标,所有变量的引用信息就全部列出,一览无余。
至于访问权限的设置。做非嵌入式的PC软件工程师喜欢给变量写get/set函数,但这样以来,变量访问要花几倍的CPU时间去做get/set的函数调用。在嵌入式系统尤其是控制类单片机中,对硬件的压榨是很极端的,CPU利用率90%都不算什么,顶到97%都是有的。而且嵌入式项目是实时性要求很高的,晚一个毫秒算不完都不行。不是跑在电脑上鼠标卡一卡也无所谓的。当然,一些PC类软件的开发经验也是可以借鉴的,比如:1.全局变量如果只是文件内调用,就写在这个.c文件里,不要写进.h文件里;2.一个文件中的全局变量统一包在一个名称辨识度较高的struct中,比如PID.c里的全局变量包进结构体pid_S中,这样可以轻松追溯来源。
嵌入式软件里大部分的代码都是中断驱动或时钟节拍驱动的,天生就有很多变量是没法使用参数传递的,或者说嵌入式软件天生就是全局变量的舞台。全局变量一定是要用的,而且通常要大量使用。如果代码难以维护,首先应该分析下是不是架构不合理,而不是人云亦云地去怪罪全局变量;如果全局变量的应用老出bug,也不要一味地去逃避全局变量,而是要积极地拥抱包括全局变量在内的各种数据结构,各种算法结构,去理解去体会——数据和算法本身没有问题,应用不当才会出问题。
浙公网安备 33010602011771号