电子说
当被人问起“什么是嵌入式系统”时,无需看过我的文章,有一种狡猾的说法肯定是挑不出任何错误的——套用知乎上一类著名的问答体,“如何快速的假装/成为某个领域的专家”——你可以故作认真的说:
“嵌入式系统首先是一个计算机系统”,然后大谈你对软件和硬件的看法……
为了在几乎没有逼格的行业中让大家能够有机会装逼,下面我就教大家一种关于嵌入式系统软件和硬件的特别观点,绝对可以让所有的小师妹小师弟甚至是同龄人偷来“刮目相看”的眼光。当然首先你要真的理解这种说法。
为了引起更多人的注意,同时让话题更有冲击性,你应该非常肯定、神秘、恨铁不成钢而又愤慨的宣布一个观点:
“你知道么?嵌入式系统中几乎所有人关于软件和硬件的看法都是错误的……我们被教科书给坑了!”
1、传统计算机系统中的“软件/硬件”观
通常,我们提到计算机硬件,脑海里立马浮现的就是一台PC主机,当然这个时候你要特别小心,因为这个时候你举出的例子很可能是暴露年龄或者逼格的。比如,用台式机举例还是用笔记本举例显然暴露年龄,用Windows笔记本举例还是Mac举例将暴露逼格。当我们提到软件,脑海里浮现的差不多就是Windows上跑着的各类软件,当然,如果你能用APP,特别是iOS的APP来举例,显然就是很有面子的。
是的,细心的你注意到了,传统的软硬件观念直接来源于通用计算机。在后面的讨论中我们会发现,这种由通用计算机带来的思维定势是非常可怕的。
2、嵌入式系统中的“软/硬件”观
嵌入式系统中的软件和硬件并不是你想象的那么简单。这其实很好理解,你可以在大学校园里随便拦下几个学生,让我们来做一个采访,问问他们什么是软件什么是硬件:
屌丝A(计算机学院):你丫有病么?硬件就是你的电脑主机咯,主板、CPU、内存硬盘、显卡什么的;软件就是Windows程序咯
屌丝B(信息学院):硬件就是单片机啊,51、AVR、STM32之类的,对了,还有开发板也算吧?软件嘛,就是Firmware咯(固件),过去用汇编开发,现在都是用C了
屌丝C(信息学院):毛线!我还可以用VHDL和Verlog写一个内核呢,你说说VHDL和Verilog写出来的是不是软件?FPGA是不是硬件?
屌丝B:呃……那咋办?
屌丝D(计算机学院):你们别忘了,开发板上跑的虚拟机也是硬件哦,虚拟机上用Java写的程序也是软件。
大家可能注意到了,在嵌入式系统中,软件和硬件是一个不那么靠谱的定义方式——当人们用普通话发相同的声音说同一个词语的时候,描述的可能根本不是同一个东西。那么,嵌入式系统中,软件和硬件应该如何理解呢?
方案一 . 要么,你可以假装从来没有看过这篇文章,只跟你用相同系统的人讨论问题,或者“自己根据语境”自动切换软件和硬件的意思。
方案二 . 要么,我们重新定义一下软件和硬件的概念,只要这个概念兼容原有的理解方式就可以了。
真有一种兼容老概念的新定义么?答案是肯定的。让我们来首先找一找在不同层面上软件的共同点:大家都是用一种语言(Java、C、VHDL、甚至是原理图)来描述自己大脑中的逻辑(思维)。让我们来体会一下这个特点,是不是这么个特点?因此,我们重新郑重的定义一下软件:
软件:人们借助某种语言,“尝试”固化下来的,自己的思维
与之相对,硬件的概念可以修改为:
硬件:业已固化下来的逻辑,可以稳定的提供确定的服务和功能
可见, 软件的本质是思维,是设计人员的思维 ,因而程序设计人员最重要的是自己 根据任务的需求想通所有的逻辑,并借助一定的语言作为工具,把自己的思维"固化"下来 。这个思维的过程叫做"设计(Design)"、这个固化的过程叫做"编码(Coding)"。简单的说,写代码只是一个思维翻译的过程,更重要的是首先写程序的人要想清楚,拥有清晰的思维,然后借助准确无误的语言表达能力(很遗憾,很多人语言表达能力非常有限——就是用C语言写不出自己想要实现的功能)才能写出正确的代码。
思维的设计有很多辅助工具,如大家熟知的流程图(Flow Chart)、UML图、还有大家不太用的数据流图(Data Flow Diagram)等等。然而,具体代码往往并不是一个好的辅助工具。进行思维设计的开发人员,叫做Programmer。
将Programmer的设计文档(各类图表)翻译成具体程序代码的人叫做Coder。
说残酷一点:Programmer设计,负责思考;Coder翻译,负责干苦力。如果你不服,我也没办法,哈哈哈哈……
**硬件,本质上一个固化下来的逻辑。**这个逻辑的前身当然是思维,只不过它被固化下来了,而且可以"稳定"可靠的提供"确定"的功能和服务。比如,FIFO是队列,在某些软件系统中把这种逻辑确定的模块叫做"构件"(Component),一种中性化的描述,并不强调它是软件还是硬件。因为构件的本质是一个模块,是一个可以提供"确定"的,大家都知道的功能的模块。它可以是硬件的,也可以是软件的。Who care?有的系统还会提供硬件抽象层,进一步模糊这类模块的软硬属性——反正你知道它是做什么的就行了,反正它很可靠,而且可以重复利用,所以你用就好了,是软的还是硬的,无所谓,反正都是同一个API。
当我们想凸显一个模块的逻辑、确定性和稳定性,而又不能或者不需要或者不关心它的软硬属性的时候,我们就干脆叫他构件(Component)。
重新定义软件和硬件的概念,不是一个文字游戏,而是一个行业内在心底里约定俗成已经默默在做的事情,只是,今天被明确的点破了而已。虽然你觉得被刷了三观(也许你没有),但仔细想想,其实的确和过去的认识没有本质上的区别?
不是么?其实你早就懂对么?哈哈哈哈——我没有重新发明软件或者硬件,我只是诚实的搬运工。
全部0条评论
快来发表一下你的评论吧 !