当前位置:首页 > 公众号精选 > 嵌入式微处理器
[导读]01前言全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是:1.做控制的工程师;2.做非嵌入式的软件工程师。02做控制的工程师特点他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master,前前后后陆续有快十个人。面试...



01

前言


全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是:1. 做控制的工程师;2. 做非嵌入式的软件工程师。
02

做控制的工程师特点


他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master,前前后后陆续有快十个人。面试问题是用C写PID。到后面的几位面试的时候我都觉得没有看的意义了,因为全都写的是同一个风格。大概就是这样的:
float SetSpeed;float err;float err_last;float Kp,Ki,Kd;float integral;float result;
float PID(float speed){ err=SetSpeed-speed; integral =err; result=Kp*err Ki*integral Kd*(err-err_last); err_last=err; return result;}
代码的特点就是所有的变量一定定义在函数外面。问他们为什么,回答是“全局变量方便调试”。
事实上,在学校里做搞自动控制的人最重要的根本就是控制的结果,而不是代码本身。代码只要能工作就行。变量名污染,低耦合之类的和他们就不在同一个世界。进了公司有些人代码质量会变好,但有的还是会延续之前的习惯。前公司代码库里面凡是看不懂的代码一律都是那一两个Control Engineer写的,写完了还会用自己的名字给函数命名的那种。
要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。

03

做非嵌入式的软件工程师特点


代码的特点就是所有的静态变量都不可以定义在.h文件里,必须写在.c文件里以确保别的文件没法访问它们。
别的文件真要访问怎么办?那就给每一个变量写get/set函数啊!问题是静态变量写在.c文件里编译器是没法优化get/set的。结果就大面积的变量访问要花几倍的CPU时间去做get/set的函数调用。嵌入式项目很多情况下对硬件的压榨是很极端的,CPU利用率90%都不算什么,顶到97%都是有的。(注意下这些项目是实时性要求很高的,晚一个毫秒算不完都不行。不是跑在电脑上鼠标卡一卡也无所谓的。)然后为了封装性,在代码里面塞这么多get/set吗?

04

总结


总的来说,嵌入式软件里大部分的代码都是中断驱动的,天生就有很多变量是没法使用参数传递的。全局变量的存在,是因为正义站在这边。但是,嵌入式软件远远没有特殊到不需要按照正常软件工程方法去管理的地步。要真有人认为“嵌入式软件只要能工作就成,代码丑一点无所谓的”纯粹是软件工程水平不行,不是因为控制水平太高。
全局变量一定是要用的,管理它们也很重要。一些基本的代码规则:
  1. 如果只是文件内调用,全局变量只能写在这个.c文件里,不要写进.h文件。
  2. 如果有文件外调用,全局变量要写在.h文件里。
  3. .h里面的全局变量全局可读,但是只有本文件组可以写。别的文件要写请调用set函数。
  4. 所有的全局变量无论在.h还是.c里面都要包成同名struct。哪怕只有一个变量也要写进struct里面。比如PID.c里面有一个pid_S,PID.h里面有个PID_S。这样其他人不仅可以立即识别出一个变量是project内global/文件内static/函数内local,同时还能轻松追溯到这个函数是属于哪个文件的。
  5. 不要写函数内的static变量。函数内的static变量在实际的项目中几乎就是bug生成器,没法简单的reset。而且对unit test非常不友好。

END
来源:网络版权归原作者所有,如有侵权,请联系删除。
嵌入式ARM

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

工作也有些年头了,从一位技术新人成长到现在自诩小牛级别的人物,少不了要自己寻找资料阅读。论坛上、书店里、杂志上......要嘛是些菜鸟浅薄的自炫处女贴,要嘛是高屋建瓴云里来雾里去的概念文,好不容易遇到个实践型高手写的文章...

关键字: 全局变量

关注、星标公众号,直达精彩内容来源:SedateFire整理:技术让梦想更伟大 | 李肖遥工作也有些年头了,从一位技术新人成长到现在自诩小牛级别的人物,少不了要自己寻找资料阅读。论坛上、书店里、杂志上......要嘛是些...

关键字: 全局变量 编程 嵌入式C

SystemVerilog提供四种不同的实例之间的通信或连接方式:端口、句柄、全局变量、直接层次引用。 端口是静态实例世界的成员之间的连接,如module和interface实例。因此,它们可能不会在动态实例世界类中使用...

关键字: 全局变量 端口

队列(queue)是一种只能在一端插入元素、在另一端删除元素的数据结构,遵循先入先出(FIFO)的规则。

关键字: RTOS 全局变量 通信

前篇 《由static来谈谈模块封装》 基本实现了对外隐藏属性,隐藏局部模块函数,开放接口的功能。对于这个话题还有些点没有深入探讨:为什么要这样做?以及这样做的好处是什么?

关键字: 嵌入式 全局变量

何谓透传? 根据百度百科给出的定义如下:        透传,即透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。    ...

关键字: C语言 全局变量

01 前言 全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是: 1. 做控制的工程师; 2. 做非嵌入式的软件工程师。 02 做控制的工程师特点 他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非...

关键字: C语言 全局变量

点击上方蓝字关注我哦~ 01 前言 全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是1. 做控制的工程师 2. 做非嵌入式的软件工程师。 02 做控制的工程师特点 他们普遍的理解就是“变量都写成全局该有多方便”。...

关键字: C语言 全局变量

关注、星标公众号,不错过精彩内容 转自:嵌入式ARM 01 啥是全局变量 说起全局变量,就不得不提到“全局变量,局部变量,静态全局变量,静态局部变量”,这些都是编程语言中的基本概念。变量分为局部与全局,局部变量又可称之为...

关键字: C语言 全局变量 函数 源文件

文/付斌 全局变量 作为一个嵌入式工程师 肯定有前人提示过你不要滥用 就在之前丰田公司就出过这么一档子事儿 某位软件工程师因使用超过10000 个全局变量 在法庭上被“喷”是“一坨”代码 在工程实践中 总共采用5个或10...

关键字: C语言 全局变量 函数 源文件
关闭