正在崛起的高薪岗位—嵌入式开发工程师(呵呵...)
什么是嵌入式软件开发
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
传统嵌入式产品:空调主控模块、冰箱主控模块、家用遥控器、智能手机、教学投影仪、音响系统、雷达系统、路由器等等。
前沿嵌入式产品:无人机、智能音响、机器人控制、城市天眼系统、智能家具、自动驾驶汽车、扫地机器人、手环等等。
嵌入式开发工程师,从事领域很宽泛,特别是工业控制、消费电子与通信设备三大领域,因为就业面很大,所以人才需求也大。现在智能硬件也比较火,这方面的发展也会大大拓展嵌入式工程师的就业机会。嵌入式的前景还是非常不错的!
另外,据校招的一些公司HR介绍,一般公司70%的研发人员都是软件类的,嵌入式硬件工程师,需求没有嵌入式软件工程师大,但因为做硬件门槛会高些,所以这个方向如果做的比较专业,薪资绝对不会低。
就业对象
其实从事的人主要有两类,一类是计算机科学与技术的,他们更注重软件方面的知识。另一类是电子信息类的专业,比如测控、电子科学、信息、通信、机电、自动化等等。
总之主干课程就是数据结构与算法、C语言、c++语言、计算机组成原理、计算机网络、操作系统、编译原理、电路原理、数电、模电、数字信号处理、传感器、测控电路、单片机原理及应用、linux操作系统等等。
这些都是些基础的课程,嵌入式包含的很多,要和硬件和底层打交道,还需要学习QT(上位机界面)、linux、arm等等。
岗位分类
嵌入式软件开发具体可以分三类:
1、嵌入式驱动工程师:
编写和移植各种芯片驱动(如音频芯片),优化硬件设备驱动(如温湿度传感器),得精通各种硬件接口协议(如I2C协议)、系统调度、信号量、锁机制等等,开发难度最大。
该类开发者一般是软硬件综合型人才,一般的嵌入式驱动工程师指LINUX上的驱动开发工程师,需要精通Linux驱动框架(platform框架、input子系统框架等),结合芯片本身去编写驱动,驱动的好坏很大程度上决定一个产品的好坏。业界对驱动人才的定义是三年才算入门,可见此门槛之高。
2、嵌入式系统工程师:
主要是编写固件,根据不同平台移植操作系统,根据应用场景来优化系统,需要熟悉整个操作系统组成与调度,对固件的稳定性高求很高,如果系统不稳定,驱动和应用也是白做的。
3、嵌入式应用工程师:
编写业务逻辑程序,调用驱动工程师提供的接口控制设备,软件开发过程所涉内容范围非常广,主要使用C语言开发,但经常会涉及C++、Java、python、Java、PHP等各类语言以及各种脚本语言、数据库、前端后台、各种通讯协议、甚至一些从来没听过的协议或概念。这需要很强的学习能力,该职位也是各大公司需量最大的。一般10人的开发小组,驱动开发与系统开发与应用开发的比例是1:2:7。
负责上层应用软件,主要要用:
(1)CPU:51/MSP430/ARM7/ARM9;
(2)外设:AD/DA、UART、USB、LCD;
(3)总线和通讯接口:I2C,SPI,RS232,RS484,CAN,USB,MODBUS(或有实时性要求)
(4)环境:Linux/QNX+ARM汇编;
(5)GUI:VC++/VC#/LABVIEW。
对于一个嵌入式软件工程师,需要掌握以下技能:
1.掌握C语言基础知识,C语言作为一门基础语言,无论对嵌入式软件还是硬件开发编程,都会有很大的帮助。
2.了解操作系统,对操作系统了解也很有必要,比如进程、线程和系统是怎么分配资源等等相关内容,对你的软件开发会有很大的帮助。
3.了解Linux或者wince下的编程。
4.具有单片机或者ARM或者MIPS等等相关基础。
5.其他知识的扩充,我们可以通过阅读一些优秀代码,来了解UBOOT的源代码,或者可以学习下linux源代码等等相关知识。
对于嵌入式软件开发不仅是上面编程方面需要掌握,还有需要掌握的就是:
1.熟悉ARM、X86、PLC等硬件知识;
2.熟悉计算机接口知识,熟悉WinCE或Linux等嵌入式操作系统;
3.熟练使用c、C#编程、PLC编程者优先;
4.精通DSP、PPC、ARM等cpu的单板开发与调试;
5.对ucos等实时嵌入式系统或嵌入式linux系统有了解;
6.良好的学习能力,良好的团队合作精神和沟通能力,认真负责的工作态度,有钻研精神。
这些都是基础,嵌入式软件开发这些都是需要掌握的,你掌握的东西也就是你以后要做的内容。
对于嵌入式软件开发你以后大致可以做下面几方面的工作:
1.应用程序开发,包括Android应用开发或者Linux上应用开发(QT等),目前做的人很多,就业容易待遇也不错,需要掌握C语言、C++、java等开发语言。
2.操作系统移植,比较复杂,Linux,Android等,现在很多手机厂商(如小米,魅族,乐视等)推出的操作系统也就是修改内核,换皮肤,就业还是很容易的;
3.底层驱动开发,这个入门、深入都不容易,需要对硬件及OS有较深的了解,发展前景很不错。
岗位技能
一、C语言
嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
二、Linux基础
Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。
三、Linux系统编程
重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四、Linux网络编程
计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。
重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。
五、数据结构与算法
数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六、C++ 、QT
C++ 是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。
由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
七、Cortex A8 、Linux 平台开发
通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。
Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。
同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。
八、驱动开发
驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。
本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。
九、项目经验
薪资和发展
目前的嵌入式开发更倾向于智能化,也就是我们所说的智能硬件(硬件+软件),从现在各种前沿的嵌入式产品来看的确如此,嵌入式产品的一个发展趋势是更倾向于自动化控制和人机交互,而不是强调“算法”这一块。
嵌入式有很好的发展前景,前沿嵌入式技术即将崛起,或者说已经崛起。
人工智能、大数据这些学科会给嵌入式带来冲击,就目前来看,大学生更倾向与python编程语言、机器学习这一块,而嵌入式学者的确比往年有所下降。
但学者少了并不代表他的需求就少了,并不代表他的薪资水平下降了,目前的一个嵌入式技术更倾向于与智能学科相结合的趋势。
以百度机器人为例,机器人的核心是大脑,即是“数据和算法”,但机器人大脑想机器人身躯能够像人类一样活动,能说会道,行走自如,那么就必须得依靠嵌入式技术。
嵌入式+智能学科应用,从长久来看,嵌入式只会越来越火,智能学科的崛起必定带动新型的嵌入式技术发展。
推荐书籍
一、bootloader
1. 对硬件的操作,需要看原理图、芯片手册。这需要一定的硬件知识,不求你能设计硬件,但是至少能看懂; 不求能看懂模拟电路,但是要能看懂数字电路:《微机原理》《数字电路》
2. 芯片手册,英文。肯定会痛苦,不痛苦怎么能成长呢?
3. 对ARM体系处理器的了解, 汇编指令,异常模式、MMU。也就这3块内容需要你了解:《ARM体系架构与编程》杜春蕾
4. 《嵌入式Linux应用开发完全手册》
二、内核
想速成的人,先跨过内核的学习,直接学习怎么写驱动。想成为高手,内核必须深刻了解。注意,我说的是了解,我没奢望去写出一个内核。
要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。
推荐两本书:
1. 通读《linux内核完全注释》,请看薄的那本;
2. 选读《Linux内核情景分析》, 想了解哪一块就读哪一节。
三、驱动
《Linux设备驱动》,老外写的那本
《linux设备驱动开发详解》
提升方法
一、学习利用搜索引擎
不要闭门造车,要善用开放源码世界的信息,很多常见的设计问题其实透过因特网就能找到同领域菁英贡献的程序代码;嵌入式工程师们要走出自己的小世界拥抱社群,与同领域的其他工程师们相互交流、互相帮助,而这也是开放源码世界的精神。
二、离开舒适圈!
不断更新并提升原本擅长的技术虽然很重要,但嵌入式工程师若能扩展自己的知识领域会更有益。走出舒适圈,挑战自我、去学习原本不熟悉的东西,包括工程以外的知识,例如与客户、同事之间的互动,将会收获良多。
三、熟悉实时操作系统(RTOS)
目前产业界对于熟悉RTOS的工程师需求很高,也愿意提供更高的薪资水平;因此他鼓励没有接触过RTOS的嵌入式工程师从一些较小型的系统着手,累积相关技术经验。
四、培养多元化技能与系统观
原本从事较小型系统架构(例如MCU)开发的工程师,可以开始去熟悉更大的系统(例如Linux驱动程序),反之亦然。尝试着去开发手机应用程序、或者是学习后端服务器的相关技术,能开启完全不同的观点;建议工程师去熟悉开放性硬件,现在市面上有不少现成的开发板,能让工程师专注于学习独特算法的开发。
五、要能熟悉开放源码软件
客户往往会要求在系统中整合一大堆软件,因此所有的嵌入式工程师需要熟悉各种软件;工程师应避免只专长单一领域,因为那可能会阻碍你的成长。对嵌入式工程师来说,确保自己对软硬件技术都很了解,是非常宝贵的价值。
六、建立系统级的工程思维
嵌入式工程师拥有系统导向的思维是很重要的,有不少开发案遇到问题,就是因为没有在开发初期充分考虑基准、验证策略以及兼容性验证计划等项目;此外每个嵌入式工程师都应该具备优良的项目管理技巧,力求准时完成负责的项目。具备能明智因应技术与项目风险的能力,对职业生涯发展会很有帮助。
七、要能透过文字或绘图,明确表达自己的想法与意见
往往有些菜鸟工程师无法清晰表达自己的想法,因为抓不到重点,而最好的解决方法是练习将之图形化,例如画出流程图。这听起来好像有点过时,但有时利用各种图框组合来整理自己的思绪、表达想法会是很有用的,例如iPad的iThoughts应用程序。
公司选择
本人毕业后在福建省找工作,在福建嵌入式开发工程师的工资普遍都不高(本科生),岗位较多的两个城市分别为厦门和福州。厦门的普通企业毕业后能开的工资大概在5k左右,好一点的8-10k,几乎很难超过10k。福州有几家不错的公司,差不多在7.5k左右。所以在福建从事嵌入式,毕业后不要奢望能特别高,特别优秀的另外说。能拿到7.5k当时在我们学院看来都是相当不错的,千万不要奢望一毕业就两万三万的月薪。如果不考虑福建,那么外面的世界将更辽阔,工资当然也会不一样。
北上广深,嵌入式企业多,岗位需求量也大,工资会比较高。个人建议,如果从事嵌入式,可以选择这些大城市发展。但北京上海的房价生活水平等较高,需要根据个人实际情况进行综合考虑。
深圳虽然压力也很大,但是嵌入式软件开发岗位很多,大公司小公司都有这类岗位的需求。
除了这四个城市,其他适合的城市还有杭州、苏州、成都、南京、西安、武汉等地。杭州也是很不错的一个城市,岗位也很多,目前来看以后的发展潜力很大。
部分企业嵌入式岗位介绍:
中兴——嵌入式软件开发工程师,研发岗硕士居多,四六级要求较高。
海康威视——嵌入式软件开发工程师(分BSP、单片机等方向):海康最近几年发展的很迅猛,主要做安防监控邻域,也做其他一些比较热门的产业,比如AI、云计算、机器人。研发岗位刷本科生很猛,似乎比较看重项目和实际水平。
美的——嵌入式软件开发工程师,要求是硕士和六级,但是特别优秀的本科生也要。
迈普通信——嵌入式软件工程师,做网络通信类的,路由器和交换机等等,在成都。