前言全局变量只是嵌入式系统的戈兰高地。
冲突最激烈的两个方面是:成为控制工程师;成为非嵌入式软件工程师。
控制工程师的特征通常被理解为“将变量写为全局变量有多方便”。
我采访了一位非常著名的博士/硕士,他之前是从控制实验室出来的,相继有近十个人。
面试的问题是用C语言编写PID。
当我进行接下来的几次面试时,我觉得没有意义,因为它们都以相同的风格编写。
大概是这样的:floatSetSpeed; floatrr; floatrr_last; floatKp,Ki,Kd;浮点积分结果floatPID(floatspeed){err = SetSpeed-speed; integral + = err; result = Kp * err + Ki * integral + Kd *(err -err_last); err_last = err; returnresult;}该代码的特点是所有变量必须在函数外部定义。
问他们为什么,答案是“易于调试的全局变量”。
实际上,对于在学校中进行自动控制的人来说,最重要的是控制的结果,而不是代码本身。
只要代码有效。
变量名称污染,低耦合等与它们不在同一个世界。
加入公司后,有些人将获得更好的代码质量,但有些人将继续以前的习惯。
在以前的公司代码库中,所有不可读的代码都是由一个或两个ControlEngineer编写的,并且函数在编写后将以其自己的名字命名。
要成为高级嵌入式工程师是非常困难的。
一方面,必须具有非常扎实的理论知识,同时,他必须具有大规模,高频CPU和多层PCB之类的丰富设计经验。
嵌入式硬件工程师的课程主要包括模拟电路设计,数字电路设计,电磁波理论等。
熟悉常用的放大器电路,滤波器电路和电源电路的设计和分析。
非嵌入式软件工程师的特征代码是,不能在.h文件中定义所有静态变量,并且必须将其写入.c文件中,以确保其他文件无法访问它们。
如果确实要访问其他文件该怎么办?然后为每个变量编写get / set函数!问题是静态变量写入.c文件中,并且编译器无法优化get / set。
结果,大范围的变量访问花费了CPU时间几倍的时间来进行get / set函数调用。
在许多情况下,嵌入式项目会将硬件压缩到极限。
90%的CPU利用率不过是97%。
(请注意,这些项目对实时性的要求很高,仅延迟一毫秒是不够的。
如果您在计算机上运行鼠标并获得了卡,都没关系。
)然后,为了封装,将许多/ sets在代码中。
?总结一般来说,嵌入式软件中的大多数代码都是由中断驱动的,并且固有地存在许多无法使用参数传递的变量。
全局变量的存在是因为正义在这里。
但是嵌入式软件远非如此,无需按照常规软件工程方法进行管理。
如果有人真的认为“嵌入式软件只要可以工作就可以工作,那么代码是否丑陋也没关系”。
纯粹是因为软件工程水平不高,而不是因为控制水平过高。
必须使用全局变量,对它们进行管理很重要。
一些基本的代码规则:如果仅在文件中调用全局变量,则只能在此.c文件中写入全局变量,而不能在.h文件中写入全局变量。
如果存在文件外调用,则应将全局变量写入.h文件中。
.h中的全局变量是全局可读的,但是只能写入此文件组。
要写入其他文件,请调用set函数。
无论在.h或.c中,所有全局变量都必须打包成同名的结构。
即使只有一个变量,也要将其写入结构。
例如,在PID.c中有一个pid_S,在PID.h中有一个PID_S。
这样,其他人不仅可以立即认识到变量在项目中是全局变量,在函数中是文件的静态变量,还是在函数中的本地变量,还可以轻松地追溯到该函数所属的文件。
不要在函数中编写静态变量。
函数中的静态变量几乎是实际项目中的错误生成器,不能简单地将其重置。
而且非常不友好进行单元测试。