微头条丨嵌入式软件工程师:两手都要硬!
1992年,那是一个春天,有一位老人,在中国的南海边写下诗篇,其心也比金坚,其字也动人心弦,其中有云:一手抓经济建设,一手抓精神文明建设,两手都要抓,两手都要硬。多年下来,勤劳、务实的中国人民在邓公嘱托之下,聚精会神搞建设,全心全意谋发展,在大力发展经济、满足人民对物质生活的美好期待之余,也以各种低俗网络小说、无脑商业大片、娱乐至上的各大卫视节目丰富着人们的精神生活。除了国家和社会的发展,两手都要抓,两手都要硬的原则也以其颇合“中庸之道”,在各个领域发挥着重要的指导作用,比如笔者,就在多年职业生涯的风风雨雨中,悟出想干好嵌入式软件工程师,软件、硬件两手都要硬的经验体会。
(相关资料图)
硬件搭台 软件唱戏
嵌入式软件开发和PC软件开发多有不同,究其根源,个中区别主要归因于硬件平台的差异。在Wintel联盟多年的绞杀下,PC软件就一个硬件平台,无论多么花哨的PC软件,也都只是在x86这个大观园中打转悠。多年来用情专一,两两不相生厌,洒家也是颇为佩服PC软件工程师的。不过嵌入式软件就不同了,且看嵌入式系统的定义:
“以应用为中心、以计算机技术为基础,软、硬件可裁剪,适应于应用系统对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。”
可以说,嵌入式系统是硬件搭台,软件唱戏,软件和硬件面向特定应用,高度可定制,同时也高度融合,正所谓我中有你、你中有我,你侬我侬、水乳交融。硬件搭不好,软件跑不了,所以在开发软件之前一般要先调好电路,好似把舞台搭好一般。软件不能跑,硬件瞪眼了,没有功能的硬件就是女娲娘娘手中的小泥人,软件就好像那一口仙气,没有这口仙气,硬件的世界就是天地玄黄、宇宙洪荒,女娲娘娘吹了这口仙气,硬件的世界才大梦初醒,挥洒张扬。
搭帮结伙 地老天荒
据说恋爱中的情侣、婚姻中的两口子都有那么几天,疯狂地想要掐死对方,情绪过去,又会牵起手共同走向前方。其实,在日常开发工作中,嵌入式硬件工程师和软件工程师有时也会吵得不可开交,大有不共戴天之势,洒家多年工作生涯,一向以和为贵,有时也会失了方寸吼上一番,但是,好在嵌入式工程师是世界上最单纯、最可爱的群体,心地单纯的软件工程师和硬件工程师大多数时间都是举案齐眉、卿卿我我,并在多年的磨合中更加合作默契,心心相印。
软件工程师和硬件工程师之间的合作就像搭帮结伙,一起说相声。相声演员经常把一句话挂在嘴边:“三分逗,七分捧”,但是据说分账时又会没皮没脸地四六开(逗哏拿六成,捧哏拿四成),在嵌入式这个行业也有一个不成文的说法,硬件和软件三七开,更有甚者(肯定是一小撮自大过头的软件工程师)认为软件能占到80%的工作量。洒家并不赞同这种歧视性的分法。世尊当年于菩提树下,夜瞩明星,悟道成佛,初成正觉已,叹曰:“奇哉,一切众生皆有如来智慧德相,但以妄想、分别、执着不能证得。”人呐,本来可享受无边清凉,却因为头上安头、妄生分别,轮回于热恼之中不可自拔。
可是话说回来,做为道道地地的凡夫众生,做为一名略懂硬件但专职干软件的嵌入式软件工程师,我还是要站在自己这个小群体中分别一番的。
嵌入式软件工程师是一个光荣而神圣的角色,他单纯而内敛,视名利如浮云,在日复一日的编码中挥洒青春和热血。他使出浑身解数,将代码捧于掌心,精加工,细打磨,为的只是让寿命周期长的系统能够经受住岁月的洗礼,而依然光芒绽放。也许在日常生活中他老实巴交、呆板木讷,也许在社会交际中他懵懵懂懂、进退失措,但是,他是一个高尚的人,一个脱离了低级趣味的人,一个愿意把爱播撒到代码的天地中自得其乐的“大写的人”。
当然,物有千差万别,人分三六九等,出色的工程师总是凤毛麟角,可遇而不可求。对于嵌入式软件工程师来说,窃以为,想要跻身于优秀之列,他对硬件的了解程度至少需要达到半个硬件工程师的水平。
半个硬件工程师
嵌入式软件编程显然不同于PC软件开发,它和硬件密切相关。想写好嵌入式软件代码,就必须了解清楚所使用MCU的硬件特性、各个外围电路和接口电路的原理。不仅要深挖细究MCU内核架构的知识,是否支持浮点处理器/DSP,是否支持协处理器、指令数据缓存,还要了解MCU的编程模型、各种存储器的地址空间分配及其访问效率如何,在MCU之外,还必须了解各种电路知识,什么地方需要上下拉,什么地方需要加滤波电路,什么地方必须隔离,哪里必须加抑制器件,等等不一而足。
为什么需要了解到这种程度呢?
一来是软硬结合,更好地实现用户需求,比如输入捕捉,如果是通过上升沿或者下降沿捕捉,加了不合适的滤波电容会造成对沿的破坏,不加滤波电容就会受困于各种空间干扰产生的杂波。倘若硬件工程师搬来的是加了不合适电容的电路,搞得沿之间位宽失真,便会出现数据不正常的偶发故障,倘若硬件工程师搬来的是不加电容的电路,搞得软件工程师必须进行软件滤波,把代码搞得又复杂又难解,你说这怨谁来着?
二来是方便定位Bug。爱因斯坦曾经说过,“提出一个问题往往比解决一个问题更重要,因为解决一个问题也许仅是一个数学上的或试验上的技能而已,而提出新的问题、新的可能性、从新的角度去看旧的问题需要有创造性的想象力,而且标志着科学的真正进步。”钻研硬件电路可以帮助软件工程师提出更多解决问题的思路,发现导致Bug的更多可能性。一般来说,当遇到Bug时,对硬件一知半解的软件工程师只在代码层面上打转转,基本不会在硬件方面提出问题,最终为了迎合蹩脚的硬件设计出别扭无比的代码,却不曾想,只要稍稍改变一下硬件设计,就可以轻松且优雅地完成代码设计。
三来,艺多不压身,求人不如求己。当我们对硬件电路设计起了怀疑,倘若自己悄没声地拿起烙铁飞个线、换个元件,验证了自己的思路,这时直起腰版、拿着板子理直气壮地去找硬件工程师,岂不是顺顺利利,又送顺水人情?倘若直接拿着板子,心底发虚面上露怯地去找硬件工程师理论,一场唇枪舌战在所难免,腥风血雨不说,到头来硬件工程师硬着头皮给你调调电路,真是解决了问题还好说,若是自己思路错了,那不是自找苦吃?上个班,挣点钱养家糊口而已,当个老好人,和同事其乐融融多好,吵来吵去,搞得那么辛苦,何必来着?
后记
在嵌入式软件工程师的培养过程中,先搞个一两年硬件是很有必要的,笔者当年走的就是这么个路子,现如今虽然水平一般,但是相比较而言,还是比那些“纯软”的工程师多了几分优势,主要体现在出了问题,思路更加开阔一些,不会把嫌疑仅仅局限在代码上。反过来,其实硬件工程师也要多多少少懂些软件,不能只会连线,而要略微考虑一下功能的具体实现。比如进行输入捕捉时,只顾及走线便利,随便接到MCU的IO口上,而不是专用的输入捕捉模块上,还不得把软件工程师逼疯喽?当然,闻道有先后,术业有专攻,也不是非得软硬精通,只需要互相略懂,工作就会轻松愉快很多了!