我最近也意识到了程序架构这一点
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《单片机开发项目全局变量太多怎么管理?》, 一起来围观吧
https://blog.csdn.net/weixin_43982452/article/details/121387105
最近有几个小伙伴反映说自己写程序感觉很乱,不知道怎么去规划,想到什么就写什么,全局变量满天飞,代码一多就出现好多问题。
而且如果自己写的程序不加注释的话,过几个月发现看不懂了。
那程序架构到底是什么?
我认为是一种成熟的编程思维,是经验的总结,比如RTOS就是属于一种程序架构,STM32固件库也是一种程序架构。
不同的人,编写出来的程序架构都不一样,有大的有小的,最重要是够用就好。
而全局变量多导致程序乱的问题,就可以用程序架构的模块化编程特点来解决
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《C语言开发单片机为什么大多数都采用全局变量的形式?》, 一起来围观吧
https://blog.csdn.net/weixin_43982452/article/details/119651790
现在想想走弯路付出的时间代价真的是太大了。
很多人可能好奇,C语言开发单片机为什么大多数都采用全局变量的形式。
其实这个说法不完全正确,还是那句话,可能是你接触的代码都是这样子,而更好的代码结构你或许没接触到。
你的思维可能还是处于c语言是面向过程编程的误区,其实在做一些中大型项目的时候,为了保证程序可移植性和可扩展性,都会采用面向对象的编程思维。
最典型的例子就是STM32的固件库。
如果大家研究过固件库那些外设的.c文件,你会发现基本没有全局变量,为什么?
我的理解是这样的:
1.对于一个资深工程师来说,全局变量绝对不允许用来被多个不同的.c文件调用,否则移植性极差,而且程序大了,文件多了,如果全局变量都声明在.h文件里,你怎么保证变量名不会重复?
2.如果我用全局变量,那变量的应用范围仅限该.c文件内,也就是相当于static的作用域。
除了没有全局变量以外,不知道你发现没有,它们的.h文件定义了很多结构体,枚举。
然后,在.c文件里面的那些函数呢,基本上就是对这些结构体进行操作。
可能你现在一脸懵逼,这是什么神操作????
其实啊这就是所谓的面向对象的编程思维,难怪stm32的固件库移植性和可扩展性超强!
STM32固件库把每个外设可以配置的参数都通过结构体封装起来,比如说GPIO有具体引脚(GPIO_Pin),频率(GPIO_Speed),工作模式(GPIO_Mode)。
不同的参数对应不同的设置值,比如说上图的GPIO工作模式,通过枚举来给值重命名,这样可以增强可读性。
而这些值其实就是最终去配置单片机寄存器的。
大家发现没有,固件库的这种种操作都是非常有针对性的,首先凡事皆对象:GPIO、TIMER、USART、DMA、NVIC等等。
先把这些对象的属性通过结构体定义出来,后续大多函数都是基于这个结构体去操作的。
这就是面向对象的思维(个人从业多年的理解)。
所以,这就展现了一个工程师的代码水平了,代码写得好不好不是看你的代码风格和规范有多好,可移植性、可扩展性强,执行效率高才是核心。
很多新手对这些底层的思维没有一个很清晰的认知,就瞎搞,比如说强行用指针装逼,实际上是治标不治本的,搞不好还把自己坑了(以前经常干这种蠢事)。
第一个就是上面说的STM32标准库,还有就是各种协议栈,比如说蓝牙的协议栈,又或者是各种实时操作系统。
这些都是你最好的学习渠道。