C语言开发单片机为什么大多数都采用全局变量的形式?

总的来说,对于大多数程序员来说全局变量可谓是又爱又恨不用吧,很多场合下使用全局变量的确能够节省很多编码力气,毕竟可以减少函数间的参数及数据传递;用吧,很多时候对于多任务或者说多线程场景,必须考虑互斥问题。对于Ram资源寸土寸金的MCU来说,更是需要小心谨慎。比如定义太大的全局变量,可能有时候就是放不到Ram资源中。

网图,侵删

嵌入式开发过程中,也曾经遇到过两个与全局变量有过交集的故事,现在回头想想也是很有思考的价值和意义。写在这里和大家一起分享分享。

第一个故事:老代码中过多的全局变量,导致维护起来非常麻烦。答主刚入职的时候,从事的是嵌入式软件平台的代码维护工作,可以说前人留下的很多代码绝对配得上“屎山”的名声。其中一条就是,各种全局变量满天飞。先不说各种spinlock,rwlock的保护解保护,单说用SI列举出来的索引点,看着满屏的extern真的让人头大。每次但凡要修改一点代码,就要全项目到处查找这个全局变量还漏下了哪里没修改到。好在后期项目组开展了代码优化工作,答主直接憋着一口气把这些陈年污垢都给清除掉了。

第二个故事:超级大的全局变量,导致代码编译失败。记得和别人一起做嵌入式消费产品的时候,有个软件开发的同事,特别喜欢用全局变量定义各种功能。但是他真的忽略了stm32那瘦弱的小身板真的放不下他的巨大无比的结构体数组。在stm32上,弄个结构体全局变量就够够了。还要弄个数组,相当令人发指!编译不通过,就修改堆和栈的大小,好不容易编译通过了。结果一运行的时候,多任务跑起来后各种不正常。耗费了好久发现,堆栈太小了,任务的变量发生了踩踏!!!

讲了这么多,并不是想妖魔化全局变量。全局变量用好了,是个非常好的伙伴,但是用的不好,那绝对是史诗级别的灾难。在答主的个人编码经验里,对于全局变量主要遵循三点

  1. 能不用尽量不用,尤其对于多线程多任务的场景下。使用任务通信机制进行数据传递+局部变量存储,基本可以满足开发需要。
  2. 如果必须使用,那么一定要限定起作用的模块。不要随便一个新加入的模块,一个extern就将全局变量透漏出去,以后维护起来又要被人骂屎山。
  3. 如果一个模块中的全局变量超过了3个,那么把他们放到一个结构体中。引用的时候一个extern足矣,不要一堆一堆的extern看着眼睛疼。

况。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被大佬糊弄的只会点灯的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值