版本:v1.5.2
摘要
此文主要介绍的嵌入式软件开发的背景知识,基本逻辑和流程,基本名词、概念和理念,嵌入式开发环境的基本组成,交叉编译和交叉编译器,烧录,工具,系统设计,嵌入式CPU,嵌入式资源,常见问题及解答。
2015-05-25
修订历史 | ||
---|---|---|
修订 1.5.2 | 2015-05-25 | crl |
|
版权 © 2015 Crifan, http://crifan.com
目录
插图清单
表格清单
有任何意见、建议,都欢迎联系我Crifan
目录
摘要
嵌入式是一个很大的概念,从不同的侧面去介绍,可以有不同的解读。
下面就先来说说,嵌入式行业,嵌入式的应用领域,都有哪些:
各种解决方案,各种嵌入式的CPU(MCU,SOC,DSP等等),对应的各种软件开发。
对应着各种产品,比如:
如流量仪,阀门控制器等等,涉及到现场总线等技术
医疗行业内的嵌入式设备的软件开发
除了技术,还有很多标准,比如SPICE等
注意的是:其中,具体开发时,涉及的技术和任务不同,有的严格意义上来说,并不属于,偏底层的嵌入式,比如,android的app开发,其实是主要是用java写上层应用,不是那种,为某特定开发板,比如把android移植到三星手机的硬件平台,涉及到的底层驱动开发,这才是严格意义上的底层驱动开发。关于Android不是传统意义上的嵌入式的解释详见:
下面以一个典型的例子,来阐述,什么是嵌入式产业链。只有明白了嵌入式产业链的基本概念,才能真正理解后面要介绍到的嵌入式软件开发所处的层次和地位。
从芯片研发、量产、方案提供商、产品,中间会涉及到:
用该芯片,加上外设,提供方案,包括cpu,各种外设,以及嵌入式操作系统,整套的软硬件方案
比如爱国者,用此方案去,找设计人员设计外壳
最后组装成
看见的,成品,电子书。
大概过程就是如此。
而你做的事情就是,在该卖方案的公司中,为那套方案中的软件部分,即嵌入式linux写各种外设和接口的驱动,比如nand flash驱动,sd卡驱动,i2c驱动等。这才是一种典型的嵌入式开发。然后你才知道你处在整个产业链中的什么位置,知道你在干什么。
关于嵌入式行业的从业情况,包括公司,人员,技术,工具等等方面的概况,详细很多人和我一样,都是希望有个宏观的了解的。
后来巧了,发现华清远见每年都这方面的调查,此处摘录当前最新的2014年的2013-2014年中国嵌入式开发从业人员大调查
的结果:2013-2014(第六届)中国嵌入式开发从业人员调查报告隆重推出
对应报告是:2013-2014 年(第六届)中国嵌入式开发从业人员调查报告
顺带列上之前几年的调查结果:
下面列出2014年的结果如下,供大家参考:
搞嵌入式开发,对于一些背景知识,也需要了解一下,比如:
嵌入式领域内的软硬件厂商是互相合作的,以及各种不同公司之间的合作关系
比如:之前去购买蓝牙HART猫:
卖家是http://www.mactekcorp.com/的Garry Cusick,其是销售总监
Garry Cusick针对订单的情况,去找公司内部的Thomas Holmes核实之后,Thomas Holmes再去安排发货的事情。
但是去发货时,【记录】查询Fedex的国际快递,
却是从该公司的合作伙伴http://www.avid-tech.com/的Erica Deliere去给我发货的。
由此可见MACTeck和Avid-tech应该是合作伙伴,并且很可能是:
作为研发蓝牙HART猫的MACTeck,虽然具有对应的技术,但是没有生产部门,也不负责生产,所以最终量产时找的是Avid-tech这家代工厂
所以,最终普通用户去购买产品时,最终是从代工厂Avid-tech去发的货。
然后Avid-tech再去选择Fedex这个国际通用的物流公司,去把东西寄给国外的用户
相应的,作为买家的我会收到:
总之:
搞软件开发,搞嵌入式软件开发,对于各种相关公司的关系和背景,也要有所了解,否则都弄不懂东西是谁做的,而无法及时有效的沟通。
另外一个证明各个厂商之间的合作关系的例子:
segger的emWin的升级,就以二进制库的形式,支持合作客户去升级,包括:
等等。
其他还有:Segger是ARM的合作伙伴
通过http://www.arm.com/community/partners/display_product/rw/ProductId/2210/的Partners可以看到:SEGGER Microcontroller GmbH & Co. KG的embOS, Real-Time Operating System
从中可以看出segger是ARM的合作伙伴
然后通过http://www.arm.com/community/partners/all_partners.php发现,ARM的合作伙伴,有一堆,非常多。。。
目录
摘要
包括嵌入式软件开发的知识体系和背景:
先说背景:
计算机,领域内,知识体系,按层次分,可以分为:
其中:
->当然你对硬件的工作方式,工作机制,特点等内容有了解,自然更容易设计出,写出高质量的软件代码
注意:对应的,很多时候,也有把嵌入式硬件,简称为嵌入式的。
此处,暂且不讨论上层的纯软件,以及底层的硬件,只是简要概述一下,中间的嵌入式,尤其是嵌入式软件部分的知识体系,基本架构:
按照是否有操作系统,可分为:
其中,无OS的,相对比较简单:一个大循环,
http://www.segger.com/admin/uploads/productDocs/UM01001_embOS_Generic.pdf
提到的那个Super Loop
有OS的,往往架构都和OS有关:
典型的嵌入式Linux软件系统,根据不同的阶段和模块分,又可以分为:
更多详细的解释,请参见:嵌入式Linux软件开发详解
其中有OS的,按照是否是开源的,是否是常用的,通用的,还是私有分,可以分为:
开源的/常见的/通用的 ,并不是等价的,但是只是此处相对于私有的来说,从概念上和逻辑上,是等价的。
常见的有:嵌入式Linux(及其衍生物Android),QNX,VxWorks,ucOS/II,TRON(ITRON),WinCE等等。
什么叫做,写的代码,是和硬件打交道的?
意思是:对于物理上,真实存在的硬件设备,写代码,操作对应的硬件设备,往往是写硬件的驱动程序之类的
什么叫做,写代码操作硬件设备?
本质上就是:写代码,设置,配置硬件
往往都是:读写硬件设备的寄存器,从而达到使得硬件可以工作,可以正常工作的目的。
什么叫做用代码驱动硬件工作,即什么叫做硬件设备驱动?
背景:
硬件有各种功能,特性;
目的:
希望硬件按照我们所希望的方式,去工作;
需要做的事情:
大体分两步:
举例:
一个典型的,在嵌入式Linux系统中,实现对应的SD卡的
背后的逻辑
我们的目标
以及具体如何去写SD卡驱动的大概步骤和逻辑就是:
SD卡,插入到开发板的SD卡插槽上,然后开发板中正在运行的嵌入式Linux系统,可以识别出该SD卡,并且可以实现SD的数据的读写:
那么,我们就需要:
在嵌入式Linux系统中,为SD卡写驱动
其大概的逻辑和步骤是:
去设置对应的SD卡的寄存器,申请各种相关的软硬件资源(此部分相关细节很多,待以后详解)
即把SD卡配置成你需要的工作模式了,然后再去实现后续的数据读写。
然后再去(Linux的相关的驱动框架下)写相关的SD的数据的读写的功能
操作对应的寄存器
把数据从SD的相关的数据寄存器中读出来
或者是
把要写入的数据,写入到SD的相关的数据寄存器中
其他相关的内容还有:为了提高数据读写速度,可以去利用DMA,如果有DMA可用的话
根据开发内容的所属架构层次分,至少可以分为:
比如在Linux系统中,开发各种设备驱动。
比如在Linux系统上面写各种应用。典型的例子是,在拿到了某芯片的原厂的SDK,比如已实现了各种驱动的嵌入式Linux,基于此,去写Linux的应用。
对于嵌入式领域中会听到,见到的,涉及到如此众多的领域,技术,芯片,公司,开发工具,软件平台等等名称,很多人在开始接触的时候,都会很晕。
而这里,尝试用初学者所能听得懂的方式去解释一些常见的名词,所处的地位和作用
->由此也验证了那句:搞嵌入式开发,尤其是底层开发,相对来说,难度还是要比上层软件要难的
接下来,我熟悉的嵌入式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,等等等等。 |
总结:
哪个行业,哪套硬件和软件平台,哪个软件平台下的什么框架,最终才是某个具体的技术。
只有这样,才能知道自己在干嘛,而不是完全一头雾水的埋头写代码。
->总体来说,搞嵌入式软件开发,入门比较难
->至少比其他上层纯软件的入门要难不少
由于嵌入式本身是个复杂的概念,为了便于理解,此处用类比的手段去好好解释一下,嵌入式开发和从事建筑行业的关系,以便解释清楚,嵌入式学习,需要掌握哪些知识:
举个例子:就像,你从事的是建筑行业
有些是相对通用的基本知识和技能:(不论你是干体力活的各种工种的工人,还是大楼的整个架构的设计师)进入建筑工地,都要戴安全帽
不论你是干哪个工种的,比如瓦工,水电工,木工等等,那基本上都要具备的基本素质都是:
身体素质本身要好,要能吃苦
但是,很明显,有些知识和技能,就属于领域相关的知识:
你干瓦工的,要能看懂施工图,要会砌砖,砌各种类型的砖,等等;
你搞木工,那锯子,刨子,锤子,斧头,那要用的熟,能玩出花样来,才能做出好的柜子,椅子,桌子啥的;
如此等等。但如果是你瓦工,则不需要关心木工需要了解的技能,反之亦然。
而搞嵌入式,这上面这几点上,有点类似于搞建筑行业:
比如C语言,汇编语言,C++语言等等
硬件采用何种芯片,比如是ARM内核还是MIPS内核
是ARM内核的话,具体是哪种内核,比如ARM9TDMI还是Cortex-M3等等
不过,关于芯片架构的事情,要好好解释解释:
经常看到,嵌入式方面,介绍arm的架构
但是却又感觉学了也没啥用,和工作的内容也对不上号,纯粹就是在死读书,读死书
至少我最开始的感觉就是这样
现在其实也还是没有透彻理解,不过有一点点心得了,总结如下
比如以ARM Cortex-M3为例:
解释我所能够理解的,架构中的内容,和你后续嵌入式Linux开发之间的关系:
里面有AHB和APB
对应Linux中就是有对应的AMBA的概念的定义的,好像是在设备注册期间也有涉及到,比如probe的时候
决定了是用uclinux还是linux
比如说Cortex-M3采用了ARMv7内核
则意味着你选择交叉编译器(甚至是自己用crosstool-ng去制作交叉编译器)的时候内核选择是armv7。
比如说Cortex-M3是Thumb2的指令集
意味着,比如后期制作或用交叉编译器时,编译代码、生成什么样的汇编指令,都是要设置为thumb2
如此,一点点地,把芯片架构是什么,以及不同的值的真正含义是什么,对后续开发有何影响,都说清楚了
这样才能说,明白了芯片的架构
相对通用的操作系统:嵌入式Linux,ucOS/II,VxWorks等等
TODO:http://www.windriver.com/evaluations/gpp-ve/可以下载试用包,有空去试试。
此处需要专门解释一下,被很多人归类为嵌入式操作系统的Android,实际上不是传统意义上的嵌入式操作系统。
典型的Android系统中,根据开发所用语言不同和开发环境不同,可以划分为:
此时,对于传统意义上的,嵌入式软件开发,尤其是嵌入式Linux驱动开发,基本上是和,上述的Android开发中的,嵌入式底层开发中的Linux驱动开发,是基本上一样的。
而Android系统中的其他内容,包括嵌入式底层的Java的JNI,Android驱动模型,以及上层应用的Java的Android的app开发,都是和传统的Linux的驱动开发,没什么关系,也是差别很大的,包括所使用的语言,以及所使用的开发环境。
即,Android的开发,基本上都是基于app那层去开发app的,都是用Java语言去写代码的。且底层有Android的运行时作为支持
而Linux的开发,对于Linux驱动开发,都是基于底层的内核去开发的,用的都是C语言,甚至偶尔还会涉及到汇编代码;对于Linux的应用层面的开发,都是Application Framework级别的,应用程序的开发,往往都是去写C语言代码的。
对应的传统Linux嵌入式驱动开发,以及Android中的app开发,以及Android中的驱动移植,所处于不同层次的关系,可以用下图表示:
而对于Android的中间的Libraris,Android Runtime,以及Application Framework,很多时候,是各种(C,C++,Java等)不同的语言的混合体,包括中间的Android Runtime是利用到了Java的JNI,为Java和C或C++语言之间,提供一个接口,可以互相通讯。
而对于Android这套框架来说:
则是去开发上层的应用->比如基于Android做一个收音机,做一个音乐播放器等等的应用
->都是在Android的框架之下(用Android相关的工具,比如Eclipse+ADT) 去写Java代码去实现对应的功能
->那就是在Linux内核框架下,去实现各种功能和模块
->典型的工作要属,你是一个做硬件的公司,做了块开发板,为了使得其支持Android系统,需要在开发板这个硬件的基础上,去为开发板中的各个硬件模块,比如Nand Flash存储芯片,SD卡芯片,网卡芯片等等,去写对应的模块的驱动
->此时主要就是在Linux框架下写C(或C++)代码去实现模块驱动
->当然有时候为了支持Android,还需要了解Android本身的框架,可能还需要加上一些JNI的代码支持
对于嵌入式开发来说,不论你是用何种嵌入式操作系统,都会涉及到,嵌入式环境的搭建和如何使用,如何去搞嵌入式开发。
比如,如果是嵌入式Linux的话,则要去搞懂常见的uboot+kernel+rootfs开发环境
不论是嵌入式Linux,还是WinCE等环境,都会涉及到,将程序交叉编译成可执行文件后,要下载到目标环境中。
这个动作,往往被叫做burn,烧录,烧写。
比如嵌入式Linux中,有很多种烧写方式:tftp,通过uboot,专门的烧写工具等等
如何用tftp下载文件
WinCE平台,也有特定的烧写工具
相关内容:【详解】嵌入式开发中固件的烧录方式
此处的嵌入式环境中的调试,包括不同的调试方法和用不同的调试工具去调试。
换句话说,不论你在嵌入式行业内,具体做什么“工种”,以我之前所遇到,见到,听到的为例:
那么C语言,基本都是必备的,基本功,因此:不论你做相关的哪种领域的嵌入式开发,那么都要努力学好C语言
学好C语言是什么意思 | |
---|---|
学好C语言的意思是:不单单掌握C语言的语法,更要:
等等。 |
另外,由于一些嵌入式操作系统,比如嵌入式Linux系统,ucOS/II(以及其他很多常见的嵌入式操作系统,比如VxWorks等)都是相对通用的。
所以,为了学好嵌入式,也要尽量找机会去多学习和了解这些系统的特点和使用方法,最好找机会多去实际动手练习。
同理:有些是Domain knowledge,即领域相关的知识
关于这部分,之前见过的,一个老外写的,不错的嵌入式的教程:
第 16.1.1 节 “Embedded Systems Architecture: A Comprehensive Guide for Engineers and Programmers”
中所给出的例子,就是个很好的,domain knowledge的例子:
如果打算从事嵌入式机顶盒方面的嵌入式开发的话,那么往往又要涉及到
DVB,MHP,EGB,和其他的协议,架构,软件库,等等等等
所以说对于不同的领域,其所相关的东西,光是新名词就一堆一堆的
更别说,每个名字后面都对应着一堆规范说明,都N多页N多页
往往还都是英文的
此时你所面对这些技术(名字和规范说明)的心情
有点类似于:你是干木匠的,然后让你去把瓦工干的活,不仅仅要把名词搞懂了,还要搞懂如何实现的,并且还要把活干得好
这时候,往往就是:需要你有足够的背景知识:对于该领域所涉及的到的技术,即使没实际经验,也要最好有个概念
加上良好的学习能力:有了其他领域的背景知识,以便于稍微帮助你学习新领域的知识
以及良好的悟性:很多时候,学习新东西,出了基础和经验,剩下就是悟性了
加上:足够的耐心,毅力
以及实际动手能力:把所理解的内容,能转化有有效的代码,
最终:
真正去用高质量的代码,实现软件的功能
由此,算是:
在建筑领域内混的一个木工,靠着基础知识,努力学习瓦工方面的知识,加上良好的悟性和动手能力,
最终把瓦工的活干了,而且干得还不错
当然老板最希望你是:干的比原来的瓦工干的还好
如此,正所谓:嵌入式开发中
最先要,也最重要的,是把基础知识学好了,基础打牢了;
然后是,针对所要学习和工作的相关领域的知识,去用最短的时间,最大的学习热情,加上悟性,和学习方法,最终掌握该领域的知识,并且实际动手去锻炼,最终实现目标:
用高质量的代码实现嵌入式领域内的相关的软件功能
如果做消费类数码方面的嵌入式研发,往往会涉及到嵌入式开发板
以某个SoC芯片为核心的开发板,然后上面有各种接口
为各种接口去开发不同平台下,比如嵌入式Linux,ucOS/II等等,的驱动,或者上层应用层的软件。
其实严格区分的工业自动化控制的话,算是两个方向,工业控制和工业自动化,这两个领域,也是不同,各有侧重点的。
但是此处也还是算是工业方面的领域,所以就放在一起说了。
可能会涉及的技术:现场总线
汽车电子领域内,在协议和接口方面,相对用的最多的是CAN总线协议,也常会涉及到MOST(Media Oriented Systems Transport)总线
相对来说其他行业就很少用到这类技术。
除了汽车电子领域相关的技术,往往还会涉及到相关的标准,比如SPICE等等。
嵌入式教程,关于嵌入式硬件,尤其是嵌入式开发,尤其是上面的CPU:
从底层硬件实体,到上层软件层面的抽象,到底是如何映射的
抽空写教程,详细介绍
此处,先简要介绍一下:
比如ARM核的片内RAM,比如128K,等等内容
包括CPU内部是对应的ALU,寄存器,等等
包括内部寄存器,分为几种类型,比如arm的shadow寄存器,在某些FIP等特殊情况下,无需保存现场,而直接实现中断时快速跳转等功能
具体需要再去学习硬件电路基础知识中提到的那个教程:http://www.play-hookey.com/,才能具体解释清楚的。
都是这些晶体管,慢慢的组合,构成不同的逻辑电路的,包括什么D寄存器,K寄存器(好像是)之类的。
目录
摘要
嵌入式领域内,有很多常见的基本概念和名词,对于初学者来说,往往是听都没听过这些词,更别说明白其含义了。
此处就整理一下,我所知道的一些嵌入式领域内的常见的概念和名词的含义。
比如:具备USB,CAN和以太网功能的PIC32微控制器系列中的:
就是:
开发套件
= 硬件+软件
= 硬件开发板 + 集成的IDE 或 单独提供的编译器,示例代码等内容
其他的,各种平台的,往往也会提供对应的,硬件(开发板,模块等等)+软件(软件源码,示例代码,驱动等等)的组合,叫做对应的Tookit,即工具套件
成套提供,以套餐方式的提供
类似的词还有:StartKit,DevBoard
也都是,方便用户进行快速上手开发的开发板
目的是:
方便其用户,作为嵌入式开发的你,尽快的上手,能够跑通这个平台,能用于构建你的嵌入式系统,
能够进行接下来的,你所需要的相关的软硬件方面的开发。
其背景是:
如果芯片厂家,直接把一款芯片扔给你,给你用;
不仅是新手,即使是老手,嵌入式有经验的,也要相对很耗精力,才能搞懂如何初始化,如何让其运行起来,即跑起来,需要花不少的精力
因为嵌入式领域,芯片不同,细节会千差万别,所需要了解的细节也很多。
所以,才有:
卖芯片的厂家,除了设计,量产,销售芯片给作为客户当你之外,
往往还有对应的所谓的开发套件,
即硬件(芯片或开发板)加上对应的软件(驱动,示例代码)
然后让芯片尽快的,正常的跑起来
之后才是作为嵌入式开发者的你,继续后续折腾,实现对应的你自己的功能。
举例:
不仅各种硬件模块有Part Number
软件(或库,组件等)也有
比如:MPLAB Integrated Development Environment的"Part Number: SW007002"表示:
Part Number==作为该软件或硬件的标示==就像人的身份证
-> 你想要买人家的产品(某软件或硬件),只需要告诉人家对应的Part Number即可
->人家就知道你要买的,具体是哪个东西了。
简单说就是:专门设计芯片的,但是没有自己的制造工厂。
是自己设计出芯片后,找其他的,专门制造生产芯片的公司去生产,对应的生产芯片的公司,也是下面将要介绍的,Foundry。
比如:威盛电子 - 维基百科,自由的百科全书就是一个fabless
全球范围内的fabless,非常非常多。
维基百科有些统计,可供参考:
Category:Fabless semiconductor companies - Wikipedia, the free encyclopedia
Fabless manufacturing - Wikipedia, the free encyclopedia
其中里面比较典型的一些企业有:AMD,ARM,ATI,Broadcom,Marvell,MediaTek,Qualcomm,Realtek,Rockchip,Silicon Labs,Tensilica,VIA,Xilinx
简单说就是:专门生产芯片的公司
详细的说:专业的叫法叫做,专业集成电路制造服务类的企业
详见:Foundry - Wikipedia, the free encyclopedia
世界上最大的、最有名的要数,台积电,了。
详见:
另外其他还有一些小的晶圆厂,比如AMS==奥地利微电子,也有自己的晶圆厂。
详见:AMS公司投2500万欧元建三维堆叠集成电路制造能力_全球军情_全球防务频道_新闻中心,奥地利计划购买200毫米晶圆代工厂以加强晶圆制造能力
其他相关资料:
谈到fabless,往往就会涉及到一个概念:IP Core。
因为,这类fabless,就只是设计芯片,对应的产出就是对应的IP Core。
举个类似的例子:fabless设计出IP Core或者叫做芯片,拿去给Foundry去生产
就类似于,建筑设计院设计出一栋大楼的图纸,拿去给建筑商去建造出来,是一个道理。
fabless有设计能力,foundry有生产能力
此处的量产,有两种含义:
烧录固件到已有的嵌入式设备(尤其是U盘)上
不过,量产还有另外一种意思,就是已经有了对应的可以使用的某设备。
尤其是U盘,然后重新用烧录工具,将另外一个新版本的程序,一般叫做固件,烧录进去
实现功能的改进,比如将原先的U盘,弄成CDROM+U盘的形式。
相关细节可参考我之前的一些折腾:
【教你从不懂U盘量产到量产成功 -> 宇瞻AH320微笑碟8G详细量产过程】【记录】Transcend创见16GB USB3.0 U盘 第二次重新量产为USB+CDROM【记录】第四次折腾U盘量产以制作Win7启动U盘用于专门处理浮点数据的处理器。
嵌入式领域内,谈到浮点处理时,往往会提到这个:VFP,浮点处理器
比如:
中提到的:ARM的NEON的VFP
footprint的英文本意是:脚印
放在嵌入式领域内,指的是:软件类的东西(比如一个操作系统,某个软件,某个协议栈等等),所占用的存储空间的大小。
可以理解为:嵌入式系统中,把软件,看成一个人,此人在RAM或ROM等存储空间上,所踩出来的脚印。
与此相关的,在介绍某软件,组件的优点时,说的更多的是“small footprint”这个词。
随便举个例子:
RTOS – Real-Time Operating Systems for Embedded Development, Real Time System By Express Logic
中,ThreadX这个嵌入式操作系统,在解释其优势的时候,其中一条就是:“Small Footprint”
指的就是:
此ThreadX嵌入式操作系统,所需要的RAM或ROM等存储空间相对较小
摘要
嵌入式开发,有很多主流的操作系统,对应着各自不同的开发环境。
常见的有:
下面分别来解释:
先要搞懂嵌入式Linux开发的常见的,典型的环境的基本组成:uboot+kernel+rootfs
为何要bootloader
为何非要有个rootfs。
为何非要这么开发,换个方式行不行,有没有更好的方式。
大了说,是一套编译开发环境
抽空再按照,硬件有哪些,软件需要哪些去划分,可能更容易理解。
关于嵌入式Linux开发环境的解释,详见:
摘要
嵌入式编译,除了会涉及编译原理本身的东西之外,还会很多不同体系架构方面特定的内容。
比如,ARM的scatter file的概念。
TODO:详见:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0474c/CHDDDBGE.html
摘要
烧录,英文叫做burn。
也常被叫做下载,download
指的是,把嵌入式开发期间,编译好的文件,往往又被称为固件,firmware。从你的当前搞嵌入式开发的PC机,也叫做主机端host,传输到你的目标平台,即开发板,真正用来存储和运行你的固件程序的地方。这个过程,就叫做烧录,下载。
下面是一些常见的,用的比较广泛的烧录工具:
Keil公司在Keil Flash Utility就列举了很多,其中就有这个JLink
之前也折腾过很多:使用破解版的JLink实现对开发板上的外部Nor Flash的烧写 + JLink V4.08k 下载地址
比如e8a的开发板,自带USB接口的专门用于烧录e8a板子的特殊硬件
其他还有一些小众的烧录工具,很多都是针对自己的开发板去烧录程序的工具:
目录
摘要
TODO:
【整理】嵌入式IDE:Renesas的HEW(High-performance Embedded Workshop)
【整理】嵌入式IDE:IAR Embedded Workbench IDE简介
嵌入式开发领域内也有很多常见的,相对通用的IDE:
ARM自家有一些常见的工具,之前叫做ADS,后来升级到RVDS,后来还收购了Keil的RealView MDK
ADS最常用的版本就是ADS 1.2
协议分析工具很方便很强大 -> 有机会还是多多利用协议分析工具 -> 提高工作效率
比如之前的,就见过USB协议分析工具,即USB基础知识概论中其他一些USB测试和协议分析等软件提到的:
“Ellisys的USB Explorer 260硬件,加上对应的USB软件Ellisys USB Analysis Software,实现USB数据抓包和分析”和:“Catalyst Enterprises公司的硬件,加上对应的软件SBAE USB,实现USB数据捕获和分析”
SBAE的效果可参见: 举例详解USB的枚举过程
现在又在: http://www.zlgmcu.com/tools/LogicAnalyser/LA1032/LA1032-SD.pdf中看到有个原始数据:
用(SD)协议分析工具分析后的结果:
很明显:
在SD协议中对应的物理的信号所表示的含义,不用你很笨的手动一点点的去分析了,因为人家的分析工具直接帮你分析好了。相对来说,算是极大的提高了工作效率。
所以,有机会,有条件(毕竟有些协议没有这么好的分析工具,或者即使有未必是免费,未必你能得到该工具)的话,还是好好利用工具,提高做事情的效率。
市面上有很多不同公司提供的,各种类型的编译器和其他相关开发工具。
比如raisonance提供的:C编译器,编程工具,调试工具,评估板,支持来自不同厂商,包括NXP,STMicroelectrics,TI,Silicon Laboratories等,基于ARM,8051,STM8,ST7,PowerPC,CoolRISC为微处理器内核的快速开发。
嵌入式调试工具TDS560 Plus仿真器,http://www.armkits.com/product/tds560.asp,用于调试TI的DSP(也支持ARM)的开发。
摘要
硬件选型时需要根据所需的硬件资源情况去选择合适芯片
比如:
就列出来了,不同芯片,所具体的不同资源:
是否有所需要的功能模块
以及部分功能模块的数量:根据需要选择满足你的需求的芯片
比如:
需要性能相对高的,所要CPU的频率相对高 -> 才能流畅的跑很多复杂的,资源消耗多的应用
其他比如, SPI等接口的个数,决定了,你如果外接某些设备,比如SPI的Wifi芯片,至少占用1个SPI接口,
如果还有其他的模块需要SPI接口,则需要考虑SPI接口总数是否够用
类似的,还有I2C,UART等其他接口,都需要根据自己的实际需求,决定所需要的接口的个数,是否够用
另外还有类似的DMA:
有些Nand Flash,SD卡等模块,为了提高数据传输速度,则可以用DMA来实现
所以,如果系统中Nand Flash,SD卡,都需要DMA,那么此时至少需要2个DMA通道。所以,需要选择DMA通道个数大于2的芯片。
其中,关于DMA,不了解的可参考: 详解ARM的AMBA设备中的DMA设备PL08X的Linux驱动
说实话,自己没有真正独立的从无到有的设计一个嵌入式系统,所以整理出来的内容,也是参考别人写的内容。
截至目前,尤其是也没发现,有解释的够详细的,暂时看到了点资料,整理过来,仅供参考:
http://www.uml.org.cn/embeded/pdf/embed_design.pdf
摘要
嵌入式CPU/SoC/MCU/DSP等核心参数:主要还是性能:MHz,存储:RAM,外设多少等等
比如,除了之前【整理】嵌入式开发经验和心得总结
中提到的PIC32的那个图,现在还有个:
的产品型号参数表,也可以提现出这点,主要参数还是性能:
嵌入式的CPU的应用领域,其实和本身嵌入式的领域的划分:第 1.1 节 “嵌入式行业和领域”是差不多的。
下面总结一下,不同的嵌入式CPU的主要特点,应用领域:
TODO:SHARC处理器的应用
特点:
在浮点DSP市场占据主导地位
拥有出色的内核和存储器性能
以及优异的I/O吞吐能力
主要应用领域:
ARM本身应用极其广泛。此处只总结部分的典型应用。
TODO:ARM内核的应用
ARM946E-S 处理器可用于众多先进的数字产品:
ARM还有Corte系列的内核, 比如常用的Cortex M3/M4
Renesas的芯片在汽车电子领域中应用较广
比如某汽车内部用到的芯片就有Renesas V850/K0R
Freescale的芯片在汽车电子领域中应用较广
摘要
TODO:
图像传感器,Image Sensor,之前所接触到的,都只是放在CPU内部的。
后来才看到,还有外部接口接Image Sensor的:
http://www.armkits.com/download/at91sam9g45.pdf中的:ITU-R BT. 601/656 Image Sensor Interface
是专门的接口,用于连接外部图像传感器的。
目录
摘要
嵌入式软件开发期间,也会涉及到很多硬件相关的知识。
比如ARM的LEON3:想要在LEON3基础上添加更多模块,则可参考:LEON3 Integration
搞嵌入式软件开发,往往会涉及很多芯片,其中芯片的外形和大小,和其封装方式有关。
芯片封装方式,有很多种,比如:
TODO:抽空了解封装方面的知识:
http://www.spansion.com/CN/Products/diewafer/Pages/DieWafer-NOR-Flash.aspx
摘要
嵌入式软件方面的开发期间,会遇到各种不同的软件的、硬件的、开发板的等等方面的厂商、公司。
对此需要有一定了解,以便于熟悉本行业的情况,便于后续开发。
下面来总结一下常见的各方面的公司、厂商:
中的介绍,支持很多类似的CPU:
另外,注意到,Keil也支持AMS的芯片:
http://www.keil.com/dd/中的:AustriaMicroSystems AS3525和:List of ARM7/ARM9/Cortex Devices Available from AustriaMicroSystems
需要提醒的是:Keil后来被ARM买了,现在属于ARM旗下的品牌了。
嵌入式软件开发期间,常会遇到很多嵌入式开发板。
下面就来整理一些嵌入式开发板:
之前用过ARM9的TQ2440的开发板,觉得还不错,资料算很齐全。
各种软硬件支持的也不错。
看到一个觉得算特别的点:
双MAC的MCU:唯一一个集成2个MAC的MCU
其他还有其他特点:
支持多种操作系统
已在多个领域内应用
可编程实时单元和工业用通信子系统(PRU-ICSS)从ARM内核分离,从而实现了针对更大效率和灵活性的独立运行和时钟控制。
PRU-ICSS支持附加外设接口和诸如EtherCAT,PROFINET,EtherNet/IP,PROFIBUS,以太网POWERLINK,串行实时通信协议(Sercos)的实时协议和其它协议。
摘要
嵌入式软件方面的开发期间,会遇到各种常见的协议、接口、总线等等。
下面就来总结一下,常见的协议和接口,总线。
以前都没听说过MIPI。后来无意间在cadence的一个资料中看到了MIPI,说是目的是以后代替其他所有的内部总线:
貌似上述的内部总线,都会被MIPI取代,好像是包含C-PHY, D-PHY, M-PHY, and UniPro
目录
摘要
嵌入式软件开发领域内,有很多常见的疑问。此处试图解答清楚这类疑问。
14.1. |
学习嵌入式C语言要掌握到什么程度? 比如要求C语言能编多少行的程序,还是看懂多么复杂的程序,还是只要会修改就行。 |
主要是针对:学习嵌入式C语言要掌握到什么程度? - 知乎的回答。 其实嵌入式,尤其是嵌入式底层驱动开发,对于写代码的多少和价值,用一句经典话的话来描述就是: 如果写一个嵌入式驱动,一共100行, 写出来那100行代码,本身可能只值1块钱 而搞懂如何写,值99元 -> 嵌入式,尤其是底层驱动开发,其实代码量相对(尤其是上层软件)都不是很大,但是要搞懂背后的逻辑,协议,接口,框架,平台等内容,然后才能写出来代码。 而搞懂背后的逻辑,往往才是难点和重点。 -> 所以,往往也不能简单说就是,需要你看懂多么多么复杂的逻辑的程序的代码,而是: 看似代码量不多,但是寥寥几行代码背后,所涉及到的软件和硬件的知识,系统方面的知识,框架方面的知识,才是对你来说,最复杂的。 -> 当然,如果搞懂了应该如何写,往往也就会修改对应的代码了。 总的来说: 嵌入式开发,需要的背景知识:
等等,很多很杂的内容。而在这些都搞懂的前提下,对于C语言本身的语言方面的要求,其实相对来说并不高:只需要有一定的编码经验,懂C语言语法,即可去写代码,修改代码。 简言之:
而关于嵌入式的,行业背景知识,系统平台和框架,驱动框架等等方面的东西:
|
摘要
在嵌入式开发领域,有很多的别的走过的路,做过的事情,值得参考和借鉴的。整理如下:
后,感悟:也是可以去继续学习硬件电路设计的大不了,靠自己自学。毕竟现在算是有了一定的基础,足够的网络资源,足够的学习方法,
善于组织和利用的话,还是可以靠自己,一点点积累出来对应的硬件机能的。如此,加上自己对软件的理解,才能最终算是对于计算机的软件和硬件,都有自己的理解,才可能设计出好的东西
这句我觉得说的不错:http://bbs.csdn.net/topics/40212259?list=lz
to DancingCalf(未出手的飞刀) : 其实并没有本质上的改变,我一直在IT行业学习工作。让我作出改变的原因是我想做的更加深入,可以说 一个对操作系统不了解的人很难写出优秀的应用系统,对硬件不了解的人也不可能深刻理解操作系统,同样对IC不了解的人也无法真正理解硬件,这决定了我的发 展方向。当然这样是无穷无尽的,这也应了那句古言“学无止境”。一个人不可能学会全部的知识,但我不想用这个理由为自己的停滞不前做解释。
目录
摘要
关于嵌入式软件开发,有一些还不错的值得推荐的书:
这本书,以一个实际的嵌入式系统开发的例子去解释了,嵌入式开发期间到底会涉及到哪些知识,具体的系统架构是什么样的,嵌入式硬件和软件分别有哪些内容等等。
从整体嵌入式框架,到嵌入式的Host端和嵌入式开发板端,感觉就是无所不包。
所以可以说,该书最大的特点,算是内容非常翔实。
比如,在“3.7 Putting It All Together: The Integrated Circuit (IC)”中,把嵌入式中涉及到的电阻,电容,封装形式等等,都简单解释了基本概念。这类知识的介绍,对于嵌入式入门和开发,很有帮助。
如此,等你看完了该书,就能真正的对于真实的嵌入式系统,有了很好的概念了。
网上找到的免费的PDF版本的下载地址:[PDF] Embedded Systems Architecture A Comprehensive Guide for Engineers and Programmers
亚马逊也有卖的:[Amazon] Embedded Systems Architecture A Comprehensive Guide for Engineers and Programmers
摘要
要写优质的教程,让别人看得懂的教程,才有价值。
而关于如何写教程,举个例子:
看了这个:
后,所想到的:
如果我去写对应的该部分的内容,那么应该是:
最好把全部代码贴出来
或者至少把驱动核心部分框架和核心代码贴出来。
只有搞懂了,框架帮你做了哪些了
然后你才懂,余下来的事情,就是自己需要实现的了。
再去一点点,搞懂函数的接口和内部实现的逻辑
然后再去写代码,一点点实现
再去边调试边写驱动的代码
网上有很多嵌入式教程写的都不够透彻,没将明白要修改文件背后的逻辑,为何要这么修改。
比如:mini2440 u-boot-2009.03 移植最详细攻略
说实话,已经写的,算是步骤相对比较详细了。
但是:
最核心的,最根本的:
如何移植,为何要改这些文件
以及背后的逻辑,都没有解释
导致的结果:
除非本身对这方面的移植已经有概念的
否则,很容易看着一头雾水:
感觉就是:
这个文件改改
那个文件改改
而且为何这么修改,往往解释的也不够清楚和详细
使得:
如果自己拿到对应的源码,对应的硬件
对于如何移植,还是一头雾水
所以,抽空自己去:
亲自折腾一遍移植
并且详细记录步骤
如果要修改文件或其他地方
一定要解释清楚背后的逻辑
然后等移植完毕
再花时间,搞懂uboot的框架
搞懂如果从头到尾,自己亲力亲为,从无到有的,去移植Uboot
背后的逻辑是啥
需要关心哪些功能
这些功能Uboot中已经有了什么(框架,驱动)了。
还需要我们去实现哪些东西
以及,具体再解释,针对每个要改的功能模块
自己应该如何去改
所以要:
思路清晰
再去下手
否则:
永远都是:只能照葫芦画瓢,而且画的还不像
只有:
自己搞懂逻辑和概念了,
才能:
不仅可以快速高效的,照葫芦画瓢,而且如果需要,也可以自己从无到有的去涉及一个葫芦或一个瓢(可供别人当参考)
结论:
抽空先自己搞懂如何移植Uboot,然后再抽空整理出思路和有参考价值的教程。
[1] 关于嵌入式驱动的学习?- 知乎
[8] 嵌入式开发之嵌入式背景知识
[9] 嵌入式开发之基本概念和开发逻辑
[11] 【整理】嵌入式领域的名词概念解释
[12] 【整理】嵌入式开发经验和心得总结
[14] AM335X开发板_百度百科
[16] 【整理】嵌入式软件知识体系概述