背景:
最近我在看以前同事的单片机程序,发现整个项目存在很多循环,这样某些函数会被反复得到函数调用并运行,函数体内部组成分类就有了很重要意义,当然高手可能这是理所当然的事情,不过我这种初学者希望将这些"常识"记录下来,希望对自己以及大家写代码有所启迪。
(1)栈内存,也就是局部变量,这些变量存在运行环境堆内存中,每次循环都会被分配新的堆内存。
(2)静态局部变量:也就是使用static修饰的局部变量,这种有点像全局变量,但是它是存在全局变量去,但是作用域属于局部变量。它的特点是只定义一次,每次循环都跨过定义,只有在函数体内部的代码段才能访问,其他函数无法访问。
(3)堆内存:使用malloc()相关函数定义并申请的一段堆内存,一般会绑定一个指针变量,这里不展开说明,不过需要程序员自己把控使用完使用free()函数释放掉。
(4)代码段:
分为两类:第一类:无条件执行的,也就是没有if、switch等条件语句包含的代码,这些代码每次函数调用都会被运行。
第二类:存在与if条件判断中的代码段,当需要满足特殊条件的时候才会被运行,所以到底运行不运行由条件满足于不满足决定。第二类情况是最常见的情况,也是编程过程中需要特别注意的情况。单片机编程过程中往往在函数内部直接调用全局变量方式,而不是使用使用函数传参的方式。
对于全局变量的类型定义的一些思考:在看别人写的代码的时候,看到别人定义了结构体类型,往往会想我为什么想不到要定义这样的成员变量,我现在的想法是,因为定义的循环需要调用函数,函数体内会访问全局变量,当使用全局变量的时候,需要将某些独立的全局变量打包在一起,也就是"定义全局变量的时候想不到,可以在后面访问全局变量的时候再进行打包"。
最后,从整个项目程序看,是由好多个循环构成的,在某一时刻到底哪个循环正在循环是说不准的,也就是都有可能某个循环在前面,无法保证哪个一定在前,那个一定后执行。这样就会存在某个循环中当需要读取全局变量的数值时,该全局变量的数据可能是未准备好的,也就是未写入有效数值,这个时候就需要使用if/switch等分支判断语句能够跨过去,也就是函数体内部有某种判断当条件不满足时直接跨过,当条件满足时才运行有用代码,对全局变量进行读操作。这也是我在前面说函数体内部某些代码尽量包含在某些分支判断中的原因。