本文将按程序设计类,专业基础课,专业核心课,专业选修课四个类别依次探讨每门课程在嵌入式底层软件开发作用与学习方法:


1. 程序设计类

程序设计语言种类较多,这里不比较各种编程语言。只谈谈嵌入式底层软件开发中会用到的语言:

(1) C/C++:由于内核与驱动主要采用C语言来编写,因而C语言是作为底层开发的主要编程语言。 除去内核和驱动后, 操作系统的系统层往往采用C/C++(即使是Android其Native Framework层与Hal层主要是C/C++).  因此C/C++是从事嵌入式底层软件开发的必备语言。


(2)Java 等:Java,  C#等主要用于编写在系统的框架层和应用层; 掌握其中之一的话有助于我们在今后的嵌入式开发工作中理解与调试整个系统。 这里举1个例子:

一次发现Android Camera 程序快速退出后有概率还显示camera最后一帧的图片,从驱动调试到框架层发现系统层c++的camera对象异常析构了, 但单从系统层看不应该会这样,所以怀疑更上层有问题, 最后调试发现是因为Camera App被其它部门定制过,Java App 层的Camera对象在某种case下被异常回收了。


(3) 汇编语言:汇编语言与CPU的种类绑定的,常见的有x86, arm, c51, mips等。 在实际开发中所涉及的汇编代码并不多,但如下几中情况会用到汇编:

a. Boot Loader开发

b. 自行开发或修改(定制)操作系统或固件的体系结构层

c.调试某些未开源的它第三方代码或系统代码


(4) 脚本语言:脚本语言用于复杂系统的make过程(如Android的Build过程),顶层的流程控制,和不同功能的粘合等。


学习建议: (1) 全面深入学习C/C++(包含面向对象思想) (2)  结合<<计算机系统结构>>学习一种CPU 的体系结构及其汇编 ; 

(3) 了解Java(或其它高级语言)基础与基本工作原理; 

这样再学习其他编程语言就比较容易了


下面以C++为例来看看学习的几个阶段: (1)基本语法阶段, 完成一些课后的上机题即可 (2)结合数据结构与软件设计思想尝试设计一个数据结构的封装库(或一个小游戏或工具)  (3)阅读一本c/c++经典著作如<<C++编程思想>>。



2. 专业基础课

(1) 数据结构

作用:该课程为计算机中最重要的课程, 对今后软件的设计至关重要。 稍微复杂一些的软件都采用了不同的数据结构来设计,如哈希表,链表等。 Linux kernel中还使用了RB Tree,  B+/B- Tree等。

学习方法:结合程序设计语言,实现(封装)常用数据结构。 这样能加深理解并能提高程序设计能力。能力较强者可学习STL

推荐书籍:<<数据结构严蔚敏版>> , <<STL源码剖析>>


(2) 算法设计

作用:能启发我们的思想,提高解决问题的能力

学习方法:要多体会其中的思想,这点比上机实现更加重要。 其次是课后的练习题

推荐书籍: <<算法设计与分析导论>>


(3) 计算机组成原理

作用:《计算机组成原理》是站在硬件的角度来看计算机的运行原理, 如CPU是如何工作的,内存如何与CPU配合工作(内存如何寻址), 外设的工作原理如(CRT显示器,磁盘等)。嵌入式系统不外乎也是由cpu, 内存和外设构成的。要控制嵌入式系统的第一步是根据原理图明白其基本构成与工作原理. 其次是该课程会讲解嵌入式中常用的概念如中断,DMA等。

学习方法:对初学者而言可能有点抽象,重点是学习工作原理和理解一些概念,可以结合课后练习

推荐书籍: <<计算机组成原理 蒋本珊>>




(4) 电路设计

作用: 嵌入式软件驱动的本质是用于控制硬件,而硬件是由数字电路和模拟电路两部分组成的;了解了数字电路的设计方法:1能让我们更好的理解下层硬件的工作方式 2能和硬件工程师配合,分工软硬件各承担哪些工作(软硬件职责的划分)。 使整个软硬件系统达到最优。

学习方法: 对于今后从事软件的开发人员而言搞懂数字电路的各种基本电路的工作原理和基本设计方法即可;也可进一步学习verilog,如一个简化risc_CPU设计

推荐书籍:<<模拟电路与数字电路 (电子工业出版社>>,<<Veriflog数字系统设计教程>>

注: 该课程可选学,如果从事芯片级开发可能会用到, 但板级开发基本用不上


3.专业核心课

(1) 计算机系统结构

作用:从事操作系统或固件体系结构层开发; 有利于把握整个嵌入式系统和调优整个系统

学习方法:1. 基本课程的学习 2. 见操作系统部分

推荐书籍:<<深入理解计算机系统>>


(2) 计算机网络

作用:1 能让我们了解计算机系统的网络部分工作原理 2. 协议分层的思想同样适用于其他软硬件协议,有助于我们学习其它软硬件协议,如pcie, usb等。

学习方法:重点要体会毎一层的目标与方法(如于数据链路层中的  CSMA/CD), 了解socket编程。可用抓包软件加强tcp/ip学习。

推荐书籍:  <<计算机网络 谢希仁>>  <<TCP/IP协议卷1>>


(3) 数据库技术

作用:数据库技术是软件中最常用到的一种技术。相对于企业应用开发方向(数据库是其一个重点),嵌入式方向用到相对较少但在系统级开发中还是会用到一些的。

学习方法: 对于嵌入式底层开发而言,了解一种数据库的使用,如mysql(或sqlite)和基本SQL语言使用即可。



(4) 操作系统

作用:有助于理解系统软件运行, 搞懂原理才能裁剪嵌入式操作系统,甚至是开发或深度定制嵌入式操作系统。对于仅从事系统层开发而言,对于理解系统APi也是有帮助的

学习方法: 1. 理解基本原理   2.可以学习minix或Linux 0.11内核   2. 了解一个操作系统的系统API(系统编程)


推荐书籍:<<现代操作系统>> <<操作系统设计与实现>>或<<Linux内核完全注释>>



(5) 编译原理

作用:理解编译器的工作原理, 同时编译器的设计方法也是一类软件的设计方法, 掌握了它我们在实际工作中很容易实现一些解释器。

学习方法:1. 基本原理学习  2. 了解一种编译器(如:gcc)的参数设置方式与命令行使用方式 3. 最好能阅读或实现一个精简的编译器(可仅实现到中间语言)或一个解释器。

推荐书籍 :   <<编译原理 陈火旺>> <<编译器设计之路>>


(6) 软件工程

作用:了解软件的开发流程,设计,测试方法

学习方法: 该课程有三个重点 1. 软件设计方法学  2.项目管理 3.软件测试方法学 ; 仅仅学习课本是完全不够的, 一是要结合自己的开发实例多体会设计与测试方法, 二是多阅读经典著作。

推荐书籍:<<软件工程--实践者的研究方法>>  <<设计模式>>  <<敏捷软件设计--原则模式与实践>>


对于选修课这里仅给出其作用

4. 专业选修课

(1) 计算机图形学: 2D,3D图像的工作原理, 有助于理解GPU

(2)数字信号处理 适用于傅里叶变换域滤波对于数据信号采集类嵌入式系统开发

(3) 多媒体技术: 适用于多媒体相关嵌入式系统和应用开发,如播放器类, 视频监控类, 计算机视觉(如机器人系统)

(4)  数字图像处理: 对图形图像系统,1.能提高图像的视感质量 2.提取图像中所包含的某些特征或特殊信息 3.图像数据的变换、编码和压缩,以便于图像的存储和传输,可应用于如机器人视觉,模式识别等。


此外,在推荐学习一下<<嵌入式系统原理 设计及开发>>一书,通过该书的学习能将各个知识点联系起来。

另一个经常讨论的话题是,学习嵌入式是否需要购买开发板。如果经济条件允许,可以购买Arm系类的开发板。 但这并不是必须的, 因为可直接在PC(x86)平台上学习嵌入式开发。关于具体技术的学习方法,后续文章会陆续分析。