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

Posted 无际单片机编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言开发单片机为什么大多数都采用全局变量的形式?相关的知识,希望对你有一定的参考价值。

一个代码狗,成长经历都是莫名相似的。

你应该和我有类似的经历,虽然功能都能做出来,但是总觉得自己代码缺了点什么。

就是怎么写都觉得不够完美,感觉代码的水平介于专业和不专业之间。

自己的认知水平也非常有限,也不知道那些大佬写的程序是怎么样的。

曾经自以为,把某些功能独立写一个函数,然后多用指针程序就显得比较牛逼了。

其实有时候自己都觉得有点牵强,有种强行装逼的感觉,明明可以写的更简单更好理解。

我在这个阶段徘徊了3年左右,一直没有提升,主要当时主要用51单片机在做项目。

相对比较简单,基本上在一个mian.c文件就能做完整个产品功能,一些数据也是通过全局变量的方式去存储,虽然使用方面,但是程序如果大了变量不注释有时候就忘记是干嘛用的了。

那几年一直接触不到大神写的代码,自己的代码也一直处于这种水平无法提升。

所以,一个人代码水平怎么样,其实跟去你有多少年经验没有必然的联系,贵人和环境决定你的成长速度。

如果你一辈子都接触不到大佬写的代码,那你一辈子的水平可能都处于中级水平。

虽然我在这个行业做了10年,但是真正代码水平有质的飞越也就在那2,3年,还是自己摸索的情况下,如果当初有人带,成为现在的水平其实只需要1年。

现在想想走弯路付出的时间代价真的是太大了。

很多人可能好奇,C语言开发单片机为什么大多数都采用全局变量的形式。

其实这个说法不完全正确,还是那句话,可能是你接触的代码都是这样子,而更好的代码结构你或许没接触到。

你的思维可能还是处于c语言是面向过程编程的误区,其实在做一些中大型项目的时候,为了保证程序可移植性和可扩展性,都会采用面向对象的编程思维。

最典型的例子就是STM32的固件库。

如果大家研究过固件库那些外设的.c文件,你会发现基本没有全局变量,为什么?

我的理解是这样的:

1.对于一个资深工程师来说,全局变量绝对不允许用来被多个不同的.c文件调用,否则移植性极差,而且程序大了,文件多了,如果全局变量都声明在.h文件里,你怎么保证变量名不会重复?

2.如果我用全局变量,那变量的应用范围仅限该.c文件内,也就是相当于static的作用域。

除了没有全局变量以外,不知道你发现没有,它们的.h文件定义了很多结构体,枚举。

然后,在.c文件里面的那些函数呢,基本上就是对这些结构体进行操作。

可能你现在一脸懵逼,这是什么神操作????

其实啊这就是所谓的面向对象的编程思维,难怪stm32的固件库移植性和可扩展性超强!

我们拿GPIO来举例:

STM32固件库把每个外设可以配置的参数都通过结构体封装起来,比如说GPIO有具体引脚(GPIO_Pin),频率(GPIO_Speed),工作模式(GPIO_Mode)。

不同的参数对应不同的设置值,比如说上图的GPIO工作模式,通过枚举来给值重命名,这样可以增强可读性。

而这些值其实就是最终去配置单片机寄存器的。

大家在使用固件库的时候,都是先定义好结构体,然后初始化,再把这个结构体的地址作为形参传输相关初始化函数完成配置。

大家发现没有,固件库的这种种操作都是非常有针对性的,首先凡事皆对象:GPIO、TIMER、USART、DMA、NVIC等等。

先把这些对象的属性通过结构体定义出来,后续大多函数都是基于这个结构体去操作的。

这就是面向对象的思维(个人从业多年的理解)。

所以,这就展现了一个工程师的代码水平了,代码写得好不好不是看你的代码风格和规范有多好,可移植性、可扩展性强,执行效率高才是核心。

很多新手对这些底层的思维没有一个很清晰的认知,就瞎搞,比如说强行用指针装逼,实际上是治标不治本的,搞不好还把自己坑了(以前经常干这种蠢事)。

如果你刚从事这个不久,又接触不到好的代码架构,可以看看我19年录制的那个程序架构教程。

这个架构最大的好处在于2点:

  1. 精简,占用资源少。
  2. 经过大批量产品验证。
  3. 提供了很多组件解决产品痛点(任务管理、队列、LED特效、多按键检测等)。
  4. 基于这个架构能缩短你产品研发周期。

反正我这几年一直在用这个架构,非常爽,直接复制粘贴,基本2-3周完成一个产品软件部分。

也算是我这么多年一个精华总结之一,价值3000不为过,现在无偿分享给大家学习。

还是那句话,如果你有机会接触更好的代码,那你的水平会像开挂一样提升,如果接触不到一辈子可能都会原地踏步。

要看的直接找无际单片机编程,或者到小破站搜就可以了。

最后分享下,我后续继续提升的渠道。

第一个就是上面说的STM32标准库,还有就是各种协议栈,比如说蓝牙的协议栈,又或者是各种实时操作系统。

这些都是你最好的学习渠道。

不过学习需要循环渐进,切忌在新手的时候去打BOSS,在你连功能代码都不知道怎么实现的时候,就不要去想架构的事情。

因为你根本不知道架构的价值和意义,你学了暂时无法领悟里面的精髓。

原创不易,如果对你有帮助,麻烦给我安排个"赞”吧~

以上是关于C语言开发单片机为什么大多数都采用全局变量的形式?的主要内容,如果未能解决你的问题,请参考以下文章

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!

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

[技术]为什么单片机C语言编程时某一变量有时被随意修改

2.C语言------程序运行为什么需要内存2

51单片机c语言中断函数不能进行参数传递,是啥意思,谁能解释一下

怎么样把hex转化成C语言形式?