2.3. 嵌入式软件期间会涉及哪些内容

对于嵌入式领域中会听到,见到的,涉及到如此众多的领域,技术,芯片,公司,开发工具,软件平台等等名称,很多人在开始接触的时候,都会很晕。

而这里,尝试用初学者所能听得懂的方式去解释一些常见的名词,所处的地位和作用

->由此也验证了那句:搞嵌入式开发,尤其是底层开发,相对来说,难度还是要比上层软件要难的

接下来,我熟悉的嵌入式Linux中Nand Flash驱动开发为例来解释说明具体过程和所涉及到的内容:

假如你是个普通的嵌入式驱动软件开发者,你的老板给你安排一个嵌入式Linux中Nand Flash驱动开发的任务的时候,就会直接或间接接触到很多东西:

表 2.1. 嵌入式Linux驱动开发期间相关的内容

嵌入式Linux中Nand Flash驱动开发期间直接涉及到的 嵌入式Linux中Nand Flash驱动开发期间间接相关的,类似的,类比的 备注
首先,此处所从事的开发领域,是一个消费类数码产品,比如电子书

于此对应的,同级别的,其他开发领域有:工业控制医疗器械汽车电子等等行业

->其他不同行业内,所要接触到的开发任务,往往又是完全不同的任务

->比如工业控制领域所涉及到的现场总线Fieldbus,对于搞消费类数码的人来说,甚至可以说很多名词和概念都没听过。

->更别说,让你去折腾HARTFF(Foundation Fieldbus)Profibus,了,其和消费类数码领域,很多技术都是完全不同和不相关的

相关内容:现场总线Fieldbus简析

其次,此处的操作系统用的是嵌入式Linux系统

->目前在嵌入式领域内使用可以说是最广泛的

与此对应的,同级别的,其他的,嵌入式操作系统也有很多,比如:ucOS/IIVxWorks,等等。

 

而对于Nand Flash,作为其中一种设备,一种接口,与此对应的也有其他很多协议/设备/接口,比如:Nor FlashBluetoothUSBRS232SD/MMC等等;

->换句话说,有可能过些天,你的老板让你去实现Linux中的SD/MMC驱动。

而接着你就开始去折腾Linux下面的Nand Flash芯片驱动的开发了,然后你可能就会接触到很多很多相关知识了:假如所用的硬件,先是嵌入式开发板,所用SoC芯片是S3C2440,是基于ARMARM920T内核的芯片:

嵌入式开发板

->网上也有很多其他开发板,就是用来卖给你们,用来折腾的,用来搞嵌入式开发的->比如你可以花点钱,买个对应到板子,用于练手,练习各种驱动的或应用的开发;

SoC

->>此处的嵌入式CPU,很多时候,用的是另外一个标准叫法,SoC,而与SoC类似(但不相同的)概念还有MCUDSPASICFPGA等等;

S3C2440

->此处是三星的芯片S3C2440,三星自己家的其他基于ARM内核的芯片还有很多,比如S3C2410S3C6410等等。而与此类似的

->类似三星的,也还有其他厂商,可以有能力自己去设计MCU,SoC,比如常见的意法半导体ST Microelectronics的STM32系列的芯片,比如STM32F103VGT6,其是ARM的Cortex-M3内核的,所以全称一般叫做:STM32F103VGT6 ARM Cortex-M3 MCU

ARM

->ARM是一家IP公司,专门设计CPU内核,所谓的IP Core,但不生产。

->其他芯片设计公司,比如三星Samsung飞思卡尔Freescale等等去用ARM的内核设计自己的SoC或MCU。

->与此相对的,另外也有一家做IP的公司叫MIPS

ARM920T

->类似的内核系列还有ARM922TARM926EJS等等,以及后来出来的ARM Cortex系列,Cortex-M3是比较流行的一个系列

现在很多开发板,都是采用比较新的,流行的SoC,而也是基于ARM内核的,比如最新一点的ARM11,ARM Cortex-M3等等;

然后再接着说工作细节中涉及到的Nand Flash芯片方面的知识,此处假设用的Nand Flash芯片是三星的K9GAG08U0M

Nand Flash

->和Nand Flash对应的Flash技术还有Nor Flash,以及其他更进一步的封装后的LBA Nand FlasheMMC等等。

三星的Nand Flash

->与此对应的是,其他还有很多Nand Flash芯片厂商,比如Micron镁光,东芝ToshibaHynix海力士,闪迪SanDisk等等,Intel英特尔

K9GAG08U0M

->其他还有很多常用的三星的Nand Flash芯片,比如K9LBG08UXD等等。

然后再说开发所涉及到的软件,包含很多方面,一个个说:交叉编译环境,嵌入式Linux环境构成等等

交叉编译环境

使用交叉编译工具链:已有交叉编译器,配置好环境就可以用来交叉编译了;

制作交叉工具链:没有交叉编译器,则需要自己去制作交叉编译器,比如用Buildrootcrosstool-ng等等去制作

相关内容:交叉编译详解crosstool-ng详解

整套的嵌入式Linux环境:uboot+kernel+rootfs

典型的嵌入式Linux开发环境主要构成就是:uboot+kernel+rootfs

->与嵌入式Linux对应的有,WinCE,其又是不一样的,自己一套的开发环境

->期间就可能会涉及到,用ARM自己的开发工具去在Windows主机上面交叉编译了,ARM的相关开发工具有ADSRVDS等等

Uboot

叫做bootloader,类似Uboot的还有viviRedboot,(WinCE下的)Eboot等等

Kernel==Linux Kernel

指的是Linux的内核,类似的,就是完全另外一套的WinCE环境了。

Rootfs

rootfs内容:各种制作rootfs的工具,手动制作,用工具制作(比如用Buildroot生成的rootfs)rootfs格式:用哪种文件系统,此处假如用yaffs2

Yaffs2

类似的,适用于Nand Flash的文件系统还有JFFS2YAFFSUBIFS

对应着,还要有制作yaffs2的rootfs的工具:mkyaffs2image

真正开始涉及到嵌入式Linux底层的Nand Flash驱动的开发的话,又会接触到很多技术和框架,名词

Linux驱动框架

不论你是实现哪个设备的驱动,都需要先搞懂本身Linux系统下的驱动框架和模型是什么样的

->然后才能搞懂,框架帮你实现了哪些通用的功能,需要自己实现余下的设备相关的功能

MTD

Linux中对于Nand Flash等设备所设计的框架,如果写Nand Flash驱动,就是基于该框架下去实现自己芯片的驱动

->于此相对的,其他Linux中还有其他很多技术框架,比如针对声卡音频的ALSA等等。

Nand Flash的技术细节:Block,Page,OOB,ECC,Wear Leveling

真正开始学习和了解Nand Flash驱动的话,会涉及到很多技术细节,比如Nand Flash的内部结构的BlockPageOOB,数据需要用ECC算法校验保证数据无误(硬件还是软件ECC,ECC算法是BCH的话支持4位还是8位),为了延长使用寿命而去实现负载平衡Wear Leveling,等等需要考虑很多

相关内容:【详解】如何编写Linux下Nand Flash驱动

Linux的使用和操作

在具体驱动开发期间,不可避免的要涉及到常见的Linux的使用,包括各种命令的用法,Linux系统基本原理和目录结构,都是避不开,要了解的。

->比如常见的ls,mkdir,rm,pwd,chmod,chown,ln等等。

Makefile

在开发期间,也会遇到用make命令,执行Makefile文件

->嵌入式Linux中,往往都是用Makefile去管理项目的

->为了了解项目代码的编译过程,也需要学习和了解make的机制

->于此对应的,Windows系统下的很多软件,项目,代码的开发,往往都是集成了IDE,可以使很多人避开Makefile

开发辅助工具:SourceInsight,BeyondCompare,虚拟机VirtualBox,Ubuntu等等

典型的开放期间,也往往会用到,用于查看Linux内核源码的SourceInsight,用于比较文件差别的Beyond Compare,用于搭建编译环境的虚拟机VirtualBox+Ubuntu,等等等等。


总结: