对于嵌入式领域中会听到,见到的,涉及到如此众多的领域,技术,芯片,公司,开发工具,软件平台等等名称,很多人在开始接触的时候,都会很晕。
而这里,尝试用初学者所能听得懂的方式去解释一些常见的名词,所处的地位和作用
->由此也验证了那句:搞嵌入式开发,尤其是底层开发,相对来说,难度还是要比上层软件要难的
接下来,我熟悉的嵌入式Linux中Nand Flash驱动开发为例来解释说明具体过程和所涉及到的内容:
假如你是个普通的嵌入式驱动软件开发者,你的老板给你安排一个嵌入式Linux中Nand Flash驱动开发的任务的时候,就会直接或间接接触到很多东西:
表 2.1. 嵌入式Linux驱动开发期间相关的内容
嵌入式Linux中Nand Flash驱动开发期间直接涉及到的 | 嵌入式Linux中Nand Flash驱动开发期间间接相关的,类似的,类比的 | 备注 |
---|---|---|
首先,此处所从事的开发领域,是一个消费类数码产品,比如电子书 | 于此对应的,同级别的,其他开发领域有:工业控制,医疗器械,汽车电子等等行业 ->其他不同行业内,所要接触到的开发任务,往往又是完全不同的任务 ->比如工业控制领域所涉及到的现场总线Fieldbus,对于搞消费类数码的人来说,甚至可以说很多名词和概念都没听过。 ->更别说,让你去折腾HART,FF(Foundation Fieldbus),Profibus,了,其和消费类数码领域,很多技术都是完全不同和不相关的 | 相关内容:现场总线Fieldbus简析 |
其次,此处的操作系统用的是嵌入式Linux系统 ->目前在嵌入式领域内使用可以说是最广泛的 | 与此对应的,同级别的,其他的,嵌入式操作系统也有很多,比如:ucOS/II,VxWorks,等等。 | |
而对于Nand Flash,作为其中一种设备,一种接口,与此对应的也有其他很多协议/设备/接口,比如:Nor Flash,Bluetooth,USB,RS232,SD/MMC等等; | ->换句话说,有可能过些天,你的老板让你去实现Linux中的SD/MMC驱动。 | |
而接着你就开始去折腾Linux下面的Nand Flash芯片驱动的开发了,然后你可能就会接触到很多很多相关知识了:假如所用的硬件,先是嵌入式开发板,所用SoC芯片是S3C2440,是基于ARM的ARM920T内核的芯片: | ||
嵌入式开发板 | ->网上也有很多其他开发板,就是用来卖给你们,用来折腾的,用来搞嵌入式开发的->比如你可以花点钱,买个对应到板子,用于练手,练习各种驱动的或应用的开发; | |
SoC | ->>此处的嵌入式CPU,很多时候,用的是另外一个标准叫法,SoC,而与SoC类似(但不相同的)概念还有MCU,DSP,ASIC,FPGA等等; | |
S3C2440 | ->此处是三星的芯片S3C2440,三星自己家的其他基于ARM内核的芯片还有很多,比如S3C2410,S3C6410等等。而与此类似的 ->类似三星的,也还有其他厂商,可以有能力自己去设计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 | ->类似的内核系列还有ARM922T,ARM926EJS等等,以及后来出来的ARM Cortex系列,Cortex-M3是比较流行的一个系列 | |
现在很多开发板,都是采用比较新的,流行的SoC,而也是基于ARM内核的,比如最新一点的ARM11,ARM Cortex-M3等等; | ||
然后再接着说工作细节中涉及到的Nand Flash芯片方面的知识,此处假设用的Nand Flash芯片是三星的K9GAG08U0M | ||
Nand Flash | ->和Nand Flash对应的Flash技术还有Nor Flash,以及其他更进一步的封装后的LBA Nand Flash,eMMC等等。 | |
三星的Nand Flash | ->与此对应的是,其他还有很多Nand Flash芯片厂商,比如Micron镁光,东芝Toshiba,Hynix海力士,闪迪SanDisk等等,Intel英特尔 | |
K9GAG08U0M | ->其他还有很多常用的三星的Nand Flash芯片,比如K9LBG08UXD等等。 | |
然后再说开发所涉及到的软件,包含很多方面,一个个说:交叉编译环境,嵌入式Linux环境构成等等 | ||
交叉编译环境 | 使用交叉编译工具链:已有交叉编译器,配置好环境就可以用来交叉编译了; 制作交叉工具链:没有交叉编译器,则需要自己去制作交叉编译器,比如用Buildroot,crosstool-ng等等去制作 | 相关内容:交叉编译详解,crosstool-ng详解 |
整套的嵌入式Linux环境:uboot+kernel+rootfs | 典型的嵌入式Linux开发环境主要构成就是:uboot+kernel+rootfs ,->与嵌入式Linux对应的有,WinCE,其又是不一样的,自己一套的开发环境 ,->期间就可能会涉及到,用ARM自己的开发工具去在Windows主机上面交叉编译了,ARM的相关开发工具有ADS,RVDS等等 | |
Uboot | 叫做bootloader,类似Uboot的还有vivi,Redboot,(WinCE下的)Eboot等等 | |
Kernel==Linux Kernel | 指的是Linux的内核,类似的,就是完全另外一套的WinCE环境了。 | |
Rootfs | rootfs内容:各种制作rootfs的工具,手动制作,用工具制作(比如用Buildroot生成的rootfs)rootfs格式:用哪种文件系统,此处假如用yaffs2 | |
Yaffs2 | 类似的,适用于Nand Flash的文件系统还有JFFS2,YAFFS,UBIFS 对应着,还要有制作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的内部结构的Block,Page,OOB,数据需要用ECC算法校验保证数据无误(硬件还是软件ECC,ECC算法是BCH的话支持4位还是8位),为了延长使用寿命而去实现负载平衡Wear Leveling,等等需要考虑很多 | |
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,等等等等。 |
总结:
- 搞嵌入式开发,更多的时候,需要先搞懂所涉及的技术所处的层次:
哪个行业,哪套硬件和软件平台,哪个软件平台下的什么框架,最终才是某个具体的技术。
只有这样,才能知道自己在干嘛,而不是完全一头雾水的埋头写代码。
- 正因为嵌入式开发涉及到的概念,软件,硬件,平台,比较多,需要的背景知识比较多,所以才会有那个结论
->总体来说,搞嵌入式软件开发,入门比较难
->至少比其他上层纯软件的入门要难不少