嵌入式操作系统简介
嵌入式操作系统(EmbeddedSystem)是指以应用为中心、以计算机技术为基础,软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。举例来说,大到油田的集散控制系统和工厂流水线,小到家用 VCD 机或手机,甚至组成普通 PC 终端设备的键盘、鼠标、硬盘、Modem 等均是由嵌入式处理器控制的。
嵌入式系统无疑是当前最热门最有发展前途的 IT 应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set TopBox)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。
为什么要学嵌入式软件开发?好处是什么?
(1)目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业 IT 人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,很多软硬件技术出现时间不长或正在出现(如 ARM 处理器、嵌入式操作系统、MPEG 技术、无线通信协议等),掌握这些新技术的人当然很找。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。其实嵌入式人才稀少,根本原因可能是大多数人无条件接触,这需要相应的嵌入式开发板和软件,另外需要有经验的人进行指导开发流程。
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。搞企业应用软件的 IT 企业,这个用户的系统搞完了,又得去搞下一个用户的,而且每个用户的需求和完成时间都得按客户要求改变,往往疲于奔命,重复劳动。相比而言,搞嵌入式系统的公司,都有自己的产品计划,按自己的节奏行事。所开发的产品通常是通用的,不会因客户的不同而修改。一个产品型号开发完了,往往有较长一段空闲时间(或只是对软件进行一些小修补),有时间进行充电和休整。另外,从事嵌入式软件的每个人工作范围相对狭窄,所涉及的专业技术范围就是那些(ARM、RTOS、MPEG、802.11 等),时间长了这些东西会越搞越有经验,卖卖老本,几句指导也够让那些初入道者琢磨半年的。若搞应用软件,可能下一个客户要换成一个完全不同的软件开发平台,那就苦了。
(3)哪天若想创业,搞自已的产品,那么嵌入式是一个不错的主意,这可不像应用软件那样容易被盗版。土木学院有一个叫启明星的公司开发出一个好象叫“工程 e”的掌上 PDA(南校区门口有广告),施工技术人员用该 PDA 可当场进行土木概预算和其它土木计算,据说销路特好。我认识的某大学老师,他开发的饭馆用的点菜 PDA(WinCE 平台,可无线连网和上网),据他说销路不错,饭馆点点 PDA 让客户点菜,多显派头档次。我记得 00 级 2+2 班当年有一组同学在学 Windows 程序设计课程时用 VC++设计了一个功能很强的点菜系统做为课程项目,当时真想建议他们将这个软件做成 PDA,估计会有些销路(上海火车站南广场的 Macdonald 便使用很漂亮的 PDA 给用户点食品,像摸像样的)。这些 PDA 的硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
八大入门的知识点
1、C 语言
嵌入式 Linux 工程师的学习需要具备一定的 C 语言基础,C 语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解 C 语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
2、Linux 基础
Linux 操作系统的概念、安装方法,详细了解 Linux 下的目录结构、基本命令、编辑器 VI ,编译器 GCC,调试器 GDB 和 Make 项目管理工具, Shell Makefile 脚本编写等知识,嵌入式开发环境的搭建。
3、Linux 系统编程
重点学习标准 I/O 库,Linux 多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对 Linux 应用开发的理解和代码调试的能力。
4、Linux 网络编程
计算机网络在嵌入式 Linux 系统应用开发过程中使用非常广泛,通过 Linux 网络发展、TCP/IP 协议、socket 编程、TCP 网络编程、UDP 网络编程、Web 编程开发等方面入手,全面了解 Linux 网络应用程序开发。重点学习网络编程相关 API,熟练掌握 TCP 协议服务器的编程方法和并发服务器的实现,了解 HTTP 协议及其实现方法,熟悉 UDP 广播、多播的原理及编程方法,掌握混合 C/S 架构网络通信系统的设计,熟悉 HTML,Javascript 等 Web 编程技术及实现方法。
5、数据结构与算法
数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其 C 语言实现过程。
6、C++ 、QT
C++是 Linux 应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及 C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于 QT 具有跨平台、面向对象、丰富 API、支持 2D/3D 渲染、支持 XML、多国语等强大功能,在嵌入式领域的 GUI 开发中得到了广范的应用,在本阶段通过基于 QT 图形库的学习使学员可以熟练编写 GUI 程序,并移植 QT 应用程序到 Cortex-A8 平台。包括 IDE 使用、QT 部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
7、Cortex A8 、Linux 平台开发
通过基于 ARM Cortex-A8 处理 s5pv210 了解芯片手册的基本阅读技巧,掌握 s5pv210 系统资源、时钟控制器、电源管理、异常中断控制器、nand flash 控制器等模块,为底层平台搭建做好准备。Linux 平台包括内核裁减、内核移植、交叉编译、GNU 工具使用、内核调试、Bootloader 介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在 s5pv210 实验平台上运行自己制作的 Linux 系统,集成部署 Linux 系统整个流程。同时了解 Android 操作系统开发流程。Android 系统是基于 Linux 平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA 等消费类电子产品。
8、驱动开发
驱动程序设计是嵌入式 Linux 开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉 Linux 的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备 ARM 硬件接口的基础知识,熟悉 ARM Cortex-A8 处理器 s5pv210 各资源、掌握 Linux 设备驱动原理框架,熟悉工程中常见 Linux 高级字符设备、块设备、网络设备、USB 设备等驱动开发,在工作中能独立胜任底层驱动开发。
十大课本上学不到的妙招
1、离开舒适圈
虽然当了多年的工程师、但自认是系统与软件技术“通才”的 DSP 与嵌入式软件开发顾问公司 Jetperch 创办人 MattLiberty 建议,不断更新并提升原本擅长的技术虽然很重要,但嵌入式工程师若能扩展自己的知识领域会更有益。走出舒适圈,挑战自我、去学习原本不熟悉的东西,包括工程以外的知识,例如与客户、同事之间的互动,将会收获良多。
2、学习利用搜索引擎
当了多年工程师、自认是“看得懂系统架构的软件人”的 PTRGroup 首席科学家 MichaelAnderson 认为,不要闭门造车,要善用开放源码世界的信息,很多常见的设计问题其实透过因特网就能找到同领域菁英贡献的程序代码;嵌入式工程师们要走出自己的小世界拥抱社群,与同领域的其他工程师们相互交流、互相帮助,而这也是开放源码世界的精神。
3、学习那些让因特网实现的技术
具备多年嵌入式工程师经验的独立产品设计与顾问公司 AuriumTechnologies 总经理 KenWada 认为,多数嵌入式领域工程师都知道如何撰写 C 或 C++语言程序,但有时候这样的技能是不够的;他建议嵌入式工程师学习因特网有关的技术,对职业生涯发展会有加分效果,例如他目前负责的几个开发案,都是在嵌入式系统中嵌入虚拟(virtual)的 XML,好让一些小型连网设备能具备“即插即用”的运作模式。
4、熟悉实时操作系统(RTOS)
在工程人才招募机构 RandstadTechnologies 负责嵌入式产业领域的解决方案经理 HenryWintz 表示,目前产业界对于熟悉 RTOS 的工程师需求很高,也愿意提供更高的薪资水平;因此他鼓励没有接触过 RTOS 的嵌入式工程师从一些较小型的系统着手,累积相关技术经验。此外他也发现产业界对嵌入式 Linux 人才有不少需求,主要是因为这种操作系统具备较大的设计弹性。
5、了解最新的处理器
有超过多年嵌入式软件工程师经验的 Embedded.fm 工程师 EleciaWhite 表示,除了要深入了解 C 或 C++等基本程序语言,有时也要认识一些热门的新程序语言以因应特殊设计需求,但更重要的是了解最新的处理器技术;处理器才是嵌入式系统的本质。因为我们的系统资源有限,我们需要了解可用的资源有哪些。
6、培养多元化技能与系统观
担任近多年工程师、具备许多不同领域技术经验的技术顾问公司 Rebelbot 顾问 JenCostillo 建议,原本从事较小型系统架构(例如 MCU)开发的工程师,可以开始去熟悉更大的系统(例如 Linux 驱动程序),反之亦然。尝试着去开发手机应用程序、或者是学习后端服务器的相关技术,能让你开启完全不同的观点;他并建议工程师去熟悉开放性硬件,现在市面上有不少现成的开发板,能让工程师专注于学习独特算法的开发。
7、要能熟悉开放源码软件
拥有多年工程师经验的 FreescaleSemiconductor 数字网络全球软件开发部门总监 RobOshana 表示,客户往往会要求在系统中整合一大堆软件,因此所有的嵌入式工程师需要熟悉各种软件;他建议工程师避免只专长单一领域,因为那可能会阻碍你的成长。对嵌入式工程师来说,确保自己对软硬件技术都很了解,是非常宝贵的价值。
8、建立系统级的工程思维
自诩为高信赖度嵌入式系统专家、担任了多年工程师的 E2V 电子系统总工程师 AdamTaylor 认为,嵌入式工程师拥有系统导向的思维是很重要的,有不少开发案遇到问题,就是因为没有在开发初期充分考虑基准、验证策略以及兼容性验证计划等项目;此外每个嵌入式工程师都应该具备优良的项目管理技巧,力求准时完成负责的项目。具备能明智因应技术与项目风险的能力,对职业生涯发展会很有帮助。
9、学习无线连结技术
自认是低阶嵌入式工程师、有多年工作经验的 iRobot 资深首席软件工程师 ChrisSvec 建议,嵌入式工程师需要在接下来 1~3 年学习无线连结技术,特别是 Wi-Fi 与蓝牙低功耗(BLE);因为现在的嵌入式设备(至少各种消费性电子都是)与使用者智能手机连结的主要(或唯一)方式,就是透过这些无线技术,虽然 Wi-Fi 与 BLE 不一定会是嵌入式系统的标准配备,但熟悉这些技术对嵌入式工程师来说会很实用。
10、要能明确表达自己的想法与意见透过文字或绘图
Micrum 总裁 JeanLaBrosse 认为,无论是哪一种工程师,都需要能有效表达自己的想法与意见;往往有些菜鸟工程师无法清晰表达自己的想法,因为抓不到重点,而最好的解决方法是练习将之图形化,例如画出流程图。这听起来好像有点过时,但有时利用各种图框组合来整理自己的思绪、表达想法会是很有用的,例如 iPad 的 iThoughts 应用程序。
审核编辑 黄昊宇
全部0条评论
快来发表一下你的评论吧 !