嵌入式C编程,全局变量越少越好

发布时间:2024-10-18 15:10:10  

本文谈一谈嵌入式C编程中全局变量问题。

嵌入式特别是单片机os- less的程序,最易范的错误是全局变量满天飞。 这个现象在早期汇编转型过来的程 序员以及初学者 中常见,这帮家伙几乎把全局变量当作函数形参来用。 在.h文档里面定义许多杂 乱的结构体,extern一堆令人头皮发麻的全局变量,然后再这个模块里边赋 值123,那个模块里边判断123分支决定做什么。 每当看到这种程序, 我总要戚眉变脸而后拍桌怒喝 没错,就是怒喝。

不否认全局变量的重要性,但我认为要十分谨慎地使用它,滥用全局变量会引申带来其它更为严重的结构性系统问题。

什么全局变量要越少越好

它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。

它会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。

由于 软件的分层不合理 ,到了 后期维护 ,哪怕仅是增加修改删除小功能, 往往要从上到下掘地三尺地修改 ,涉及大多数模块,而 原有的代码注释却忘了更新修改 ,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气。

全局变量大量使用,少不了 有些变量流连忘返于中断与主回圈程序之间 这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。

无需多言,您已经成功得到一个畸形的系统, 它处于一个神秘的稳定状态! 你看着这台机器,机器也看着你,相对无言,心中发毛。 你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。

全局变量大量使用的后果

“老人”气昂昂,因为系统离不开他,所有“雷区”只有他了然于心。当出现紧急的bug时,只有他能够搞定。你不但不能辞退他,还要给他加薪。

新人见光死, 但凡招聘来维护这个系统的,除了改出更多的bug外,基本上一个月内就走人,到了外面还宣扬这个公司的软件质量有够差够烂。

随着产品的后续升级,几个月没有接触这个系统的原创者会发现,很多雷区他本人也忘记了,于是每次的产品 升级维护周期越来越长 ,因为修改一个功能会冒出很多bug,而 按下一个bug,会弹出其他更多的bug 在这期间,又会产生更多的全局变量。 终于有一天他告诉老板,不行啦不行啦,资源不够了,ram或者flash空间太小了,升级升级。

客户投诉不断,售后也快崩溃了,业务员也不敢推荐此产品了 ,市场份额越来越小,公司形象越来越糟糕。

要问对策,只有两个原则

能不用全局变量尽量不用,我想除了系统状态和控制参数、通信处理和一些需要效率的模块,其他的基本可以靠合理的软件分层和编程技巧来解决。

如果不可避免需要用到,那能藏多深就藏多深。

  • 如果只有某.c文件用,就static到该文件中,顺便把结构体定义也收进来;

  • 如果只有一个函数用,那就static到函数里面去;

  • 如果非要开放出去让人读取,那就用函数return出去,这样就是只读属性了;

  • 如果非要遭人蹂躏赋值,好吧,我开放函数接口让你传参赋值;

  • 实在非要extern侵犯我,我还可以严格控制包含我.h档的对象,而不是放到公共的includes.h中被人围观,丢人现眼。

如此,你可明白我对全局变量的感悟有多深刻。 悲催的我,已经把当年那些“老人”交给我维护的那些案子加班全部重新翻写了。 你能明白吗,不要让人背后唾弃你哦。

最后补充

全局变量是不可避免要用到的,每一个设备底层几乎都需要它来记录当前状态,控制时序,起承转合。但是尽量不要用来传递参数,这个很忌讳的。

尽量把变量的作用范围控制在使用它的模块里面,如果其他模块要访问,就开个读或写函数接口出来,严格控制访问范围。 这一点,C++的private属性就是这么干的。 这对将来程序的调试也很有好处。 C语言之所以有++版本,很大原因就是为了控制它的灵活性,要说面向对象的思想,C语言早已有之,亦可实现。

当一个模块里面的全局变量超过3个(含)时,就用结构体包起来吧。 要归0便一起归0,省得丢三落四的。

在函数里面开个静态的全局变量,全局数组,是不占用栈空间的。 只是有些编译器对于大块的全局数组,会放到和一般变量不同的地址区。 若是在keil C51,因为是静态编译,栈爆掉了会报警,所以大可以尽情驰骋,注意交通规则就是了。

单片机的os-less系统中,只有栈没有堆的用法,那些默认对堆分配空间的“startup.s”,可以大胆的把堆空 间干掉: 详解STM32单片机的堆栈

程序模型?如何分析抽象出来呢,从哪个角度进行模型构建呢?很愿意 聆听网友的意见。 本人一直以来都是从两个角度分析系统,事件--状态机迁移图 和 数据流图,前者分析控制流向,完善UI,后者可知晓系统数据的缘起缘灭。 这些理论,院校的《软件工程》教材都有,大家不妨借鉴下。 只不过那些理论,终究是起源于大型系统软件管理的,牛刀杀鸡,还是要裁剪一下的。 【付费】STM32嵌入式资料包

文章来源于:单片机与嵌入式    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    嵌入式开发:在微控制器基础上使用Python进行原型设计和开发;Python很实用,但脚本语言通常是为PC应用程序的资源而设计的。然而,嵌入式应用程序通常需要处理更少的问题。Adafruit的......
    足够的计算能力让Python进行嵌入式开发,尽管解释器的开销很大。 当然,IEEE Spectrum还特别提示,不能过于迷信榜单,一方面,多数情况公司都要求工程师同时掌握Python和SQL,另一方面,各种C和Java语言......
    、调试还是与硬件共同设计或集成。事实上,软件占据了开发人力资源的最大份额——与本研究之前的迭代相比,甚至更多。 对于软件开发来说,CC++仍然主导着其他软件编程语言。这种对C语言的偏爱在北美以外的地区和更有经验的嵌入式......
    单片机属于嵌入式系统吗?嵌入式开发要学哪些课程?;我们在做产品开发的时候,基本很少去了解这些概念性的东西。 后面我特意去了解了一下,今天就把这些概念分享给有同样问题的朋友。 嵌入式一般叫嵌入式......
    直接把C语言自动转换成对应的硬件。然而,HLS仍然需要用户有许多硬件知识,使用起来对于大多数嵌入式开发者并不容易。为此, 一年半前,赛灵思又推出软件定义的SDSoC™ 开发环境,通过提供类似嵌入式 C......
    英飞凌AURIX™ TC3xx、TC4x、TRAVEO™ T2G 和 PSoC 系列微控制器支持 Rust 语言;  【导读】安全系统的开发对汽车市场至关重要。Rust 编程语言可用于内存安全软件的嵌入式开发......
    ,EMWIN 等。以及一些应用。 另外值得一提的是,C 语言是嵌入式开发的基础中的基础。如果 C 语言不过关,很大程度限制嵌入式学习的进度与深度。在这里推荐3本书学习C语言,刚开始可以参看谭浩强的《C程序......
     代表把R0寄存器中的30,31位置1,故C语言嵌入汇编时那些写的 orr    r1, r1, #0xc0000000  这个0xc0000000就是这样来的。 ......
    个零配置的数据库,这意味着与其他数据库不一样,它不需要在系统中配置。 下面就来讨论一下,如何把SQLite移植到嵌入式Linux系统中。以下是在S3C2416嵌入式开发板上(Linux3.6.6内核)移植......
     S3C2440嵌入式开发板构成,内部运行嵌入式Linux操作系统,主要负责系统的控制以及与从控制器DSP的通讯等任务,主控制器通过串行通信接口(UART)实现与从控制器的数据通信,包括......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>