电子说
什么是嵌入式软件开发
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
嵌入式系统一般指非 PC 系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和 I/O 端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
传统嵌入式产品:空调主控模块、冰箱主控模块、家用遥控器、智能手机、教学投影仪、音响系统、雷达系统、路由器等等。
前沿嵌入式产品:无人机、智能音响、机器人控制、城市天眼系统、智能家具、自动驾驶汽车、扫地机器人、手环等等。
嵌入式开发工程师,从事领域很宽泛,特别是工业控制、消费电子与通信设备三大领域,因为就业面很大,所以人才需求也大。现在智能硬件也比较火,这方面的发展也会大大拓展嵌入式工程师的就业机会。嵌入式的前景还是非常不错的!
另外,据校招的一些公司 HR 介绍,一般公司 70%的研发人员都是软件类的,嵌入式硬件工程师,需求没有嵌入式软件工程师大,但因为做硬件门槛会高些, 所以这个方向如果做的比较专业,薪资绝对不会低。
岗位分类
嵌入式软件开发具体可以分三类:
1、嵌入式驱动工程师:
编写和移植各种芯片驱动(如音频芯片),优化硬件设备驱动(如温湿度传感器),得精通各种硬件接口协议(如 I2C 协议)、系统调度、信号量、锁机制等等,开发难度最大。该类开发者一般是软硬件综合型人才,一般的嵌入式驱动工程师指 LINUX 上 的驱动开发工程师,需要精通 Linux 驱动框架(platform 框架、input 子系统框架等),结合芯片本身去编写驱动,驱动的好坏很大程度上决定一个产品的好坏。业界对驱动人才的定义是三年才算入门,可见此门槛之高。
2、嵌入式系统工程师:
主要是编写固件,根据不同平台移植操作系统,根据应用场景来优化系统,需要熟悉整个操作系统组成与调度,对固件的稳定性高求很高,如果系统不稳定,驱动和应用也是白做的。
3、嵌入式应用工程师:
编写业务逻辑程序,调用驱动工程师提供的接口控制设备,软件开发过程所 涉内容范围非常广,主要使用 C 语言开发,但经常会涉及 C++、Java、python、Java、PHP 等各类语言以及各种脚本语言、数据库、前端后台、各种通讯协议、 甚至一些从来没听过的协议或概念。这需要很强的学习能力,该职位也是各大公 司需量最大的。一般 10 人的开发小组,驱动开发与系统开发与应用开发的比例 是 1:2:7。
工作及学习内容
我国嵌入式人才缺口每年在 50 万左右,相关调查报告称嵌入式软件开发是 未来几年最热门和最受欢迎的职业之一。 嵌入式软件开发做什么?
负责上层应用软件,主要要用:
(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应用程序。
审核编辑 黄昊宇
全部0条评论
快来发表一下你的评论吧 !