搜索
bottom↓
回复: 299

如何尽量地避免使用全局变量呢?

  [复制链接]

出0入296汤圆

发表于 2014-9-29 01:03:32 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-9-29 01:07 编辑

使用二楼的方法,好处非常多,不仅不会降低效率,还会降低代码尺寸,
实现对变量的访问权限控制(只读,只写),可以一劳永逸的实现对变量的
原子保护,可以在读写的时候进行有效性检查,最后调试的时候方便追踪
谁对变量进行了访问,也可以填写调试值。这就是面向接口开发的好处。

在我的团队里,是严禁使用全局变量的,因为明确有更好的解决方案。
只允许使用静态变量。

出0入296汤圆

发表于 2014-9-29 12:28:21 | 显示全部楼层
zzh90513 发表于 2014-9-29 06:47
这也是相对的,静态变量依赖历史变量值,会使的函数失去可重入性,多任务调用不方便 ...

比较要注意对象,我说的都是针对使用全局变量来说的,你说的是可重入性。完全是另外一个话题。

出0入296汤圆

发表于 2014-9-29 12:29:13 | 显示全部楼层
ilcvm 发表于 2014-9-29 10:29
在你们团队加static的文件内全局变量允许用么?


允许,这叫静态变量,使用受限

出0入296汤圆

发表于 2014-9-29 12:52:03 | 显示全部楼层
gycsy963 发表于 2014-9-29 06:31
全局变量对程序维护肯定有些影响,但要说性能,肯定最好。
上面提到C的变量封装方法,一直不太感冒。感觉对 ...

从性能上,如果开了inline,则函数法与全局变量操作无差别,如果没有开inline,则比全局变量法多了一次相对跳转,差不多4个周期的牺牲,
如果4个周期的牺牲并不发生在程序热点上,则这种开支是值得的,因为可以换取更好的维护性。
至于你说用面向接口的方式封装对静态变量的读取影响维护,这个我觉得需要认真探讨下,你先说说哪里不好,我们一一来讨论,只凭借一个
印象就下结论,实在是武断,我可以问你:你真的想清楚了么?我是真的想清楚了。

另外,我常用的编译器是IAR,一直开最高优化(speed和size),不考虑NC编译器。

出0入296汤圆

发表于 2014-9-29 12:52:36 | 显示全部楼层
qlb1234 发表于 2014-9-29 10:21
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題 ...

这就是面向接口开发对变量访问的validation例子。谢谢讲解。

出0入296汤圆

发表于 2014-9-29 12:54:25 | 显示全部楼层
nnmnnm 发表于 2014-9-29 12:24
习惯把全局变量分类放到结构体里,看着清楚一点

封装在结构体里面只是一种方式,虽然看着清楚,但是没有做到权限控制(read / write控制),多任务环境下也需要在所有访问的地方都增加一份
原子保护的代码。也无法统一做validation。

出0入296汤圆

发表于 2014-9-29 14:31:01 | 显示全部楼层
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...

这也是一种不错的改良,我也一直在用。

出0入296汤圆

发表于 2014-9-29 16:32:45 | 显示全部楼层
formatme 发表于 2014-9-29 16:24
如果有几万个全局变量该怎么搞?

这种工程是怎么规划出来的?

出0入296汤圆

发表于 2014-9-29 17:01:43 | 显示全部楼层
qlb1234 发表于 2014-9-29 16:44
MTK代碼,輕鬆上千。

规划好,至少可以限定在模块内,不要说总数。

出0入296汤圆

发表于 2014-10-8 17:13:36 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2014-10-8 17:14 编辑
isakura 发表于 2014-10-2 02:58
我反正是想不出来,举个最简单的例子,在timer.c里面有个定时器计数cnt,在user.c里面调用——这个很多人 ...


timer.c

  1. static volaitle uint32_t s_wCounter;

  2. ISR(Timer0_vect)
  3. {
  4.     s_wCounter++;
  5. }

  6. uint32_t get_counter(void)
  7. {
  8.     uint32_t wResult;
  9.     SAFE_ATOM_CODE(                           //! 原子操作的保护宏
  10.         wResult = s_wCounter;
  11.     )
  12.     return wResult;
  13. }
复制代码



timer.h


  1. #ifndef __TIMER_H__
  2. #define __TIMER_H__

  3. extern uint32_t get_counter(void);


  4. #endif
复制代码

出0入296汤圆

发表于 2014-10-8 23:24:23 | 显示全部楼层
isakura 发表于 2014-10-8 20:02
我真看不出这样写跟直接操作s_wCounter有什么区别,你这样只是通过一个函数来操作,一样需要存在全局变量 ...

我前面已经解释过了,不再做更详细的说明。有相应经验积累的人自然能看出差别,
我不强求,也没有愿望和义务说服你。所需的信息我已经全部给出,并无遗漏。

出0入296汤圆

发表于 2014-11-3 10:45:58 | 显示全部楼层
typedef 发表于 2014-11-3 08:28
我现在是,写之前先想好程序架构,分好层次,构思好每个模块的数据结构,在单文件内使用static变量或结 ...

就应该是这种方式,赞!做事很专业哈!

出0入296汤圆

发表于 2014-11-5 16:10:26 | 显示全部楼层
mvip 发表于 2014-11-5 13:30
高手能不能解释下这个程序,我们功底差的实在没看懂,特别是
ISR(Timer0_vect)
{

  1. ISR(Timer0_vect)
  2. {
  3. ...
  4. }
复制代码

这只是一个常见的中断处理程序的格式而已,ISR是Interrupt Service Routine的缩写,Timer0_vect是定时器0的中断
向量。这两个和在一起的意思就是,这是一个Timer0_vect的中断处理程序。

出0入296汤圆

发表于 2014-11-13 00:35:35 | 显示全部楼层
semilog 发表于 2014-11-5 20:16
首先,很久没有写AVR的程序了。其实对于这个问题,以前写AVR的程序的时候并没有深究,只是知道这个是avr- ...

'ARM环境下现在也可以用类似的写法,只不过用的是weak的特性

出0入296汤圆

发表于 2014-11-13 20:40:36 来自手机 | 显示全部楼层
spcm 发表于 2014-11-13 07:33
请教傻孩子老师,单片机的外设寄存器是不是具有全局变量的特征呢,也可以说就是全局变量呢。像am335x的,几 ...

寄存器都是静态变量。全局变量是静态变量的一种。完全看你怎么限制它。你完全可以把针对寄存器的操作人为限定在模块中。从C指针技术的角度来说,只要是静态分配的变量(包括全局变量和各类static的变量),都可以借助指针访问,所谓的范围限制都是假的。从这个角度来说,即便是寄存器这种全局变量,你也可以通过技术手段将其限制在模块中(比如不公开头文件),或者通过规则限制住。关键在于用的人有没有封装的思想,不在于是否全局。

出0入296汤圆

发表于 2014-11-14 00:45:14 | 显示全部楼层
rei1984 发表于 2014-11-13 22:22
看了你上面的 程序。可以看出你是一位有经验的人士。类似于linux 专业coder。

对于你的贴出的程序,我做 ...

第三点你的疑问,交换后没有区别。需要小心的是申请指针变量时候的顺序

出0入296汤圆

发表于 2014-12-9 14:18:30 | 显示全部楼层
LVmcu 发表于 2014-12-9 14:14
你好Gorgon_Meducer :对于        SAFE_ATOM_CODE(                           //! 原子操作的保护宏
   ...

参考这个帖子

http://www.amobbs.com/thread-5539888-1-1.html

出0入296汤圆

发表于 2017-12-13 18:34:45 | 显示全部楼层
liansh2002 发表于 2017-12-13 16:37
整个楼看完了,感觉大多数人没有弄明白为什么要减少全局变量,或者应不应该减少全局变量。
为什么要减少全 ...

再补充一点,全局变量会阻止某些编译器优化。多用static (private)可以增加编译器优化代码的机会。

出0入296汤圆

发表于 2018-7-26 18:30:59 | 显示全部楼层
gshuang1 发表于 2014-10-1 16:28
可以读下开源操作系统的代码。只要做到全局变量用结构体归好类,一个函数要是涉及到操作外部变量的尽量用指 ...

一两个工程事儿小,养成了还习惯事儿大!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 03:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表