Blaze考研试题
近年来,国内嵌入式系统的发展如火如荼,很多公司都急需嵌入式系统开发人员。然而在高校中,嵌入式系统的教学相对滞后,很多高年级本科生和刚入学的研究生都在纠结不知从何下手。在本文中,笔者将根据自己从事嵌入式系统开发和教学的经验,简单介绍一下嵌入式系统的学习方法,以帮助初学者找到入门之道。
什么是嵌入式系统?
学习嵌入式系统,首先要搞清楚什么是嵌入式系统,否则,努力学习却不知道什么是嵌入式系统,是一种惆怅。嵌入式系统的定义很多,这也是困扰嵌入式系统学习的一个因素。笔者根据自己在开发和教学过程中的了解,总结了各种嵌入式系统的应用,提出了一个简单的嵌入式系统定义:嵌入式系统是嵌入式计算机系统的简称,突出了嵌入式计算机系统和普通计算机系统的* * *性质。下表列出了一些典型的嵌入式系统。
应用:
智能机器人(S D R 4,火星着陆器)
Gameboy Advance(索尼PSP)
网络通讯产品(智能手机)
军事装备(PDA军方)
汽车(汽车导航、自动驾驶、娱乐系统)
智能仪器(虚拟仪器)
安全保护(防火、防盗)
环境保护(探测气球)
银行和商业消费(ATM)
以火星着陆器为例,分析嵌入式系统的定义。虽然火星着陆器在技术上听起来有点不可预测,但其本质是嵌入式计算机系统的应用,其核心是一个计算机系统,而这个计算机系统的组成本质上与传统的计算机系统是一样的。两者的显著区别在于,火星着陆器使用的计算机系统安装在火星着陆器上。当然,火星着陆器上可以安装计算机系统,这需要大量的特殊设计。但本质上,嵌入式系统的核心概念仍然是计算机系统。嵌入式系统学习的重点也在计算机系统上。一方面,学习者需要牢牢掌握计划。
计算机系统本身的概念更重要的是学习嵌入式系统和传统计算机系统开发过程的区别。这里需要指出的是,很多学习者从未从事过完整的计算机系统的开发。高校的教学以编程为中心。计算机系统的组成、操作系统原理、编程语言等课程都是为了让学生能够更好地使用计算机系统进行编程,在现有的计算平台上设计和实现各种应用。学生一般没有机会学习如何构建一个完整的计算机系统,也没有机会参与构建的每一个过程。对于嵌入式系统,从事平台开发的人就是亲自开发一个完整的计算机系统。这一过程包括
需求分析
2硬件设计
3名司机
4引导加载程序& amp板支持包
5.操作系统的移植
6应用程序的开发
7性能检查
嵌入式系统教学的目的是教学生如何构建嵌入式计算机系统,以满足特殊行业的需求。让学生学习如何构建硬件平台,设计硬件,选择能够满足应用需求的最佳嵌入式操作系统,完成Bootloader、BSP、驱动程序的编写、移植和调试过程。为了满足行业的需要,要在已建立的系统上编写相应的应用程序并进行调试,还要对性能进行测试和检查。
你是谁,需要学习什么?
如果你的工作只是在PC上写一个图片浏览程序,那么你就不需要知道当系统收到一个ARP请求包时该如何响应。同理,学习嵌入式系统也有很多方面。就嵌入式系统的设计和实现而言,基本上有四个不同的任务:系统设计、硬件设计、驱动和操作系统移植以及应用程序设计和开发。
系统设计工作
在系统的设计阶段,系统分析师会根据需求确定系统硬件的基本组成,并根据系统的需求选择使用哪种处理器、操作系统和软件开发工具。系统分析师往往完全参与嵌入式系统设计的全过程,对系统应用的行业有更好的了解。
有清晰开发流程的人。
硬件设计工作
系统硬件设计师需要根据系统分析师的设计结果来设计硬件原理图。硬件设计人员通常需要熟悉嵌入式系统的硬件结构。硬件设计人员需要了解嵌入式系统处理器、存储器(Flash、SDRAM)、以太网MAC芯片、音频/视频编解码芯片、电源管理芯片、总线接口电路(USB、PCI)、液晶显示模块、可编程逻辑器件(FPGA/CPLD)、无线网络通信模块(蓝牙、WLAN、GPRS)等常用硬件电路元件的基本工作原理、连接和使用方法。网络上可以找到许多公司的评估板原理图。我们要仔细研究这些原理图,找出处理器与内存、网卡、LCD模块等设备的连接方式和原因。通过对这些电路的学习,我们可以很快了解整个嵌入式系统的组成。虽然这些电路与实际产品中的电路有所不同,尤其是对于手持设备而言,但这些不同并不影响初学者学习嵌入式系统硬件设计的基本组成。
以上知识往往需要很长时间的学习和积累,需要亲自参与实践的机会。对于刚接触嵌入式系统硬件开发的同学来说,一般不可能知道所有这些知识,但也不会一无所知。结合自己的开发和教学经验,笔者认为:首先要选择主流的、相对简单的嵌入式系统。
统一处理器,比如基于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位存储器时,一定不能想当然地将处理器的0直接连接到存储器的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)组成
层)和设备驱动程序。WindowsCE系统中的Bootloader称为Eboot。Eboot被写入系统的引导闪存。系统启动时运行Eboot,通过网卡完成从调试PC下载Windows CE操作系统镜像到目标系统的S D R A M并开始执行的功能。对于一个系统移植工作者来说,首先你需要阅读文档,了解Windows CE系统中Bootloader和BSP的基本概念和开发。
程。(哦,这个工作我还是要做的。没想到(初学者_))Windows CE的开发系统Platform Builder提供了详细的文档和例程,开发者需要仔细阅读。明确函数之间的调用关系。开发过程中的一个重要步骤就是打通串口,让目标板通过PC机的串口向调试PC机发送数据。因为一个R M系统的仿真器价格昂贵,而且操作系统的调试往往不会使用JTAG调试器进行单步调试。所以从串口观察程序的执行过程和结果对于调试是非常重要的。串口开通后,一个难题就是网卡芯片的调试。刚接触嵌入式系统开发的人,往往没有直接在寄存器级使用网卡芯片的经验,对网卡芯片的描述也普遍比较简短,需要开发人员学习一些以太网的基础知识,对以太网的MAC层有基本的了解。此外,各种网络调试工具的使用也可以大大降低系统调试的难度。系统的O A L需要根据不同的具体硬件进行修改。这部分可以参照文档进行,调试时根据串口的信息分析错误。要充分发挥跨文件字符串搜索工具的功能,在浩如烟海的源文件中找到错误的位置。当然,随着开发者对系统文件目录结构的熟悉和了解,错误定位的速度会不断加快。Windows CE的驱动相对来说比较好写。程序结构比较简单,学习者可以参考/library/default . aspmsdn home >;MSDN图书馆& gt移动和嵌入式开发& gt嵌入式操作
系统开发& gt文章专栏指出了geek和windows ce驱动程序。
应用程序开发
嵌入式系统的应用开发和PC上的应用开发没有太大区别。对于W i n d o w s C E系统,微软提供了相对完整的开发工具。尤其是使用。NET Compact Framework使得基于Windows CE.NET Compact Framework的应用程序具有跨平台性。开发者可以使用Windows的C#语言直接开发和模拟CE的调试。NET应用程序,或者将目标系统连接到PC上进行在线调试。现在很多系统都支持J2ME(嵌入式系统版Java),这使得JAVA在嵌入式系统应用开发中占据了很大的份额。
优势。此外,作为一名专业的嵌入式系统软件开发人员,你需要充分了解面向对象技术和设计模式的知识。当然,作为初学者,你可以不深入研究这方面。
常用的嵌入式系统处理器和操作系统
处理器
常用的嵌入式系统处理器主要有A R M处理器、Power PC处理器、基于MIPS内核的嵌入式处理器、软核处理器(如Alter的Nios和Xilinx的MicroBlaze)和D S P(数字信号处理器)。
R M处理器的主要特点是高性能功耗比。A R M处理器广泛应用于手机、P D A等领域,其中著名的是Intel公司生产的基于ARM核的XScale系列处理器。因为所有公司生产的基于R M内核的处理器都具有相同的编程模型,所以在手持和电池供电的系统中,通常首先选择基于A R M的嵌入式系统处理器。PowerPC(简称PPC)处理器具有强大的计算性能和数据吞吐量,在网络和数据通信领域广泛应用于基于PPC的嵌入式系统处理器。其中,摩托罗拉生产的MPC860/MPC8260广泛应用于嵌入式网络产品中。MIPS处理器的特点是处理能力非常强大。作为一款高性能处理器,MIPS处理器适用于网络、企业和高级消费电子应用,特别是在机顶盒系统中,MIPS处理器具有很高的市场份额。随着可编程器件规模的不断扩大,人们可以根据自己的需要定制处理器,并在可编程器件中方便地实现为特定应用定制的处理器。除了处理器,计算机系统还需要许多其他组件。例如,在多通道媒体数据处理系统中,通常使用可编程器件来实现高速数据处理功能,使用软核D S P来实现复杂的数字信号处理算法。同时,处理器也需要处理事务。软核处理器将可编程器件和DSP与处理器相结合,为系统级设计提供了极大的灵活性。D S P(数字信号处理器)不同于通用处理器,集中体现在其强大的数字信号处理能力。DSP中提供了硬件乘法累加器,设计中针对特殊寻址方式对处理器进行了优化。一些DSP还支持零开销环路。为了方便嵌入式系统的设计,主流DSP一般都提供了丰富的外设。特别值得一提的是A D I公司的Blackfin系列DSP和TI公司的DM64X系列DSP,它们都提供了丰富的片内外设,非常适合嵌入式系统应用。
操作系统
窗口CE.NET/5.0
作为微软的产品,视窗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's简介。
υ CLinux
υ Clinux是LinuxOS版本,适合不带MMU的嵌入式处理。υ Clinux也是在GNU GPL下发布的,有兴趣的读者可以参考一下。
http://www.uclinux.org/index.html
嵌入式系统开发中的常见问题及解决方案
Bootloader怎么写Flash?
初学者普遍会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。比如Intel的Xscale处理器,可以用Intel提供的JFlash工具进行烧录。对于装有JTAG调试工具软件的处理器,可以采用以下思路:编写一个程序,可以将位于SDRAM/SRAM固定地址的数据写入Flash。写的时候先把这个软件下载到SDRAM,然后通过调试软件把要写入Flash的数据从SD RAM/SD RAM的一个固定地址开始下载到缓冲区,然后通过调试器开始执行程序把数据写入Flash。另外,网上还有很多专门写Flash的工具,开发者可以根据自己的需求来选择。(现在我明白为什么我学的BF533先去了flashProgramer.dxe了。)
arm-elf-gcc是什么?
Arm -elf-gcc是一个跨c语言的编译器。我们在PC平台上编译程序,编译器和生成的代码运行在同一个处理器上。然而,当在PC上编译ARM程序时,编译器运行在与生成的代码不同的处理器上。这种编译器被称为交叉编译器。其中elf是指编译器生成的目标文件格式。(其实我们平时用的单片机编译器,比如GCC—AVR,已经是交叉编译器了,我也是到现在才搞清楚什么是交叉编译器。)
你走的是哪条编译路径?
系统程序和驱动程序通常包含许多编译选项,其中许多选项是在编译期间通过命令行定义的。如果你想知道哪个程序被编译了,你可以用下面的方法:
#ifdef PLAT_AAA
AAA平台的错误代码
#否则
#错误代码不适用于AAA平台
#endif
这样在编译的时候,你就知道该编译哪个路径了。支持#pragma message(“我在这里”)的编译器也可以使用# pragmamessage预编译指令。
我怎么知道代码在那个文件里?
系统编程中经常需要在多个文件中搜索字符串,平台提供的多文件字符串搜索工具可以在windows平台下使用。在linux平台下,可以使用grep搜索字符串。Grep的搜索功能非常强大,支持正则表达式搜索。熟练使用grep对于阅读系统和驱动代码非常有好处。
有益的
系统从哪个文件开始运行?
对于W i n d o w s C E系统,一般从
在W I N C E 420 \ platform \ your platform \ kernel \ Hal目录下的一个汇编文件中。不同版本的Linux系统之间会有一些差异。以arm处理器为例,一般会在head-armv。linux2.4.x\arch\arm\kernel的s。
节目去哪了?
您可以在程序中插入以下代码来实现这一点。
printf("我在这里%s,%d\n ",__FILE__,_ _ LINE _ _);
该代码将打印printf语句所在的文件名和行号。
推荐书目
实时内核,第二版
本书是作者接触嵌入式实时系统的入门书,中文版可以在国内买到。这本书清晰的描述了实时系统的概念,各个组件的工作原理,尤其是实时系统内核的源代码,仔细学习会受益匪浅。有个小提示,对于初学者来说,这本书可以不看直接从第一章开始读。
第二章,看。
Abraham Silberschatz,Peter Baer Galvin,Greg Gagne操作系统概念
笔者在教学过程中发现,无论是计算机还是电子工程专业的学生,很多都不了解操作系统的基本概念,很少有学生有完整的系统编程经验。《操作系统概念》这本书只能被称为经典。对于有兴趣深入研究嵌入式系统的同学,首先,
打好基础,这本书就会成为必读。
安德鲁·塔南鲍姆计算机网络公司
说到Andrew S. Tanenbaum,学计算机的同学一定知道《操作系统:设计与实现》这本书。作者由衷地钦佩像塔嫩鲍姆这样的教授。网络协议栈是嵌入式系统的支柱部分。愿意投身于深度网络技术研究的同学们,这本书将为你构建坚实的网络基础。
Karim Yaghmour构建嵌入式Linux系统
本书详细介绍了嵌入式linux系统的组成、基本概念以及如何建立各个部分。这本书短小精悍。它可以作为嵌入式linux系统的入门读物和开发过程中所有部分的指南。
先进RISC机器有限公司(ARM) ARM7 TDMI
记录表
先进RISC机器有限公司(ARM) ARM920T
技术参考手册
在不了解目前应用最广泛的嵌入式处理器的情况下,如何学习嵌入式系统?ARM7 TDMI的数据手册是学习ARM编程模型和指令集的好东西。在嵌入式系统中,内存管理单元(M M U)是一个非常重要的部分,也是一个很难理解和掌握的部分。arm 920t技术参考手册正好可以帮你解释这方面的内容。
彼得范德林登专家C编程
嵌入式系统级编程最常用的语言是C,很多同学认为自己擅长C语言。嗯,就看看这本书,找出自己和专家的差距。
注:我是在2004年12期的学习园地里看到这篇文章的。这篇文章的作者是童渊。
作者简介
童渊,北京工业大学实验学院嵌入式系统课程的教师,于2 0 0 4年作为访问学生在微软亚洲研究院工作。
看完这篇文章,我迫不及待的贴出来,因为写的真的很好。从事嵌入式一年多,从8051到ARM,我学习过,犹豫过,开心过,郁闷过。。。最近甚至有了放弃的想法,最终还是因为对嵌入式开发的不完全了解造成的。从一开始就一头扎进技术,学习各种技术,最后迷失在自己造成的泥坑里。这篇文章非常清晰的讲述了嵌入式开发的各个方面,对我这样迷茫的人起到了启发作用。
嵌入式开发和桌面开发不仅不同,而且非常相关,非常重视实际操作能力。从事桌面开发的人,在刚接触嵌入式系统的时候,通常不会转换,这主要体现在定位上。正如文章所说,你是谁,你要做什么?我对硬件的了解仅限于编程领域,对PCB设计一窍不通,但不代表不懂硬件就不能从事嵌入式开发。在一个系统的开发和设计的各个方面,在自己感兴趣和熟悉的领域做出自己的贡献是最重要的。
1。硬件设计:需要有硬件设计经验,对各种嵌入式设备有很好的了解。
2。系统移植:需要编译经验、操作系统原理以及对底层驱动的理解。
3。应用:需要桌面编程经验。