OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12830|回复: 26

关于减少全局变量使用的方法

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2015-1-17 08:57:09 | 显示全部楼层 |阅读模式
5金钱
比如上位机向单片机A发送一个数32,A收到这个32后每隔2秒闪烁灯一次,闪烁的同时将32减1,然后将减一后的值再发给上位机,直到32减为0.
如果还没有减为0又收到上位机的数字比如100,立即从新计时,每隔2秒闪烁灯一次,闪烁的同时将100减1,然后将减一后的值再发给上位机,直到100减为0.

我想了很久,感觉使用全局变量是少不了的:一个放从上位机接收的数值,2s时间到的标志(没有在定时中断里做其他事情,因为我这里只是以闪烁灯为例)。
这里如果使用全局变量数量还是比较少的,假如A里面要做几百个类似但又不重样的事情呢?

有没有人能讲讲怎样减少使用全局变量?我一写程序就马上想到用全局变量了,除了上面的例子,还有:串口接收数据包、DMA发送数组(见http://www.openedv.com/posts/list/44829.htm)、DMA采集ADC值。

最佳答案

查看完整内容[请看2#楼]

结构体 , 指针传入对象 . 类似但不相同的事 , 如果没有共性建议不要在一个函数里做 , 如果有共性 , 按照共性处理 , 具体的不同操作调用其他的函数实现 . 减少全局变量只是一个表象 , 如果有良好的面向对象编程的习惯 , 就很容易出现相反的情况 , 即习惯于使用局部参数传递数据 , 难以想到使用全局变量的理由 ,  ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2015-1-17 08:57:10 | 显示全部楼层
结构体 , 指针传入对象 .

类似但不相同的事 , 如果没有共性建议不要在一个函数里做 , 如果有共性 , 按照共性处理 , 具体的不同操作调用其他的函数实现 .

减少全局变量只是一个表象 , 如果有良好的面向对象编程的习惯 , 就很容易出现相反的情况 , 即习惯于使用局部参数传递数据 , 难以想到使用全局变量的理由 , 除了中断服务函数无法直接传入参数 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-1-17 14:34:32 | 显示全部楼层
数据不多的话就函数返回(USART,ADC),多的话可以用指针(数据包)
博观而约取,厚积而薄发。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-1-17 23:14:26 | 显示全部楼层
用全局变量可以啊,你用其他的占内存更多.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-1-19 11:23:35 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------
是不是面向对象编程是解决总是想使用全局变量的一个方法?我第一次做项目,程序写下来用了很多全局变量。
回复

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2015-1-19 12:31:03 | 显示全部楼层
回复【5楼】Di诺:
---------------------------------
是 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-1-19 14:44:43 | 显示全部楼层
回复【6楼】shihantu:
---------------------------------
谢谢你。
回复

使用道具 举报

1

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-11-26
在线时间
0 小时
发表于 2015-1-19 19:52:12 | 显示全部楼层
仁者见仁智者见智吧。自己习惯喜欢就好。程序语音无非就两个作用,一个是实现功能,一个是给人看。自己写的,只要自己能看明白,以后修改容易就对。如果有时候一位追求结构,搞的像win8一样复杂,日后你想维护一下,估计也会像看天书。培养一个适合自己风格的程序构,尽量让他合理,易懂就最好。
回复

使用道具 举报

2

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-4-21
在线时间
38 小时
发表于 2017-4-30 10:20:37 | 显示全部楼层
正点原子 发表于 2015-1-17 23:14
用全局变量可以啊,你用其他的占内存更多.

为什么呢?我看相关的资料说尽量少使用全局变量啊。
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2017-5-2 08:43:46 | 显示全部楼层
虎啸 发表于 2017-4-30 10:20
为什么呢?我看相关的资料说尽量少使用全局变量啊。

用全局无非就是有各种内存不能释放,但是免去了各种局部变量或者使用指针的数据传递。如果你的片内资源完全用不完,为什么不用全局呢,可以免去各种麻烦诶。。。
所谓面向对象,你就需要各种各样的数据包,调用、返回等等,但是你想想有一些简单的数据处理语句真的需要写成一个子函数的型式么?
总的来说,同意八楼的看法。
特么打完字,发现居然是15年的帖子。。。
回复

使用道具 举报

2

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-4-21
在线时间
38 小时
发表于 2017-5-12 10:38:11 | 显示全部楼层
感谢,新手上路,多谢。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-12 13:16:21 | 显示全部楼层
回想起了读大学时候刚刚学习C语言~也是喜欢到处定义变量。。多写代码,慢慢你就有感觉知道如何设计自己想要的程序了
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7952
金钱
7952
注册时间
2014-8-13
在线时间
1590 小时
发表于 2017-5-12 14:06:10 | 显示全部楼层
全局变量不是老虎,不要害怕使用全局变量,只要能让程序更加合理,使用全局变量也无妨。

了解全局变量的优缺点,针对其优缺点进行比较选择,如果使用全局变量比其他方法有优势,那就大用特用。很多MSDN上的例子也没有可以回避全局变量的。一切根据实际需要来做就可以了。
回复

使用道具 举报

34

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1087
金钱
1087
注册时间
2017-3-10
在线时间
172 小时
发表于 2017-5-12 15:29:48 | 显示全部楼层
mack13013 发表于 2017-5-12 14:06
全局变量不是老虎,不要害怕使用全局变量,只要能让程序更加合理,使用全局变量也无妨。

了解全局变量的 ...

做项目你要综合考虑程序的可移植性,还有维护。你全局变量多了,牵一发动全身,改的你发慌
回复

使用道具 举报

3

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2016-7-27
在线时间
19 小时
发表于 2017-5-12 20:30:58 | 显示全部楼层
stm32wwxf 发表于 2017-5-12 15:29
做项目你要综合考虑程序的可移植性,还有维护。你全局变量多了,牵一发动全身,改的你发慌

这个确实,拿到过几个前辈写的程序,想要移植过来其中的某项功能,那真的是牵一发而动全身,搞到最后移植比我自己写都费事
回复

使用道具 举报

3

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-5-4
在线时间
21 小时
发表于 2017-5-12 23:32:58 | 显示全部楼层
Ecrhon 发表于 2017-5-12 20:30
这个确实,拿到过几个前辈写的程序,想要移植过来其中的某项功能,那真的是牵一发而动全身,搞到最后移植 ...

那可能他逻辑没组织好或者你程序还没看太懂吧
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7952
金钱
7952
注册时间
2014-8-13
在线时间
1590 小时
发表于 2017-5-12 23:42:32 | 显示全部楼层
本帖最后由 mack13013 于 2017-5-12 23:45 编辑
stm32wwxf 发表于 2017-5-12 15:29
做项目你要综合考虑程序的可移植性,还有维护。你全局变量多了,牵一发动全身,改的你发慌

你说的并不针对我要表达的意思。

我是说,你要了解全局变量的优缺点,针对具体问题比较一下使用全局变量和其他方法的优缺点,如果使用全局变量比其他方式有优势,那就用(这是废话,基本是要表达的意思就是:哪种方法优秀就用哪种方法)。

使用全局变量只是方法的一种,肯定要在众多方法中选择一种最优秀(这个基本上是主观感觉了)的方法。

你说的,连可移植性都不考虑,很明显是个菜鸟的行为,或者后期项目需求改变。

我要说的基本意思就是,选择最优秀的方法,即使这个方法是使用全局变量。再有一点就是,不要因为需要使用全局变量就要“强行”去回避,只需要针对全局变量的弊端,平时使用时注意避免就好。

回复

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2019-5-24
在线时间
21 小时
发表于 2019-11-6 12:34:20 | 显示全部楼层
本帖最后由 山峡智人 于 2019-11-6 12:35 编辑
shihantu 发表于 2015-1-17 08:57
结构体 , 指针传入对象 .

类似但不相同的事 , 如果没有共性建议不要在一个函数 ...

shihantu你好,能给联系方式吗?谢谢!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-5-16
在线时间
2 小时
发表于 2020-9-10 12:37:47 | 显示全部楼层
15年的帖子,20年仍然受益
回复

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2020-6-3
在线时间
82 小时
发表于 2022-2-17 08:50:04 | 显示全部楼层
22年还在看
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2022-2-17 21:38:30 | 显示全部楼层
如果是单片机的话,确实要用全局变量,因为串口接受要用到中断,而中断函数不能传参,只能使用全局变量。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2022-9-14
在线时间
0 小时
发表于 2022-9-14 16:57:52 | 显示全部楼层
一晃7年过去了
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5259
金钱
5259
注册时间
2012-8-25
在线时间
1025 小时
发表于 2022-9-15 07:51:45 | 显示全部楼层
虎啸 发表于 2017-4-30 10:20
为什么呢?我看相关的资料说尽量少使用全局变量啊。

不同阶段做法不同.那是说做大项目的,内存用不完那种.用几百字甚至100来字节内存的单片机基本上只能用全局变量.  
就像有人提倡多吃粗粮,那是给天天大鱼大肉的人说的.我小时候天天玉米面加青菜,那营养根本就跟不上.
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3510
金钱
3510
注册时间
2016-3-19
在线时间
846 小时
发表于 2022-9-15 09:42:05 | 显示全部楼层
哈哈  看完这么多高手的回复  感觉确实说的都挺好

不过我还是想说

任何事情都有两面性  看你站在哪个角度去考虑这个问题了

个人觉得   全局变量   这个话题  会在编程界一直存在讨论的话题
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3510
金钱
3510
注册时间
2016-3-19
在线时间
846 小时
发表于 2022-9-15 09:50:03 | 显示全部楼层
顺便想提出个话题

全局变量  局部变量  对于单片机在执行程序过程中  它们分别是什么

当高级语言解释不好的问题   恰好是低级语言的优势

汇编语言   或许是解答疑惑的一种语言  当然并不是唯一的一种语言
Nothing is impossible
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5259
金钱
5259
注册时间
2012-8-25
在线时间
1025 小时
发表于 2022-9-15 15:37:17 | 显示全部楼层
unnormal 发表于 2022-9-15 09:50
顺便想提出个话题

全局变量  局部变量  对于单片机在执行程序过程中  它们分别是什么

全局变量就是分配一个固定地址.
局部变量就复杂了,要看多少字节和编译器, 少量的可以直接分配在R寄存器, 其他情况有的分配到栈.还有些厂家自己出的编译器,其实也是分配在固定地址,我也见过.
看生产的汇编语言一目了然.
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3510
金钱
3510
注册时间
2016-3-19
在线时间
846 小时
发表于 2022-9-15 16:15:11 | 显示全部楼层
gotofly21 发表于 2022-9-15 15:37
全局变量就是分配一个固定地址.
局部变量就复杂了,要看多少字节和编译器, 少量的可以直接分配在R寄存器, ...

恩恩  是的  您说的没问题  这个要看最终生成的汇编语言  否则直接说   不全面

不同的编译器可能规则不太一样  但是生成的汇编语言不会骗人的

可以将少量变量定义为寄存器变量  这个算是变量中的一种特例

对于普通单片机来说  局部变量确实是比全局变量复杂一些  个人片面理解 复杂在数据管理方式上

说一下我个人片面理解:

我站在单片机执行程序的角度去看:单片机执行程序时  它仅仅知道从某个地址读数据和向某个地址写数据    单片机并不知道局部变量和全局变量

Nothing is impossible
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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