嵌入式linux 和 用stm32进行的嵌入式开发 这两者之间有什么关联性吗?

2019-07-12 15:54发布

作者:知乎用户
链接:https://www.zhihu.com/question/53880054/answer/164501004
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  谢邀。我在以前的答案回答过,嵌入式这个领域最大的坑就是定义不清或者定义太广泛。   基于STM32的开发属于微控制器开发领域,主要开发工具是keilIAR,这种开发更准确的说法是单片机开发或者硬件开发;而招聘里所说的嵌入式开发,开发环境是基于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,底层提供相同的接口即可代码重用。   以上,是我对嵌入式Linux开发和STM32开发(单片机开发)两者之间的见解,欢迎评论区讨论及交流。   第二种解释: 题主要对比的是两个维度的问题,嵌入式系统有多个层次和分工,最底层是硬件载体,STM31属于这一层,上面有驱动,操作系统,应用程序。linux属于操作系统。对于STM32这个级别的硬件,完整的linux比较难以移植,轻量级的uclinux倒是很多成功移植案例。 第三种: 首先,从硬件角度上来说,STM32是Cortex M系列CPU,可运行简单RTOS,也可以bare metal,按照学生的角度来说,就是高级单片机。而LINUX是有MPU的芯片,至于这个MPU,你可以理解为内存管理机制。这个用处就大了,因为有了这个就可以跑操作系统了。至于Linux开发,分驱动开发和应用开发,驱动开发主要涉及一些外设芯片的通信与控制,说白了就是要控制接到我主芯片上的外设,这些驱动可以在LINUX系统上安装,然后可以被上层应用调用。应用开发就类似与PC机开发,涉及一些界面及功能开发,目前嵌入式里面QT还是比较火的,之前用过QT5,不知道现在做到哪个版本了。总结来说,做STM32硬件知识要好,以后可能会有些电路上的EMI问题debug,OS知识稍微了解一下,毕竟有些时候会用的到,当然你足够牛的话,OS在MCU上就是为了让代码易读,好维护,一般老工程师都懂,中断才是单片机的灵魂嘛;Linux驱动工程师要有对硬件和OS都有一定了解,毕竟这是是理论上的中间层,对下面对硬件寄存器,对上要给出合理的API,避免系统资源的占用;Linux应用工程师则更多的面对用户体验及系统资源的分配,因为毕竟读的到驱动文件没问题对他影响就不大。我现在主要是写驱动的,也是范范而谈,希望对你有帮助。 第四种: 最主要的区别是硬件是否带MMU!