关于单片机编程的循环以及全局变量应用的思考
最近,在看我的前同事写的stm32单片机程序,他是一个老鸟已经写单片机程序好多年了,我在通读他写的程序过程中有了一些感悟,记录下来,希望对后期自己写代码的时候能够有所启迪。
(1)单片机程序是由一个主循环(while(1))和若干个中断服务循环构成的,宏观上看是并行处理的,微观上是串行处理。宏观上看是有好多个循环构成的,主循环以及一些类似定时器中断服务函数这种是无条件运行的,还有一些事件驱动型中断服务函数(被动响应的,例如外部中断服务函数)平时处于挂起状态,只有当某一个条件满足的时候才会循环一次,但是也是有机会多次运行的。
(2)全局变量的作用。
全局变量的作用就是记录发生的某些动作,也就是程序运行过程中会产生某些数据,这个数据就可以写到全局变量中存储。我在我同事代码中发现他定义了大量的全局变量,在某些函数中不断对全局变量(或者结构体成员)进行写操作。而在该函数或者在其他独立函数中不断去读该全局变量的值,并根据该全局变量的值完成决定或者被指导运行哪个分支判断。读全局变量的值,当该全局变量满足某个分支判断就要运行分支判断满足的代码段;当然该全局变量不满足的时候直接跳过,等待下一次所在函数被调用到,然后再次读进行判断...往后依次类推。
(3)什么是好的代码。我最近一直在思考什么是好的代码呢?或者什么是有意义的代码。以前我一直认为好的代码(或函数)就是在函数体内部将传参值所有的情况都考虑到,并用C语言写出来。最近我看我同事的代码,我又有了另外一层思考:“好的代码还表现为被调用的所有函数以及函数内部各种分支判断(例如if-else)都能够有机会运行到。如果函数内部将所有情况都考虑并写出来了,但是我们在函数调用传参过程中某些情况一直没有机会运行到,那么我认为永远得不到运行的代码就是冗余代码和某一个函数写出来没有被调用是一样的”。好的代码就是无论是函数或者函数内部各个分支判断在程序运行过程中都能够有机会运行。冗余代码尽量少,不仅仅表现为不会被调用的函数尽量少,而且还表现为函数体内部得不到运行的代码段尽量少。
(4)程序运行产生某些数据----》存储在全局变量中----》另外程序运行读全局变量指导,并根据具体数值运行某些代码...往后依次类推。这个有点“三步曲”的意思了。
(5)最后,我想说的是,看单片机程序一定要将代码放到一个一个循环中去考虑,因为大部分代码都是处于某个循环中的(除了某些初始化代码),可能该循环正在被运行,也可能该循环处于挂起态需要满足某些条件才能被运行。