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

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

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

版权声明:本文为CSDN博主「无际单片机编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43982452/article/details/119651790

生成海报
点赞 0

无际单片机编程

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

L298N电机驱动的使用

前言 博主为某大学电气专业大学生,以学习为目的写下该文,内容主要为以51单片机为例简单介绍L298N电机驱动模块的使用。内容若有不适,欢迎指正、补充和联系。 提示:以下是本篇文章正文内容

CH579(M0内核)中断向量表偏移处理

通常情况下,为了产品后续的升级,程序都会分为两部分BootloaderApp,因为有两个程序,所以需要对中断向量表进行处理,否则,当程序已经跳转到app中运行,当中断产生的时候,响应函数仍然是Bootloader的中断函数,而不是app的 在S