目录
[显示]

1.摘要

这是另一篇沉睡在硬盘深处的学习笔记,主要是关于嵌入式开发及Linux开发的相关内容。因为嵌入式Linux开发包含的内容相当多,这篇学习笔记只能当作提纲,具体内容还要通过其他渠道学习。这篇文章是嵌入式开发学习笔记的第一篇,主要归纳了嵌入式开发学习的方向问题以及一些常见的名词解释。

2. 嵌入式开发概述

2.1. 嵌入式系统的概念

嵌入式系统的定义为:以应用为中心、以计算机技术为基础、软硬件可裁剪、适用于应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

简单地说,嵌入式系统就是设计适用于某个功能的专用硬件,搭配与之对应的经过优化的操作系统,并在其中运行这个设备专属的软件

2.2. 嵌入式系统的特点

  1. 软件、硬件可裁剪
  2. 对功能、可靠性、成本、体积、功耗严格要求

2.3. 嵌入式开发的方向

2.3.1. 硬件层

是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。

2.3.2. 驱动层

这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。

2.3.3. 操作系统层

对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。

2.3.4. 应用层

相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及Jave方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.323、Astrisk)方面又较为复杂,并且有难度了。

2.4. 嵌入式开发的学习方向

我认为这是学习嵌入式开发时最需要了解的知识,偏偏很多教程或者视频又把这些给省略掉了,让我走了不少弯路。
对比上面的嵌入式发展方向可以知道,学习嵌入式开发大概有以下几个方向。注意:以下都是默认你已经有对应的编程语言基础。

2.4.1. 应用开发

嵌入式应用开发实际上与普通的桌面应用开发相比没有什么太大的难度,主要区别是嵌入式开发的编译、调试方式以及硬件限制。
嵌入式应用开发是建立在操作系统或框架提供的API的基础上的,就我了解主要包括:

安卓
Linux下的Java框架,用于开发安卓应用。
IOS
IOS下的Objective-C框架,用于开发IOS应用。
Linux应用开发
与普通Linux开发相似。
WinCE
与Windows应用开发相似。
QT
跨平台的GUI应用开发框架,QT目前分成了QT桌面版和QT/Embedded,注意嵌入式开发使用的是QT/Embedded。

其他还有很多框架或平台,不过个人没有太多了解过,不过这类开发内容基本上都是相似的:程序自身的功能类型不限,与嵌入式系统通过调用系统(或框架)提供的API交互。

如果要开发应用,大概有这么三个步骤:
1、掌握操作系统或框架的使用
比如要学习Linux嵌入式开发,假如不知道Linux命令的话,编码或许可以完成,但是在部署和调试时会遇到很多问题。

2、学习在非嵌入式系统下的应用开发
更确切的说包括两方面:API学习和开发工具学习,和普通的应用开发学习一样。

3、学习嵌入式系统应用开发
在掌握了上面两部分知识之后,嵌入式相关的学习内容就比较简单了,包括两部分:
嵌入式应用的编译及调试:包括设备连接、调试等。
嵌入式系统API:一般来说嵌入式系统API是桌面系统API的子集,在写程序时需要知道两者的区别。

2.4.2. 内核裁剪与移植

从这里开始就会牵扯到嵌入式设备的具体硬件了,这里虽然名字里包含“内核”,但是只要简单的了解嵌入式设备硬件并配置就可以了,与操作系统原理没有什么联系。具体的来说,就是删除掉内核中不用的模块,启用有用的模块,重新编译一遍,最后把内核程序发布到具体的设备中。

要了解的大概有这些内容:
内核可以提供的功能模块
编译工具的使用
硬件的功能和部分原理
BootLoader的操作
(可能会有)操作系统的原理

2.4.3. 内核修改

与上面的裁剪与移植相比,内核修改是修改内核源代码之后重新编译,而不是简单的开启/关闭模块后重新编译。

要了解的内容:
内核裁剪与移植的所有内容
操作系统的原理
操作系统内核的实现(读内核源代码)

2.4.4. 驱动开发

这里开始需要对操作系统及硬件有比较深入的了解,我对这一块并不是很熟悉,只是笼统的了解了一下。

需要了解的内容:
内核修改的全部内容
硬件原理
电路图

2.4.5. 操作系统无关的软件开发

从这里开始摆脱操作系统的依赖,主要包括两类开发:无操作系统的应用开发(单片机)以及进入操作系统前的软件(引导器)。

需要了解的内容:
硬件原理
汇编语言
(有可能会有)操作系统原理

在这里出现操作系统原理的原因是在没有操作系统的情况下,你的软件或许要实现一部分操作系统的功能。

2.4.6. 硬件开发

这里我已经完全不熟悉了,到这里基本上已经脱离了软件范畴。

2.4.7. 硬件相关的算法开发

这里所说的算法并不是快速排序之类的通用算法,而是与芯片相关的一些算法,比如DSP开发之类。

需要学习的内容:
硬件原理
对应芯片的开发语言
具体某个领域的算法原理(如DSP对应的数字信号处理)

 

3. 软硬件基础知识

在学习嵌入式的过程中最经常碰到的问题就是各种乱七八糟的新名词,下面提供一些我记录过的基础知识:

3.1. 软件

交叉编译
以PC机为例,普通的编译过程是在PC机上编译程序,之后在PC机上运行。但是嵌入式设备一般运行速度很慢,所以会使用PC机编译-嵌入式设备运行的模式,这种模式便是交叉编译。

交叉调试
与交叉编译类似,嵌入式设备运行-PC机调试的模式。

文件系统
对于小型嵌入式设备来说,一般没有硬盘这种存储设备,而是采用基于flash芯片的文件存储系统,它与硬盘文件系统的主要区别有两个:
1、按硬件可氛围nand flash与nor flash,两者原理和特性完全不同(之后会做介绍)
2、文件系统有可能是只读的,在内核移植时一次性写入后不可修改。(可以认为是在PC里通过GHOST装系统,并且装完的系统不能修改,想要修改文件只能修改GHOST文件并且重装系统)

BootLoader
可以认为是嵌入式系统的BIOS,负责硬件初始化到引导操作系统之间的工作。

仿真器
使用PC方针一个嵌入式设备,开发人员可以使用这个设备进行程序调试。

移植
将一个程序的运行环境从一个平台转移到另一个平台,移植涉及到的技术可能非常多。
 

3.2. 硬件

nor flash
Flash存储器的一种。NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。容量小,价格贵,寿命(相对应nand flash)低。

nand flash
Flash存储器的一种。NAND需要I/O接口读写数据,类似于硬盘等块设备,程序需要从nand flash将数据复制到内存后才能运行。容量大,价格偏移,寿命高。

上拉电阻
将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理。

GPIO
General Purpose Input Output (通用输入/输出)简称为GPIO,简单的说,GPIO提供了一个高/低电平的输入/输出接口,0为低电平,1为高电平。

锁相环(PLL)
一种利用反馈(Feedback)控制原理实现的频率及相位的同步技术,其作用是将电路输出的时钟与其外部的参考时钟保持同步。当参考时钟的频率或相位发生改变时,锁相环会检测到这种变化,并且通过其内部的反馈系统来调节输出频率,直到两者重新同步,这种同步又称为“锁相”(Phase-locked)。
在计算机中,锁相环的作用是分频或加倍频率。

石英振荡器
是一种能量转换装置——将直流电能转换为具有一定频率的交流电能。其构成的电路叫振荡电路。石英晶体振荡器是振荡器的一种 。
简单地说,提供基本的时钟频率,此频率经过锁相环后成为系统使用的脉冲频率。

TTL
是市面上较为常见且应用广泛的一种逻辑门数字集成电路,由电阻器和三极管而组成。输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V。

CMOS
另一种逻辑门数字集成电路,可在硅晶圆上制作出PMOS(p-type MOSFET)和NMOS(n-type MOSFET)元件,由于PMOS与NMOS在特性上为互补性,因此称为CMOS。1逻辑电平电压接近于电源电压,0逻辑电平接近于0V。而且具有很宽的噪声容限。

 

OC门
OC门,又称集电极开路门,Open Collector(Open Drain)。实际使用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去。因此,需要一种新的与非门电路–OC门来实现“线与逻辑”。

三极管
在半导体锗或硅的单晶上制备两个能相互影响的PN结,组成一个PNP(或NPN)结构。中间的N区(或P区)叫基区,两边的区域叫发射区和集电区,这三部分各有一条电极引线,分别叫基极B、发射极E和集电极C,是能起放大、振荡或开关等作用的半导体电子器件。

PN结
采用不同的掺杂工艺,通过扩散作用,将P型半导体与N型半导体制作在同一块半导体(通常是硅或锗)基片上,在它们的交界面就形成空间电荷区称PN结。