您对嵌入式系统有何看法?
嵌入式的定义
IEEE(电气电子工程师协会)对嵌入式系统的定义是:“用于控制、监控或协助设备、机械或工厂运行的设备”。
嵌入式系统是一种专用的计算机系统,是设备或设备的一部分。通常,嵌入式系统是一个嵌入式处理器控制板,其控制程序存储在 ROM 中。事实上,所有具有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统。有些嵌入式系统还包括操作系统,但大多数嵌入式系统由单个程序来实现整个控制逻辑。
从应用对象上定义,嵌入式系统是软件与硬件的组合,还可以包括机械和其他辅助设备。国内对嵌入式系统普遍接受的定义是:以应用为中心,以计算机技术为基础,具有可裁剪的软硬件,以满足应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
(此定义来自百度)
我个人认为嵌入式大致相当于人工智能,是一个可以自行处理信息的系统设备。
嵌入式人才要求
基本要求:在一些招聘软件中,我们搜索“嵌入式开发”,经常会看到这样的词汇,比如要求什么学历以上,工作经验多少年,是否可以接受加班,是否善于沟通,是否有很强的分析和解决问题的能力等等。
专业要求:嵌入式开发只是一个大的门类,如果真要说嵌入式开发是做什么的,选择很多。但真要说做什么的,无非就是你能做什么。比如你会用什么语言,C/C++/Java还是Python;是否精通自动控制理论,自动控制理论分为古典控制理论和现代控制理论;是否精通DSP,RAM;是否精通实时操作系统,比如FreeRTOS,UCOS;是否精通多线程编程;是否精通嵌入式数据库调用;是否精通各种网络协议;是否精通汇编;是否精通Linux内核与裁剪;是否精通编写各种硬件的板级支持包的BSPD;是否精通硬件原理图,PCB,Android/iOS应用开发等。
看完这些我就不说你们了,我也头疼。嵌入式开发是一个对基础要求很高的职业,起点很高,但是真正工作真的需要懂那么多吗?其实不然。比如说Linux系统,你只需要知道怎么移植就行了,如果真要写一个操作系统,要多久时间?比如说有些芯片,比如OLED,是用软件IIC跟主机通讯的。比如说MPU6050,SPI跟主机通讯。如果想获取当前的姿态,就需要写这种板级支持包,其实很多大佬都给你写好了,你只要找到用就行了。MPU6050的板级支持包有几千行代码,一般只用到两个函数,获取欧拉角,获取陀螺仪的姿态。
区分嵌入式
1、从技术角度来说,嵌入式系统一般分为有操作系统和无操作系统两种。
一般来说,如果没有操作系统,比如用STM32C8T6芯片、电机驱动模块、MPU6050做平衡车,我们就称这个为裸机。目前操作系统是未来的主流。裸机从程序上一般可以分为三层:硬件层、驱动层、应用层;有操作系统的可以分为四层:硬件层、驱动层、应用层,相比裸机多了一个系统层。
因此嵌入式开发一般分为:嵌入式硬件开发、嵌入式驱动开发、嵌入式软件开发、嵌入式系统开发。
嵌入式硬件工程师必备技能
硬件工程师一般来自通信、自动化、电子等专业,需要熟悉电路,看懂原理图,熟悉各种电子元器件,有一定的数字、模拟设计开发能力,熟悉8位、16位、32位机,不能说什么都懂,但是必须懂8位机,熟练掌握C语言,会使用Keil、Cubemx等软件。
一些高薪职位还要求你有FPGA开发经验,熟练掌握一些设计工具,比如Proteus/Power PCB等软件
嵌入式驱动工程师必备技能
驱动开发就是给某些设备写驱动,比如按键。比如你需要给某个按键写一个板级支持包,写按键需要初始化I/O口,扫描按键。写完这些函数之后,还需要封装起来。这个可以由嵌入式硬件工程师来做,也可以由嵌入式软件工程师来做。
其实驱动开发很多时候都是靠移植的,不会真的有人自己写吧?不会吧不会吧~开个玩笑,有些人喜欢自己写,增加自己写代码的能力,当然大部分还是靠移植的。
那么,要成为一名嵌入式驱动程序工程师,您需要了解什么呢?
你至少应该精通8位/16位/32位机器吧?你应该对操作系统有一定的了解。我不是说你必须自己写一个操作系统,但至少你应该知道如何在操作系统中使用CONFIG.H中的一些配置函数吧?你应该知道如何分配内存,如何创建任务,如何暂停任务?你应该熟练掌握不同芯片之间的移植,能够根据芯片手册编写设备驱动程序。
如果你设计一个网络,比如智能家居,你还必须知道通信协议,什么是三次握手,什么是TCP/IP协议;物理层、链路层、网络层、传输层、应用层,以及各层之间的关系。
个人认为嵌入式开发会和网络通信越来越紧密的联系,如果是学计算机网络的,一定要好好学习。
嵌入式软件开发工程师必备技能
这个嵌入式软件开发怎么说呢?最基本的要求就是精通C/C++。精通C/C++。我说三遍:精通C/C++。如果没有操作系统,在裸机上编程不会太难。如果有的同学觉得写程序很难,没有思路,那是因为你接触的项目太少,经验不足,以后多做点程序,写代码就自信了。如果有操作系统,就跟一般的软件开发很像。如果从事软件开发,需要掌握系统API,熟练掌握C语言的高级编程知识,结构体、指针、指针数组、数组指针、各种库函数等知识。如果想拿高薪,必须懂数据结构,比如链表、二叉树;还要会用常见的算法,比如PID控制、位置PID、增量PID,必须懂原理,并且能用C语言实现。
如果觉得工资还是太低,希望工资高一点,需要熟练掌握Linux系统编程,包括嵌入式开发环境、多进程多线程、网络编程、网络协议;熟悉常用图形库、QT GTK miniGUI的编程;掌握各种通讯协议、各种网络、音频、视频技术。小编在这方面也有很多不懂的地方,还请大家指出不足之处。
嵌入式系统开发工程师必备技能
我个人觉得系统开发是最难的,有的读者看到小编说系统开发难就想放弃了,其实不然,下面我来给大家慢慢讲解一下。
嵌入式系统开发工程师需要熟练掌握操作系统,如基本的内存管理、线程调度、文件系统、任务创建等,还需要了解数据结构、处理器架构、指令集、寻址方式等。
对于Linux来说,需要掌握的东西比较多,难度也比较大,需要熟悉Linux配置文件的修改、内核移植、交叉编译、内核调试、引导程序、ROOT文件系统制作和集成部署等。如果真要写这些,难度可想而知,普通人或者普通公司还真写不出来。最近有不少华为用户更新了华为的鸿蒙系统,这个鸿蒙系统就是用Linux写的,如果你会写操作系统,去哪个公司都能年薪百万,哦不,年薪千万不是梦。
既然说普通人、普通公司没有能力写操作系统,那嵌入式系统开发又是什么呢?一般来说就是靠移植,比如FreeRTOS就是一个免费的实时操作系统,你要懂得如何把裸机上的程序移植到FreeRTOS上,然后还要合理分配文件内存,任务调用,提高系统的实时性和稳定性等等。
总体来说移植难度比自己开发一个操作系统要简单很多,现在集成度越来越高,一个系统的难度、设备、功能都会增加,一旦东西太多,在裸机上跑起来就很困难了,所以操作系统一定是未来的趋势。
总结
1、从技术角度来说,嵌入式系统可以分为带操作系统的和不带操作系统的,未来带操作系统的将是主流。
2.嵌入式分为:
1.嵌入式硬件工程师
2. 嵌入式驱动工程师
3. 嵌入式软件工程师
4.嵌入式系统工程师
可以看出嵌入式硬件工程师是处于最底层的,通常要接触很多设备,还要精通电路图,电路设计。简单来说,硬件工程师就是把这个项目的各个设备连接起来,方便后面的程序编写。
嵌入式驱动工程师就是为这些设备写驱动,你硬件工程师就是接好线,写好程序,负责给这些设备写驱动程序。有些项目需要在操作系统上驱动设备,所以你要会用操作系统,其实在操作系统上驱动这些设备,大部分都是靠移植。
嵌入式软件工程师对C语言非常精通,如果是做操作系统的,还必须精通数据结构和操作系统,还要知道一些常用算法。有点像叫你做一个Android或IOS的APP。我对嵌入式软件了解不多,所以有什么错误还请大家指出。
嵌入式系统工程师,如果你擅长写操作系统,工资会很高,但是也要付出很大的努力去学习。一般来说,我们都是靠移植,毕竟我们没有华为、苹果、谷歌那样的实力。
一般只有大公司才会把事情分得这么细。大公司做项目的时候,每个人会分得很细。比如你公司要做扫地机器人,那么你或者你的团队会负责写扫地机器人的电机驱动的板级支持包。然后你或者你的团队会负责嵌入式驱动。
如果你在小公司,那就不好说了。老板肯定会觉得你知道的比较多,所以老板不会多招人。不过小公司的工资往往不比大公司少,毕竟能力强的人会更努力。不过确实很累。
如果读者还不知道嵌入式系统是什么,或者想学嵌入式系统的哪些方面,那么小编建议大家在学习嵌入式系统之前,可以先看一些数字电子学、模拟电子学、电子学方面的书籍。在有了一定的基础之后,买一块51单片机开发板,从最简单的裸机开始学习,会是一个不错的选择。当你把51单片机学的差不多了之后,做一个小项目。比较难的基于51单片机的蓝牙指纹解锁系统,简单一点的是基于51单片机做一个温度控制系统。51的你全部会了,再买一块32位的学习板,相比51来说,学全了还是有点难度的,当你学的差不多了之后,也可以考虑做些项目。以后我会专门写一篇文章介绍嵌入式系统的这个学习方向。
本文部分标题及内容参考自大禹机器人公众号->《嵌在你眼里的》,文章写得非常好。