C语言开发单片机如何避免全局变量过多混乱

发布时间:2022-12-15  

每个攻城狮的成长经历,目标总是相似的。

刚开始学习这门技术的时候,希望自己能独立做出各种各样智能的产品。

有了这能力,更有竞争力,也更挣钱,在越来越智能的时代不至于被抛弃。

可惜并不是每个人都能走到终点。

很多人学着学着就学不动了,最后遗憾放弃

有些人虽然走了很多弯路,凭借惊人毅力一样挺了过来。

这一路有太多的瓶颈需要突破,每一个都可能决定你是天选之人,还是淘汰者。

对于刚入行的工程师来说,有一个瓶颈非常难突破。

那就是如何让自己写出来的程序更专业。

有很长一段时间,虽然功能自己都能写出来,但是总是觉得自己的程序写的乱七八糟。



上图是我刚从事单片机开发1年写的程序,不知道大家看出什么问题没有。

我来给大家分析下:

1.整个项目程序都写在main函数里

2.全局变量过多

3.没模块化思维

就是这个项目程序逻辑,调到我快崩溃了。

其实产品也不复杂,就是一个太阳能热水器的控制板。

不过一组合起来,功能之间就会相互冲突得很厉害,导致改了这里,那里又出问题。

一出问题所有功能又要重新测一遍。

如果你没经历过这种问题,你不会理解程序架构的重要性。

程序架构的好坏会影响整个程序的方方面面。

比如说全局变量,后面我也意识到了这个问题。

就是全局变量多了,程序大了会掌控不住。

第一个是要避免全局变量名字重复,第二个如果哪个变量没做注释,1个月后干干净净。

特别是你把整个项目功能的全局变量定义在一起的时候,简直就是灾难。

但是,不用全局变量肯定也是不可能的

只是要用的合理,这时候就比较考验工程师的经验了。

我是怎么做的?

拿我们无际单片机编程物联网网关那个课程项目来举例。



我采用了模块化编程的思维,从整体架构上分硬件层和应用层。

一般来说还有中间层,比如解析一些协议之类,项目中间层的代码不多,被我简化了。

每个功能模块的全局变量,都定义在各自的.c文件里。

跟我做的那个太阳能热水器控制板的程序对比,虽然全局变量的数量可能没变,但是很明显模块化的写法更加清晰。

当然,这不是让代码看起来更清爽这么简单,还有功能可扩展性强,可移植性强的优势。

可扩展性强,听起来是一个专业术语,可能很多新手不是很理解什么意思。

你试想一下,好不容易产品功能代码完成,测试也没问题了,交付给客户测试。

客户测试完,说要改功能,来来回回改个7,8次,你是不是撕碎他们的都有了?

这是常态,客户对于技术是一个小白,他并不知道他的一句话的背后,你需要付出多少。

有经验的工程师,从学会有能力偷懒开始,再急的项目,你做完还有空闲时间那才牛逼。

这就是代码可扩展性的重要性。

下面再来说说可移植性。

可移植性是相对单片机(硬件平台)来说的。

比如说这个项目以前我在STM32单片机上做的,现在芯片涨价了,老板要求换成GD32的替代。

这个时候就考验你程序的移植性了。

有经验工程师写出来的程序,一般只需要改改硬件层的外设接口,应用层的产品逻辑功能代码基本不用动。

而菜鸡可能就要重写整个代码了…

一个全局变量的问题,看似简单,要想解决,还是得站在整个程序架构的角度去思考。

如果,你离这个阶段还很远,还有一个比较便捷的方法。

就是用结构体

用面向对象的思维,把同类的变量统一定义成结构体。

比如说时间分为年、月、日、周、时、分、秒。

如果用单独全局变量的形式,比较零散,也比较难管理。



这种,就比较适合用结构体了,因为这些都属于”时间”这个对象的参数。



类似的还有很多,比如说GPIO也算一个对象,参数有端口号、引脚号、输入模式、输出模式、频率等。

可以看看STM32固件库,就是很典型的面向对象编程思维。


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

相关文章

    周期不同:全局变量的生命周期和程序周期一样,局部变量随着语句块的结束而结束; 4、当局部变量和全局变量同名时,优先使用局部变量,使用全局变量是要用域成员运算符;   4、结构体和联合体的区别 1、结构......
    嵌入式C语言中各变量存储的位置;局部局部静态、全局全局静态变量区别如下:本文引用地址:· 局部变量:栈区; · 局部静态变量:静态区; · 全局变量:静态区的常量区; · 全局静态变量:静态......
    相同; 3、确保你的程序中没有未调用的函数。 在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得......
    、确保你的程序中没有未调用的函数。 在keil c里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点keil c做得很愚蠢,但也......
    网上的资料,理解堆和栈的区别: - (1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。 - (2)堆区(heap):一般......
    函数的通用性,不利于函数的重复调用。 3.降低程序的清晰度,每个函数执行有可能改变全局值,无法清晰判断全局变量的值。 4.全局变量永久占用内存单元。 原则: 能用局部变量就不用全局变量。若局部变量和全局变量......
    降低你的访问速度,另一个避免使用全局变量的原因是你必须在你系统的处理过程中调节使用全局变量,因为在中断系统和多任务系统中,不止一个过程会使用全局变量。 6、为变量分配内部存储区 局部变量和全局变量......
    关于STM32存储的堆栈地址;由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2......
    -data 的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与 RW-data 的性质一样,它们也常驻在 RAM 区,因而应用程序可以更改其内容。例如 C 语言中使用定义的全局变量,且定......
    0000)分配内存给全局变量和静态变量,并且堆是向上增长,栈是向下增长。   1,首先来看:栈(STACK)的问题。   函数的局部变量,都是存放在“栈”里面,栈的英文是:STACK.STACK的大......

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

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

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

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

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

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

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