越靠近底层,代码量越有限的地方(如某硬件的驱动),是越适合使用全局变量的,理由如下: 1,尽量减少全局变量的使用,目的是以效率为代价,优化代码可读性,同时减少BUG出现概率。但对于单个硬件的驱动,其代码量是十分有限的,通常是一个.c一个.h文件,不超过2-3百行,逻辑十分清晰简单,同时一次创作完成测试没BUG后几乎不用修改。此时使用全局变量,并用static修饰限制其只在本驱动.c文件中可见,对代码可读性、健壮性几乎没有负面影响,趋利避害,何乐而不为呢? 2,对于底层驱动,其稳定性是十分重要的。使用全局变量,可以提前分配数据的存储位置,达到“过了编译就能运行”的效果。而使用栈中的临时变量,或是动态分配的内存,都有可能因为运行时的RAM使用状态无法预知,导致程序失效。如果是一般软件遇到此类错误,无非是抛出异常或程序闪退,而驱动程序遇到此类错误的后果相较是更严重的,轻则导致某个硬件失效,重则导致硬件损坏。 3,对于底层软件,其效率也是十分重要的。顶层的每一个操作,最终都要执行若干个底层的函数,如果顶层软件就十分复杂,底层函数的效率就显得更加重要。此时通过全局变量减少一次栈操作、减少一次函数调用,就能对整体的效率产生很大的影响。尤其是某些硬件驱动时间要求精确到时钟周期级,此时多一次上下文切换、多一次函数调用的开销都是要精打细算的。 但是,一个项目也不可能只有底层驱动。例如用STM32做一块手表。顶层面向用户的GUI框架、应用程序等,显然是不适合使用大量全局变量。更应该采用一些优化方法保证程序的可读性和易维护性。
|