1

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

 3 years ago
source link: https://blog.csdn.net/weixin_43982452/article/details/119651790
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

original.png
无际单片机编程 2021-08-12 19:20:11 2558

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

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

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

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

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

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

我在这个阶段徘徊了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,在你连功能代码都不知道怎么实现的时候,就不要去想架构的事情。

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK