作者:知乎用户
链接:https://www.zhihu.com/question/53880054/answer/164501004
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.嵌入式linux 和 用stm32进行的嵌入式开发 这两者之间有什么关联性吗?
基于STM32的开发属于微控制器开发领域,主要开发工具是keil或IAR,这种开发更准确的说法是单片机开发或者硬件开发;而招聘里所说的嵌入式开发,开发环境是基于Linux操作系统,这种开发一般会分为几个层次:驱动开发、操作系统层开发、应用层开发。开发后者所需了解的知识和前者的不是在同一个层次上。
如果玩过Arduino和树莓派,那么这个就很好理解了。STM32开发和Arduino是同一个层次,处于微控制器级别;嵌入式Linux开发和树莓派一个层次,属于微处理器级别。
更详细地说,单片机开发主要在于控制、检测和传输数据,比如控制继电器开关以控制门锁,检测温湿度上传数据到网关。而处理器除了可以做单片机的事,还可以处理音视频等计算量很大的任务,有文件管理系统也有更多的存储空间,以及该平台所提供的「开封即用」的工具(即安装后就可以直接使用),比如在树莓派上运行一个人脸检测系统是没问题的,在树莓派上搭建Web网站也是很方便的。
嵌入式Linux使用的主控芯片比STM32更高级。什么叫高级?除了运行速度内存空间等特性以外,从拿到芯片开始开发,到最后成为一个完整的产品原型或方案,其过程需要用到很多开发工具,硬件电路板的设计、驱动层和系统层代码的移植,应用层代码的编写,这些是需要一个团队合作完成的,当然大牛也可以独立完成,但是需要非常非常多的精力,同时项目周期也会拖得非常非常的长。
嵌入式Linux开发,不是像单片机开发那样设计好硬件后,只需要打开IDE编写代码,然后烧录测试改代码烧录测试改代码
放上一张ARM芯片内核汇总图片。其中STM32内核属于Cortex-M系列,嵌入式Linux所用内核可能是Cortex-A系列。有的Cortex-M不支持MMU内存管理单元,据我所知最多只能上到 µC/OS系列的嵌入式系统,而Cortex-A支持MMU,可以上类Unix系统。一旦上了类Unix系统,底层的东西就可以封装起来,只提供接口给上层开发人员。
这里科普一下。如果学过面向对象编程,那封装和接口就很容易理解。封装是把实现细节尽可能的隐藏起来,对外提供一个或多个公共接口,开发人员只需要知道这个接口怎么调用即可,不需要知道是怎么实现的。这一点和基于单片机开发很大不同,单片机开发本质就是“面向寄存器开发”。而嵌入式Linux开发,是"面向N-1层开发",比如应用层就是“面向操作系统层API开发”。
当然,现在STM32有了STM32Cube这个开发工具,就好像把STM32开发封装一层并提供接口一样。但对我来说,Cube只是一个“开发框架”或"中间件",Cube使开发者配置引脚更省心省力,同时把寄存器封装了一层,以更友好的方式告诉开发者,开发者只需要根据接口文档提供的接口去调用即可(可惜Cube的文档、学习和开发资料太少)。我要是不用Cube,也可以开发STM32,没有Cube以前开发者都是直接看芯片手册开发的。
而对于嵌入式Linux开发,则不能脱离N-1层,不了解底层API都不知道要做什么,例如使用TCP,至少也要知道Socket接口,例如编写Web管理页面,至少也需要一个Web框架(比如Python的Django)及Web服务器(比如Apache)。当然,由于嵌入式Linux都是基于类Unix开发,很多接口及其知识都是通用的,掌握了底层接口以后可以更多的关注业务逻辑。而在单片机开发中,换了一个芯片就需要重新看芯片手册,哪怕是实现相同的功能也有种重新开发的感觉,所以芯片选型阶段也是重中之重。嵌入式Linux应用层开发则不用那么麻烦,只要操作系统是类Unix,底层提供相同的接口即可代码重用。
2.嵌入式和互联网?
嵌入式:软件(一般的编程能力,基础算法) 硬件(电路设计,PCB画板,通信接口,丰富的外部设备 等等 )
互联网:软件 对编程能力要求很高;懂得高级算法
什么是算法?
算法(algorithm)就是定义良好的计算过程,取一个或一组值作为输入,并产生出一个或一组值作为输出(即算法就是一系列的计算步骤,用来将输入数据转换成输出结果)。
作用:
对于某一问题来说,可能有许多解决它的正确方法,不同算法的效率常常相差很大,这种效率上差距的影响往往比硬件和软件方面的差距还要大,计算时间、存储空间等等都是有限的资源,这些有限的资源必须被有效的使用,这时那些时间和空间上有效的算法就有助于做到这一点。
随着计算机性能的不断增长,可以利用计算机来解决比以往更大的问题,正是对于更大的问题规模,不同算法在效率方面的差异才会变得特别显著。
3.嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层
1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。
硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。
2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。 在嵌入式行业,做驱动层当然是最有前途的,但是难度也是最大的,其专业知识要求也是最广的。
驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。
3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。
4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及Java方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.323、Astrisk)方面又较为复杂,并且有难度了。所以对应用层主要是,编程语言和开发工具学习,以及良好的编程习惯和软件工程的,如果要增加自己在某个领域的竞争力,不妨学习一下TCP/IP中某层的协议。
原文链接:https://blog.csdn.net/qq_45763093/article/details/104008127