1、《ARM嵌入式系统基础教程》周立功
2、《ARM体系结构与编程》杜春雷
3、 具体芯片的datasheet——引起重视,相当重要
4、《嵌入式实时操作系统uCOS-II》邵贝贝
5、《嵌入式linux应用开发完全手册》韦东山
6、《LINUX内核设计与实现》(第二版)
7、《UNIX环境高级编程》
8、《Linux设备驱动开发详解》宋宝华
9、《Linux设备驱动程序》第三版
10、《深入理解Linux内核》第三版
11、《LINUX内核源代码情景分析》
(1) c语言是所有编程语言中的强者,单片机、dsp、类似arm的种种芯片的编程都可以用c语言搞定),因此必须非常熟练的掌握。
推荐书籍:《the c programming language》 这本经典的教材是老外写的,也有中译版本。
(2) 操作系统原理,是必需的,如果 是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。
(3) (3)linux操作系统就是用c语言编写的,所以 也应该先学习下linux方面的编程,只有 会应用了,才能近一步去了解其内核的精髓。
推荐书籍:《unix环境高级编程》(第2版)
(4) 了解arm的架构,原理,以及其汇编指令, 在嵌入式开发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。
(5) 系统移植的时候,就需要 从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂,也没有太多详细资料。
(6) 驱动开发
linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。
linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前 要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。
ARM入门学习方法2010年03月31日 星期三 15:20一 首先说说ARM的发展
可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位。
广义的嵌入式无非几种:传统的什么51、AVR、PIC称做嵌入式微控制器;ARM是嵌入式微处理器;DSP;FPGA。
客观的讲,工作需求量上DSP的需求比ARM要多,而ARM和FPGA差不多。
DSP因为数字处理与通信领域的空前发展而火暴,小到MP3 射象头,大到我们军品里的控制器,应用面很广。
FPGA的兄弟一般做ANSIC(特殊芯片设计,好象是这么翻译的)。而ARM单纯说来并不比一个单片机强多少,但是它的独特就在于不断下降的价格和提升的性能。这完全依靠于ARM公司的战略,厉害!!很佩服他们的战略眼光!!
值得注意的是:在找工作中,企业(著名的,小的不算)对单纯的ARM硬件开发工程师并不比单片机重视,很少有大企业的职位里写“从事过ARM开发优先”。写的多的是什么?“嵌入式LINUX”到这相信大家看出来了吧,需要的是硬件中的软件。
二 ARM是硬件还是软件
很难说,ARM是硬件,LINUX是软件。ARM的硬件多半已经模块化了,像我这样把板子改成这样的就算动的多的了,这同样是ARM公司的战略,再次佩服。
实际中的LINUX的开发工作更多,更耗时。从这方面说ARM应该算是软件了。
在找工作中更是这样,举个例子,联想里和ARM最接近的是“BIOS工程师”是软件,MOTO里接近的是嵌入式LINUX工程师是软件。而其他很多公司把嵌入式产品开发归为硬件。所以,不要讨论这个,好好玩转自己的板子才是关键。实在不爽你就把自己叫“嵌入式开发工程师”
三 要不要买开发板 买哪家
我的答案是“在你个人的学习方法”,但是如果看家是需要看这篇笔记的水平,个人推荐还是买现成的。
1.买
买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心自己硬件上的问题,我就是以便调试一边写驱动和程序,每次写驱动前就要先确认硬件没问题。另外,买板子更省钱和时间,我自己做的板子,原理图PCB花了2周以上!制版又15天,回来以后焊接44B0 160个脚!那叫一个麻烦~~花了多少钱呢?2层板,制版费就300块!当然我把接口都外引了,还做了个20X18的LCD背板,板子比较大。总体下来元件+LCD屏+PCB=11XX块!够2410的了。
再有就是买的资料相对来说比较全,但是不要指望有技术支持!都是骗人的,卖你之后就不会理你。
2.做
自己做可以更了解底层硬件,可以按照自己的要求加东西,比如我就加了GPS模块、 GPRS模块、SD卡模块,扩了个IIC的35个键子的键盘、把LCD接口按照买的LCD改装了,可以用FPC线直接连接。做的很爽的。玩一把吗。
当然,你可以有策略的做,比如像我一样,把RAM和ROM,网络都保持和某现成的板子一样,这样他们的资料你就可以拿过来直接用,给自己留个退路。其他的如SD了什么的自己做。都达到了~~就是费钱,费时间。
再有就是给做的朋友几点建议:尽量拿到现成的板子,尽量多搜集其他板子的全套资料,一定要拿到一张没问题的原理图。
网上流传的原理图多数是龚俊03年画的,再这里对龚俊表达一下我的敬意!!牛人!
但是那个图有个小BUG,我指的是03版的,后来的没这问题了。8019那地址线和地址有问题。还有人仿照他的PDF图画的SCH,更是漏洞百出!谴责!顺便谴责把龚俊板子偷卖的人。
3.买哪家
个人感觉分3类吧
1)首先是ZLG的,资料非常的全,感觉他是真正想教你怎么开发ARM,而不是像有的公司自己技术都没做好就做个板子出来卖钱。但是最大的不利就是价格太贵!而且主要是PHILIP的,货源比较麻烦~~可能有人说21XX系列的不贵啊,那是总线不外扩的,只能跑UCOS,不能跑UCLINUX。但是说是话,21XX系列才是ARM7的价格性能结合点。ARM7最适合做工业控制,ARM普及,销量都是怎么来的?都是ARM7来的,而44B0是典型的商业片子。但是,这里如果你看中的是为工作做准备,还是选能跑UCLINUX的吧。
但是仍然作为第一个推荐,因为菜鸟时期,合适的资料太重要了!!在这里被ZLG的务实精神感动!你看人家那代码写的。
2)感觉立宇泰的44B0不错
硬件没别的,就是资料比较全的说,不像有些家,原理图直接拿人家的,还错的~~
3)找个最便宜的
好象最便宜的有卖350的吧?也是没别的,就是即省了钱 还省时间搜集资料,至于资料全不全,别计较了~~硬件肯定好使就行吧。
四 要不要有51 AVR等单片机基础
有更好,但没有也无所谓。
两个月以前,我只是看别人做,耳濡目染~~,本科学过单片机,从来没做过。我们这的技术主干做AVR和51,我就跟他们调过C语言程序。你看出来了?我是个不折不扣的菜鸟吧?
但是做这个之前我特意找了ZLG的两本书,看了里面的例子和原理图,这很重要。例程里有汇编有C,都看懂了就OK,不用自己现写
五 开发都需要学习哪些软件
总结起来最主要的有以下几个吧
1 ADS调试用
确切的说是ADS+AXD。ADS里包含AXD。原来都用SDT后来ARM公司停止对SDT支持了,改支持ADS了,还是用ADS吧。
有的人的程序发布的仍然是SDT版本的,但基本都可以找到相应ADS的,新人在这里不要发蒙。ADS是编译器,AXD是调试器。便宜成AXF以后再在ARM的RAM里调试。
2 PLASHPGM
FLASH烧写的软件。AXD在RAM里调试,掉电就没有了,方便程序修改。调试好的程序再下到FLASH里,上电直接运行。
同类的软件还有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人还问FLASH不支持BIN格式文件的问题就要看我写的PLASHPGM使用了。
3 BANYANT调试代理(不知道名对不,起这么个难记的,我一般都叫它“半羊”因为知道它那几天刚吃了烤羊)
调试代理就是用它帮你使用更简单的JTAG(便宜啊)来实现原本1K才卖的JTAG仿真器的大部分功能。JTAG调试原理看我另一篇笔记。简单的就可以把他理解为你自己做的JTAG的驱动就行了。
调试代理还有很多种,什么H-JTAG了、ARM7了(不知道具体叫什么,就记得可执行文件叫ARM7.EXE)都是,BANYANT比较好。
需要注意的是,没种调试代理安装方法虽然都简单但都不一样,需要看说明。而且AXD调试之前都要运行。省钱了,就别怕麻烦了。
4 ARM-ELF-TOOLS工具链
里面是UCLINUX开发用的工具比如ARM-ELF-GCC只类的。工具链就是把很多工具打包在一起发布的方便你开发的东西。具体安装方法看我另一篇笔记。
另外如果你开发LINUX就要用ARM-LINUX-TOOLS,不一样,不通用。
5 U-BOOT
大名鼎鼎的BOOTLOADER生成工具,同类的好象还有VIVI(名字很暧昧~~)
生成的BOOTLOADER烧到FLASH里,然后就可以用BOOTLOADER下载 烧写其他了
有了BOOTLOADER才能下UCLINUX。BOOTLOADER就像电脑上的BIOS。当然UCOS的不用这个,用什么我不知道:)
最新版本是1.1.4 具体使用方法看我另一篇笔记吧。
6 UCLINUX包
UCLINUX的源码包,不用多说了吧?建议大家用现成的先体会一下,然后再自己编译,裁剪。因为单独UCLINUX的编辑技术上比较简单,但涉及的方面还是比较广的。
7 VMWARE
老牌的虚拟机软件,在一个机器上虚拟出一个机器装LINUX(PC上用的),省得你来回开关机了。记得装VMWARE-TOOLS,安装方法在我另一篇笔记里。
六 有哪些书推荐
主要推荐ZLG的三本书,有这3本再加网络就不用别的书了,其中主要推荐前2本,3是介绍体系结构的,也不错
1 ARM嵌入式LINUX系统构建与驱动开发,北航版
驱动写的很详细,前期开发介绍也很好
2 ARM 嵌入式系统实验教程(二),北航版
有ZLG2200的原理图,实验程序和注释,了解人家是怎么开发的。
3 ARM嵌入式系统基础教程
最重要的是体系结构,汇编部分介绍,看看吧,增加理论素质。
4 44B0数据手册
写在这里是强调它的重要。
不推荐ZLG早期出的红色皮的ARM什么体系结构~只类的
写的太多,看烦了。
其他的书没了几本,没看见好的,大家有看过的推荐吧。
七 选UCOS?UCLINUX?LINUX?VXWORKS?还是当单片机用
1 搞开发,工程设计,用UCOS,小巧,多进程,简单,体现了ARM7的精髓。
2 LINUX 正根的嵌入式系统,LINUX消费与通信领域用的比较多,但缺点是必须ARM9才能跑,ARM9的板子自己做就不行了,6层板太贵。买开发板1K达底吧。但是还是推荐选ARM9+LINUX
3 UCLINUX 算投机嵌入式系统:)ARM7上可以跑,由有LINUX近亲,学好好可以比较方便的转向LINUX,像我一样的穷鬼用吧,呵呵
4 VXWORKS
学好后可以找到高薪工作,但工作机会本身并不比LINUX好找。
5 当单片机用
不推荐,虽然我景仰的ZLG一直号召这么干。因为对于学习来说多进程的系统设计才是ARM7的玩头,至少你也要整个UCOS啊:)
有朋友问我先学这个当基础不行吗?那当然可以~~但我当时就用了1周搞定,就是我先的ADS在RAM中调试的笔记。后来我清空FLASH用的小段程序还是当时写的LED闪烁程序呢。另外1周里其中还因为自己过于菜,没把OM设置好导致晶阵不阵
哈哈。这个是必须做的,但一带而过。目标放的远一点。
八 学习要用多长时间
我从菜鸟到现在两个多月,中间被打扰数次。仍然搞定了PCB设计与制版,RAM调试,FLASH下载,UBOOT移植和下载UCLINUX(没剪裁,用现成的),LCD驱动。
再次坦诚的说:我确实比较菜,说这些不是让大家羡慕,只是告诉你们“你们应该比这个更好”
我相信良好的态度+合适的方法+及时的总结=成绩
九 ARM都玩什么
就几点
1 硬件设计
2 系统移植
3 驱动开发
4 应用开发
没了。其中推荐把注意力放在后两个上,3有难度,4比较灵活,最重要的是都是找工作的砝码。
(编者注:本篇不知出处,不过至少是06年以前的帖子,现在2440也已经很便宜了,主要是比ARM7多MMU,可以跑Linux、wince等操作系统,更适合学习使用。作者说“感觉他是真正想教你怎么开发ARM”说的很好,现在飞凌嵌入式正式本着这一原则不断的制作学习教程、开发实验例程、完善技术支持!可以说除了那几本纸质书籍,飞凌的OK2440开发板已经不比周立功的差)
近些年来,嵌入式系统的发展在国内可谓如火如荼,很多公司都急需嵌入式系统方面的开发人员。然而,在高校中,嵌入式系统的教学却较为滞后,很多高年级的本科生和刚入学的研究生都苦于不知从何学起。在本文中,笔者将根据自己的嵌入式系统开发和教学经验,简要介绍嵌入式系统的学习方法,力求能帮助初学者找到一条入门之路。
什么是嵌入式系统?
学习嵌入式系统,首先应该明确什么是嵌入式系统,否则费力去学,却不知所学为何物,岂不惘然?嵌入式系统的定义很多,这也是困扰嵌入式系统学习的一个因素。笔者根据自己开发和教学过程中的理解,以及对各种嵌入式系统的应用进行总结,提出了嵌入式系统的简单定义:嵌入式系统是嵌入式计算机系统的简称,这个定义突出嵌入式计算机系统和普通计算机系统的共性。下表列出了嵌入式系统的一些典型的
应用:
智能机器人(S D R 4,火星登陆车)
娱乐和消费电子(Gameboy Advance,Sony PSP)
网络通信产品(Smartphone)
军用设备(军用PDA )
汽车(车载导航,自动驾驶,娱乐系统)
智能仪器(虚拟仪器)
安全防护(防火,防盗)
环境保护(探空气球)
银行和商业消费(ATM)
以火星登陆车为例来分析一下嵌入式系统的定义。火星登陆车虽然听起来感觉在技术上有些高不可测,但是本质就是嵌入式计算机系统的应用,其核心就是一个计算机系统,而这个计算机系统的组成同传统的计算机系统在本质上没有什么差别。两者的显著不同之处就在于,用于火星登陆车的计算机系统被安装到了火星登陆车上。当然,一个计算机系统能够被安装在火星登陆车上,是需要进行很多特殊设计的。但是从本质上讲,嵌入式系统的核心概念还在计算机系统。嵌入式系统学习的重点也在计算机系统上。一方面,学习者需要牢固掌握计
算机系统本身的概念,更重要的是学习嵌入系统的开发过程同传统计算机系统开发过程的差别。这里需要指出的是,很多学习者本来就没有从事过完整计算机系统的开发,高校的教学是以程序设计为中心的,计算机系统的构成,操作系统的原理,编程语言等课程都是为了能够让学生更好的使用计算机系统进行程序设计,在现有的计算平台上来设计实现各种应用,学生一般没有机会学习一个完整的计算机系统是如何构建,并亲身参与到构建的每一个过程。而对于嵌入式系统而言,从事平台开发的人就是要亲自去开发出一个完整的计算机系统,这个过程包括
l 需求分析
2 硬件设计
3 驱动程序
4 Bootloader & BSP (板级支持包)
5 操作系统的移植
6 应用程序的开发
7 性能检查
嵌入式系统教学的目的就是教会学生如何根据需求去建立满足某种特殊行业需求的嵌入式计算机系统。让学生学会如何构件硬件平台,进行硬件设计,选择能够满足应用要求的最佳的嵌入式操作系统,并完成Bootloader,BSP 和驱动程序的编写,移植,调试等过程。为了满足行业需求,最终要在所建立的系统上编写调试相应的应用程序,并进行性能的测试和检查。
你是谁,你需要学习哪些东西?
如果你的工作只是需要在PC 机上编写一个图片浏览程序,那么你就没有必要去了解当系统收到一个ARP 请求包后应该如何回应。同样的道理,嵌入式系统的学习也是有很多方面的。就嵌入式系统的设计和实现而言,基本上需要四种不同的工作:系统设计工作,硬件设计工作,驱动程序和操作系统移植工作和应用程序设计开发工作。
系统设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种操作系统,使用那些软件开发工具。系统分析师往往是较为完整的参与过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统
本身的开发流程十分清楚的人。
硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。通常需要硬件设计人员熟悉嵌入式系统的硬件构成。硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/ 视频编解码芯片,电源管理芯片,总线接口电路 (USB, PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth, WLAN,GPRS)等硬件电路构成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。在网络上能找到很多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
以上这些知识,往往需要较长时间的学习和积累,需要亲自参与实践的机会。对于刚刚接触嵌入式系统硬件开发的学生来讲,一般不可能全部了解这些知识,但也不会是通通一无所知。笔者结合自己开发和教学的经验认为:首先应该选定一款主流且较为简单的嵌入式系
统处理器,比如基于ARM7TDMI 内核的AT91M40800,S3C44B0 等嵌入式系统处理器,学习32 位RISC 处理器的编程模型,指令集。高校教学中,单片计算机课程一般以8051系列单片为核心讲解,由于现代32位处理器的结构和开发方式同8 位单片机有着较大的差别,学习者还是需要花一点力气来研究以下32 位处理器的。以ARM处理器为例,学习者就需要理解处理器的多种工作模式,备份寄存器,RISC 指令集的特点,MMU 和虚拟地址,中断处理过程等内容。在学习指令集的过程中,最好能够每学习几条指令,就使用这几条指令在模拟器上实验以下,观察处理器执行的结果。这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果,另外也是对开发工具本身的一种学习。接着,就可以开始学习片上资源的使用和配置方法。这时就需要一个方便使用的开发板,学习者能够通过JTAG 仿真器将开发板同调试PC 机相连,进行程序的下载,调试。特别是要仔细研究系统的初始化过程和中断处理的过程。在开发过程中如果遇到问题,应自己分析问题产生的原因,通过分析缩小问题可能产生的范围,最终找到问题的所在。最重要的就是要保持一种解决问题的信心,面对困难如何处理,往往能够决定最终系统是否能够调试成功。然后,学习者可以开始仔细学习处理器同存储器的连接,存储空间的配置,各种外扩器件,如网卡,AC97声卡的工作原理和使用方法。嵌入式系统硬件设计中往往需要使用可编程器件,学习者还需要一定的时间来学习使用常用的可编程器件(C P L D / F P G A ),常用的有Xilinx和Altera公司的产品。进行系统硬件原理图设计,就需要使用原理图设计的E D A 工具,常用的E D A 原理图设计工具主要包括Cadence公司的Capture,Protel公司的Protel99 SE等。接下来就可以参照评估板的电路图,根据系统的设计要求,开始进行原理图的绘制了。在原理图绘制过程中,一定要搞清评估板电路连接的原因,对于一时没有搞清楚的问题切不可蒙混过关。例如,有些处理器的地址线是以字节位单位的,而另一些处理器的地址线则是以两个字节为单位的,当连接16 位的存储器的时候,切不可想当然的把处理器的A 0 直接连接到存储器的A 0 上面。另外,学生还应具有一定的P C B 板图绘制能力,因为在现阶段,很多公司还不能完全把原理图的设计工作和PCB 的绘制工作分开,往往要求硬件设计人员既能进
行原理图设计又能进行板图设计。即使是PCB设计和原理图设计分开的公司,也需要原理图设计者能为PCB 的设计者对于不同的信号提出布板要求。
驱动程序和操作系统移植工作
现代嵌入式系统的开发同传统8 位单片机系统的开发相比,一个显著的区别就是嵌入式操作系统的广泛使用。在拿到焊接完毕的电路板,并进行基本的测试后,就要进行驱动程序和操作系统的移植工作了。首先要进行的Bootloader的编写和移植工作。Bootloaer相当于PC系统的BIOS。对于有些嵌入式操作系统,如uc/OSII 没有bootloader同样可以开发调试。但是对于Windows CE和嵌入式linux系统而言Bootloader就是必须的了。本文以
Windows CE 为例,做一个简要的说明。
Windows CE 系统的移植工作主要就是BSP(板级支持包)的开发过程。B S P 将具体的硬件差异同操作系统的核心隔离开来,主要由Bootloaer ,OAL (OEMAbstraction
Layer)和设备驱动程序三部分组成。WindowsCE系统中Bootloader叫做Eboot。Eboot被写入系统的引导Flash。系统启动时运行Eboot,完成通过网卡将调试PC 机中Windows CE 操作系统映像下载到目标系统的S D R A M 中并开始执行的功能。对于一个系统移植人员,首先需要阅读文档,了解Windows CE系统Bootloader和BSP的基本概念和开发过
程。Windows CE的开发系统Platform Builder提供了详细的文档和例程,开发人员需要仔细的阅读文档和例程。搞清楚各个函数之间的调用关系。在开发过程中的一个重要的步骤就是打通串口,使得目标板能够通过PC 机串口向调试PC 机发送数据。由于A R M 系统的仿真器比较昂贵,而且操作系统的调试往往不使用JTAG 调试器进行单步调试。所以能从串口观察程序的执行过程和结果对于调试就显得十分重要了。串口打通之后一个比较棘手的问题就是网卡芯片的调试。刚刚接触嵌入式系统开发的人往往没有直接在寄存器级上使用网卡芯片的经验,而网卡芯片的说明一般都较为简短,这就要求开发者学习一些以太网的基础知识,对以太网的MAC 层有一个基本的认识。另外,各种网络调试(抓包)工具的使用也能大大降低系统调试的难度。系统的O A L 需要根据具体硬件的不同做出相应的修改,这个部分可次参照文档进行,在调试过程中根据串口的信息分析出错的地方。要充分发挥跨文件字符串搜索工具的功能,在浩如烟海的源文件中找到出错的位置。当然,随着开发者对系统文件目录结构的熟悉和了解,错误定位的速度会不断加快。Windows CE 的驱动程序相对而言是比较好写的。程序结构较为简单,学习者可参照 http://msdn.microsoft.com/library/default.asp MSDN Home > MSDN Library >Mobile and Embedded Development > Embedded Operating
System Development > Columns SPOT the Geek and WindowsCE Drivers 这篇文章。
应用程序的开发
嵌入式系统的应用程序开发同在PC 机上开发应用程序的区别不是很大。对于W i n d o w s C E 系统而言,Microsoft已经提供了较为完善的开发工具。特别是.NET Compact Framework 的使用,使得基于Windows CE.NET Compact Framework的应用程序有了跨平台性。开发人员可以使用Windows 的C# 语言直接在PC 上进行CE .NET应用程序的开发和模拟调试,也可将目标系统同PC 机相连,进行联机调试。现在有很多系统支持J2ME(JAVA 的嵌入式系统版本) ,这使得JAVA 在嵌入式系统应用开发中占有较大的
优势。另外,作为专业的嵌入式系统软件开发人员,还需要充分了解面向对象技术和设计模式等方面的知识,当然作为初学者可以先不深入研究这方面的内容。
常用嵌入式系统处理器和操作系统
处理器
常用嵌入式系统处理器主要包括A R M 处理器,Power PC 处理器,基于MIPS 内核的嵌入式处理器,软核处理器(如Alter 的Nios和Xilinx的MicroBlaze等)和D S P(数字信号处理器)等。
A R M 处理器的主要特点是具有较高的性能功耗比。A R M 处理器被广泛的应用在手机,P D A 等领域,其中较为著名的有Intel 公司生产的基于ARM 内核的XScale系列处理器。由于所有公司生产的基于ARM 内核的处理器具有相同的编程模型,在手持和电池供电的系统中,基于A R M 的嵌入式系统处理器往往被首先选用。PowerPC (简称PPC)处理器具有较强的运算性能和数据吞吐能力,在网络和数据通信领域基于PPC 的嵌入式系统处理器有着广泛的应用。其中Motorola公司生产的MPC860/MPC8260 被大量地应用在嵌入式网络产品中。MIPS 处理器的特点表现在十分强大的处理能力上。作为高性能处理器,MIPS 处理器适用于网络、企业及高级消费类电子应用,特别是在机顶盒系统中,MIPS 处理器具有较高的市场占有率。随着可编程器件的规模不断扩大,使得人们能够根据需要定制处理器,并方便的将针对某种特殊应用定制的处理器方便的在可编程器件内部实现。除了处理器外,计算机系统还需要许多其他构成部分,比如在多通道媒体数据处理系统中,经常需要使用可编程器件来实现高速的数据处理功能,使用软核DSP 来实现复杂的数字信号处理算法,同时还需要处理器进行事务处理,软核处理器将可编程器件,D S P 同处理器结合在一起,为系统级设计提供了极大的灵活性。D S P (数字信号处理器)有别于通用处理器,集中表现在其强大的数字信号处理能力上。在DSP 内部提供了硬件乘累加器,处理器在设计上对于特殊的寻址方式做了优化,一些DSP 还支持零耗循环(Zero OverheadLoop)。为了方便嵌入式系统设计,主流DSP 一般也都提供了丰富的外设。特别值得一提的是A D I 公司的Blackfin 系列DSP 和TI 公司的DM64X 系列DSP,两种处理器都提供了丰富的片上外设,非常适用嵌入式系统应用。
操作系统
Window CE.NET/5.0
作为Microsoft的产品,Window CE.NE/5.0提供了功能完备的平台开发工具Platform Builder和应用开发工具Embedded Visual C++/Visual Studio 2003。Windows CE由于拥有广大使用者所熟悉的windows 界面,系统提供了众多驱动程序,并且有完备的文档支持。对于应用开发而言,熟悉Windows 系统开发的程序员很容易转到WindowsCE 应用程序的开发。Windows CE将会是一个非常有前途的嵌入式操作系统。
VxWorks
VxWorks 是由Windriver(风河)公司出品的嵌入式实时操作系统,大名鼎鼎的火星登陆车就是使用了VxWorks。Windriver 为VxWorks 提供了集成开发环境tornado。
υC/OSII
υC/OS是由Jean Labrosse设计编写的开放源代码的嵌入式实时操作系统,笔者最早接触的嵌入式操作系统就是它。阅读并深入理解υ C/OS 的源代码对于理解实时系统是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他开发者开发移植的用于ARM 处理器的linux操作系统。 ARM Linux系统在GNU GPL下发布。有兴趣的读者可以参看
http://www.arm.linux.org.uk/docs/whatis.shtml的介绍。
υ CLinux
υ Clinux 是适用于没有MMU 的嵌入式处理的LinuxOS 版本。υ Clinux 同样在GNU GPL 下发布,有兴趣的读者可以参看
http://www.uclinux.org/index.html
嵌入式系统开发过程中的常见问题和解决方法
Bootloader如何写入Flash ?
初学者一般都会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。例如Intel的Xscale处理器可以使用Intel公司提供的JFlash工具烧写。对于具有JTAG 调试工具软件的处理器,可以使用如下思路:编写一段程序,这段程序能将位于SDRAM/SRAM 固定地址中的数据写入Flash 中。烧写时,首先,将这段软件下载到SDRAM 中,然后通过调试软件将要写入Flash的数据下载到S D R A M / S R A M 的某个固定地址开始的缓冲区,然后通过调试器开始执行程序,将数据写入Flash。除此以外,网络上还提供了很多专用的写Flash的工具,开发者可以根据自己的需要选用。
什么是arm-elf-gcc?
arm-elf-gcc是一个交叉C语言编译器。我们在PC平台下编译程序,编译器运行的处理器同生成的代码将要运行的处理器相同。但是,在PC 机上编译ARM 程序时,编译器运行的处理器同生成的代码运行的处理器不同,这种编译器叫做交叉编译器。其中的elf是指编译器生成的目标文件格式。
走了哪条编译路径?
系统程序和驱动程序往往包含很多的编译选项,很多选项都是在编译时通过命令行定义的,如果想知道编译的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
这样在编译的时候就知道,编译的是哪一条路经了。对于支持#pragma message( “I am here”)的编译器也可使用#pragma message预编译指令。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串,在windows平台下可以使用平台提供的多文件字符串搜索工具。在linux平台下,可以使用grep来搜索字符串。Grep 的搜索功能十分强大,支持正则表达式搜索,熟练使用grep对于阅读系统和驱动程序代码是很有
帮助的。
系统是从那个文件开始运行的?
对于W i n d o w s C E 系统,一般从
W I N C E 4 2 0 PLATFORMYourPlatformKERNELHAL 目录的某个汇编文件中。对于Linux 系统版本不同会存在一定差异,以arm处理器为例,一般会在linux2.4.xarcharmkernel的head-armv.S中。
程序执行到了那里?
可以在程序中插入如下代码来实现
printf( “I am here %s, %dn”,__FILE__, __LINE__);
代码将打出printf语句所在的文件名和行号。
推荐书目
Jean J.Labrosse MicroC/OS-II The Real-Time Kernel,Second Edition
这本书是笔者接触嵌入式实时系统的入门书,在国内能够买到中文版。这本书较为清楚地讲述了实时系统的概念,各个组成部分的工作原理,特别是公开了实时系统内核的源代码,仔细研究定会受益匪浅。有个小的提示,对于初学者,这本书可以先不看第一章,直接从
第二章看起。
Abraham Silberschatz, Peter Baer Galvin,Greg Gagne Operating System Concepts
笔者在教学过程中发现,无论是计算机还是电子工程专业都有很多学生对于操作系统的基本概念都没有搞清,很少有学生有完整的系统编程经验。Operating SystemConcepts这本书对操作系统的感念讲述只能用经典来形容。对于嵌入式系统有兴趣深入研究的同学,首先
要把基础打好,这本书就成了必读之物了。
Andrew S. Tanenbaum Computer Networks
提起Andrew S. Tanenbaum 学习计算机的同学一定都知道OPERATINGSYSTEMs:Design and Implementation这本书,笔者对于Tanenbaum 这样的教授由衷佩服。网络协议栈是嵌入式系统中的支柱性组成部分。愿意致力于网络深层技术研究的同学,这本书将你们建立一个坚实的网络基础。
Karim Yaghmour Building Embedded Linux Systems
本书详尽的介绍了嵌入式linux系统的组成,基本概念和如何去建立各个部分。全书篇幅较小,可谓短小精悍。即可以作为嵌入式linux 系统的入门读物,又是开发过程各个部分的指南。
Advanced RISC Machines Ltd (ARM) ARM7 TDMI
Data Sheet
Advanced RISC Machines Ltd (ARM) ARM920T
Technical Reference Manual
学习嵌入式系统不了解当前应用最广泛的嵌入式处理器怎么行? ARM7 TDMI 的 data sheet是学习ARM编程模型,指令集的好东西。在嵌入式系统中,M M U (内存管理单元)是很重要的部分,又是较难理解和掌握的部分。ARM920T Technical Reference Manual 正好可以帮你讲解这方面的内容。
Perter Van Der LinDen Expert C Programming
嵌入式系统级编程最常用的语言还是C 。很多同学都自认为自己的C 语言学的很好,那好,就看看这本书吧,找找自己和Experts差距。
注:这篇文章是我在2004年第12期的学习园地看到的。文章的作者是袁通
作者简介
袁通,北京工业大学实验学院嵌入式系统课程教师,曾于2 0 0 4 年以访问学生身份工作于微软亚洲研究院。
看完这篇文章后,我就迫不及待得贴出来,因为确实是写的好啊。我搞嵌入式一年多了,从8051到ARM,学习过,彷徨过,高兴过,郁闷过。。。近来甚至有放弃的想法,终归到底是对嵌入式开发认识不全面造成的,一开始就一头钻到技术里,学习各种技术,最终迷失在自己一手造成的泥坑里。这篇文章非常清晰的讲述了嵌入式开发的方方面面,对我这样迷惑的人起到了醍醐灌顶的作用。
嵌入式开发与桌面开发既有不同,又有非常大的联系,而且十分注重实际操作能力。搞桌面开发的人在一开始接触嵌入式的时候,通常转换不过来,这主要体现在定位上。如文中所说,你是谁,你要做什么?我对硬件的了解仅限于编程领域,PCB设计一窍不通,但并不能说你不懂硬件就不能从事嵌入式开发。一个系统的开发设计方方面面,在自己感兴趣和熟悉的领域做出自己的贡献才是最主要的。
1。硬件设计: 需要有硬件设计的经验,对各种嵌入式器件有很好的了解。
2。系统移植:需要汇编经验,操作系统原理以及底层驱动的了解
3。应用程序:需要桌面编程经验