首页 > 精品范文库 > 1号文库
ARM9嵌入式复习总结
编辑:心上人间 识别码:10-1066465 1号文库 发布时间: 2024-07-15 15:49:14 来源:网络

第一篇:ARM9嵌入式复习总结

ARM9嵌入式复习

第一章

1.嵌入式微处理器的分类。

a)什么是嵌入式微处理器?

1.嵌入式微处理器是嵌入式系统硬件层的核心,嵌入式微处理器将通用CPU中许多由板卡完成的任务集成到芯片内部,从而有利于系统设计趋于小型化、高效率和高可靠性。嵌入式微处理器大多工作在为特定用户群所专门设计的系统中。

2.嵌入式微处理器的体系结构可以采用冯·诺依曼体系结构或哈佛体系结构,指令系统可以选用精简指令系统(Reduced Instruction Set Computer,RISC)和复杂指令集系统CISC(Complex Instruction Set Computer, CISC)。b)嵌入式微处理器分类

1.按照系列分:ARM系列、MIPS系列、PowerPC系列。2.按照指令复杂程度分:CISC和RISC两类

2.微处理器划分:

a)嵌入式微控制器 b)嵌入式微处理器 c)DSP处理器

d)嵌入式片上系统 e)多核处理器

3.嵌入式操作系统(EOS)的特性

EOS除具备了一般操作系统最基本的任务调度、同步机制、中断处理、文件处理等功能外,还具有如下特点:强实时性;支持开放性和可伸缩性的体系结构,具有可裁减性;提供统一的设备驱动接口;提供操作方便、简单、友好的图形GUI和图形界面;支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,提供强大的网络功能。

第二章

1.ARM7TDMI命名

2.3级流水线与总线架构 三级流水线:

流水线使用3个阶段,因此指令分为3个阶段执行 1.取指:从程序存储器中读取指令,放入流水线中

2.译码:操作码和操作数被译码,决定执行什么功能,为下一个始终周期准备数据路

径所需要的控制信号。

3.执行:执行已译码的指令

注:程序计数器(PC)指向被取指的指令,而不是指向正在执行的指令 在正常操作的过程中,在执行一条指令的同时对下一条指令进行译码,并将第三条指令从存储器中取出

3.ARM的两种状态与7种工作模式

a)两种状态。

i.ARM状态:32位,这种状态下执行的是字方式的ARM指令; ii.Thumb状态:16位,这种状态下执行半字方式的Thumb指令。注:两个状态之间的切换并不影响处理器模式或寄存器内容,可以使用BX指令切换两种状态.状态寄存器CPSR的T位反应了处理器运行不同指令的当前状态.b)7种工作模式。

注:除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。

题目:ARM微处理器复位后,PC的地址通常是 0x0,初始的工作模式是Supervisor 4.ARM常用几个寄存器功能

在ARM7TDMI处理器内部有37个用户可见的寄存器。31个通用32位寄存器,6个状态寄存器。

a.堆栈寄存器(SP):R13,在ARM指令集当中,没有以特殊方式使用R13的指令或其它

功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。

b.链接寄存器(LR):R14,在结构上有两个特殊功能:

1.在每种模式下,模式自身的R14版本用于保存子程序返回地址; 2.当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一

个小的固定偏移量)。c.程序计数器(PC):R15,在ARM状态,位[1:0]为0,位[31:2]保存PC。在Thumb状

态,位[0]为0,位[31:1]保存PC。对于ARM指令集而言,PC总是指向当前指令的下

两条指令的地址,即PC的值为当前指令的地址值加8字节。

d.程序状态寄存器(CPSR):R16,在所有处理器模式下都可以访问CPSR。每种异常模

式都有一个程序状态保存寄存器(SPSR),在异常发生时,SPSR用于保存CPSR的状

态。5.条件代码标志

N 运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;

Z 指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;

C 当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。当进行

减法运算(包括CMP 指令),并且最高位产生借位时C=0,否则C=1。对于结合移位

操作的非加法/减法指令,C为从最高位最后移出的值,其它指令C通常不变;

V 当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不

变。

附:控制位

I、F中断控制位——控制允许和禁止中断 T控制(标志)位——反映处理器的运行状态 M控制位——决定了处理器的运行模式 6.中断号、中断向量与优先级。(7种异常)7.存储器格式。

a)ARM体系结构使用232个字节的单

一、线性地址空间。将字节地址做为无符号数看待,范围为0~232-1 b)对于字对齐的地址A,地址空间规则要求如下:

● 地址位于A的字由地址为A、A+

1、A+2和A+3的字节组成; ● 地址位于A的半字由地址为A和A+1的字节组成;

● 地址位于A+2的半字由地址为A+2和A+3的字节组成; ● 地址位于A的字由地址为A和A+2的半字组成。注:这样并不能完全定义字,半字和字节之间的映射。存储器采用下列映射机制中的一种。

大端存储:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中

小端存储:低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节

例如,假设一个32位字长的微处理器上定义一个int类型的常量a,其内存地址位 于0x6000处,其值用十六进制表示为0x23456789。如图1.2.2(a)所示,如果按小端法存储,则其最低字节数据0x89存放在内存低地址0x6000处,最高字 节数据0x23存放在内存高地址0x6003处。如图1.2.2(b)所示,如果按大端法存储,则其最高字节数据0x23存放在内存的低地址0x6000处,而最低字节数据0x89存放在内存的高地址0x6003处。

第三章

一:寻址方式。1.寄存器寻址

操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器的内容是操作数,指令执行时直接取出寄存器值操作。

例如指令:

MOV R1,R2 ;R1←R2 SUB R0,R1,R2 ;R0←R1-R2 2.立即寻址

在立即寻址指令中数据就包含在指令当中,立即寻址指令的操作码字段后面的地址码部分就是操作数本身,取出指令也就取出了可以立即使用的操作数(也称为立即数)。立即数要以“#”为前缀,表示16进制数值时以“0x”表示。

SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位 MOV R0,#0xFF000;将立即数0xFF000装入R0寄存器 3.寄存器移位寻址。

寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:

MOV R0,R2,LSL #3;R2的值左移3位,结果放入R0,即是R0=R2×8 ANDS R1,R1,R2,LSL R3;R2的值左移R3位,然后和R1相“与”操作,结果放入R1 4.寄存器间接寻址

寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:

LDR R1,[R2];将R2指向的存储单元的数据读出保存在R1中

SWP R1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换 5.基址寻址

基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:

LDR R2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容,放入R2 STR R1,[R0,#-4]!;先R0=R0-4,然后把R1的值寄存到保存到R0指定的存储单元

6.多寄存器寻址

多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:

LDMIA R1!,{R2-R7,R12};将R1指向的单元中的数据读出到R2~R7、R12中(R1自

动加1)STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保存到R0指向的存储单元中

R0自动加1 7.堆栈寻址

堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:

向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 8.块拷贝寻址

多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如: STMIA R0!,{R1-R7};将R1~R7的数据保存到存储器中。

;存储指针在保存第一个值之后增加,;增长方向为向上增长。STMIB R0!,{R1-R7};将R1~R7的数据保存到存储器中。

;存储指针在保存第一个值之前增加,;增长方向为向上增长。9.相对寻址

相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:

BL SUBR1;调用到SUBR1子程序

BEQ LOOP;条件跳转到LOOP标号处

...LOOP MOV R6,#1...SUBR1...二:指令集(LDR STR MOV ADD SUB)

1.ARM指令集 2.Thumb指令集 3.常用指令

a)LDR:加载字数据 b)STR:存储字数据

LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式: 立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,[R0,#0x12] 寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDR R1,[R0,R2] 寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。

如:LDR R1,[R0,R2,LSL #2]

从寻址方式的地址计算方法分,加载/存储指令有以下4种格式: 零偏移。如:LDR Rd,[Rn] 前索引偏移。如:LDR Rd,[Rn,#0x04]!程序相对偏移。如:LDR Rd,labe1 后索引偏移。如:LDR Rd,[Rn],#0x04 c)MOV:数据传送指令

d)ADD:加法运算指令

e)SUB:减法运算指令

第四章

一:最小系统一个嵌入式处理器自己是不能独立工作的,必须给它供电、加上时钟信号、提供复位信号,如果芯片没有片内程序存储器,则还要加上存储器系统,然后嵌入式处理器芯片才可能工作。这些提供嵌入式处理器运行所必须的条件的电路与嵌入式处理器共同构成了这个嵌入式处理器的最小系统。而大多数基于ARM7处理器核的微控制器都有调试接口,这部分在芯片实际工作时不是必需的,但因为这部分在开发时很重要,所以也把这部分也归入最小系统中。

二:时钟产生单元

目前所有的微控制器均为时序电路,需要一个时钟信号才能工作,大多数微控制器具有晶体振荡器。简单的方法是利用微控制器内部的晶体振荡器,但有些场合(如减少功耗、需要严格同步等情况)需要使用外部振荡源提供时钟信号。

三:I2C的概念与应用

I2C BUS(Inter Integrated Circuit BUS,内部集成电路总线)是由Philips公司推出的二线制串行扩展总线,用于连接微控制器及其外围设备。I2C总线是具备总线仲裁和高低速设备同步等功能的高性能多主机总线,直接用导线连接设备,通信时无需片选信号。

如图6.2.1所示,在I2C总线上,只需要两条线—串行数据SDA线和串行时钟SCL线,它们用于总线上器件之间的信息传递。SDA和SCL都是双向的。每个器件都有一个唯一的地址以供识别,而且各器件都可以作为一个发送器或接收器(由器件的功能决定)。2C总线有如下操作模式:主发送模式、主接收模式、从发送模式、从接收模式。下面介绍其通用传输过程、信号及数据格式。

*数据有效:在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变.*起始停止

当I2C接口处于从模式时,要想数据传输,必须检测SDA线上的启动信号,启动信号由主器件产生。如图6.2.2所示,在SCL信号为高时,SDA产生一个由高变低的电平变化,即产生一个启动信号。当I2C总线上产生了启动信号后,那么这条总线就被发出启动信号的主器件占用了,变成“忙”状态;如图6.2.2所示,在SCL信号为高时,SDA产生一个由低变高的电平变化,产生停止信号。停止信号也由主器件产生,作用是停止与某个从器件之间的数据传输。当I2C总线上产生了一个停止信号后,那么在几个时钟周期之后总线就被释放,变成“闲”状态。主器件产生一个启动信号后,它还会立即送出一个从地址,用来通知将与它进行数据通信的从器件。1个字节的地址包括7位的地址信息和1位的传输方向指示位,如果第7位为“0”,表示马上要进行一个写操作;如果为“1”,表示马上要进行一个读操作。

*传输格式 SDA线上传输的每个字节长度都是8位,每次传输中字节的数量是没有限制的。在起始条件后面的第一个字节是地址域,之后每个传输的字节后面都有一个应答(ACK)位。传输中串行数据的MSB(字节的高位)首先发送。

*应答信号

为了完成1个字节的传输操作,接收器应该在接收完1个字节之后发送ACK位到发送器,告诉发送器,已经收到了这个字节。ACK脉冲信号在SCL线上第9个时钟处发出(前面8个时钟完成1个字节的数据传输,SCL上的时钟都是由主器件产生的)。当发送器要接收ACK脉冲时,应该释放SDA信号线,即将SDA置高。接收器在接收完前面8位数据后,将SDA拉低。发送器探测到SDA为低,就认为接收器成功接收了前面的8位数据。

*I2C总线的数据传输过程

① 开始:主设备产生启动信号,表明数据传输开始。

② 地址:主设备发送地址信息,包含7位的从设备地址和1位的数据方向指示位(读或写位,表示数据流的方向)。

③ 数据:根据指示位,数据在主设备和从设备之间进行传输。数据一般以8位传输,最重要的位放在前面;具体能传输多少量的数据并没有限制。接收器产生1位的ACK(应答信号)表明收到了每个字节。传输过程可以被中止和重新开始。

④ 停止:主设备产生停止信号,结束数据传输。

第五章

一:串口的概念(串行接口)常用的数据通信方式有并行通信和串行通信两种。当两台数字设备之间传输距离较远时,数据往往以串行方式传输。串行通信的数据是一位一位地进行传输的,在传输中每一位数据都占据一个固定的时间长度。与并行通信相比,如果n位并行接口传送n位数据需时间T,则串行传送的时间最少为nT。串行通信具有传输线少、成本低等优点,特别适合远距离传送。

① 串行数据通信模式

串行数据通信模式有单工通信、半双工通信和全双工通信3种基本的通信模式。● 单工通信:数据仅能从设备A到设备B进行单一方向的传输。● 半双工通信:数据可以从设备A到设备B进行传输,也可以从设备B到设备A进行传输,但不能在同一时刻进行双向传输。

● 全双工通信:数据可以在同一时刻从设备A传输到设备B,或从设备B传输到设备A,即可以同时双向传输。

② 串行通信方式 a.异步通信方式

异步通信时数据是一帧一帧传送的,每帧数据包含有起始位(”0”)、数据位、奇偶校验位和停止位(”1”),每帧数据的传送靠起始位来同步。一帧数据的各位代码间的时间间隔是固定的,而相邻两帧的数据其时间间隔是不固定的。在异步通信的数据传送中,传输线上允许空字符。

异步通信对字符的格式、波特率、校验位有确定的要求。● 字符的格式

每个字符传送时,必须前面加一起始位,后面加上1、1.5或2位停止位。例如ASCII码传送时,一帧数据的组成是:前面1个起始位,接着7位ASCII编码,再接着一位奇偶校验位,最后一位停止位,共10位。

● 波特率

传送数据位的速率称为波特率,用位/秒(bit/s)来表示,称之为波特。例如,数据传送的速率为120字符/秒,每帧包括10个数据位,则传送波特率为:

10×120=1200b/s=1200波特

每一位的传送时间是波特的倒数,如1/1200=0.833ms。异步通信的波特率的数值通常为:150、300、600、1200、2400、4800、9600、14400、28800等,数值成倍数变化。

● 校验位

在一个有8位的字节(byte)中,其中必有奇数个或偶数个的“1”状态位。对于偶校验就是要使字符加上校验位有偶数个“1”;奇校验就是要使字符加上校验位有奇数个“1”。例如数据“00010011”,共有奇数个“1”,所以当接收器要接收偶数个“1”时(即偶校验时),则校验位就置为“1”,反之,接收器要接收奇数个“1”时(即奇校验时),则校验位就置为“0”。

一般校验位的产生和检查是由串行通信控制器内部自动产生,除了加上校验位以外,通信控制器还自动加上停止位,用来指明欲传送字符的结束。停止位通常取1、1.5或2个位。对接收器而言,若未能检测到停止位则意味着传送过程发生了错误。

在异步通信方式中,在发送的数据中含有起始位和停止位这两个与实际需要传送的数据毫无相关的位。如果在传送1个8位的字符时,其校验位、起始位和停止位都为1个位,则相当于要传送11个位信号,传送效率只有约80%。

(2)同步通信方式

为了提高通信效率可以采用同步通信方式。同步传输采用字符块的方式,减少每一个字符的控制和错误检测数据位,因而可以具有较高的传输速率。

与异步方式不同的是,同步通信方式不仅在字符的本身之间是同步的,而且在字符与字符之间的时序仍然是同步的,即同步方式是将许多的字符聚集成一字符块后,在每块信息(常常称之为信息帧)之前要加上1~2个同步字符,字符块之后再加入适当的错误检测数据才传送出去。在同步通信时必须连续传输,不允许有间隙,在传输线上没有字符传输时,要发送专用的”空闲”字符或同步字符。

在同步方式中产生一种所谓“冗余”字符,防止错误传送。假设欲传送的数据位当作一被除数,而发送器本身产生一固定的除数,将前者除以后者所得的余数即为该“冗余”字符。当数据位和“冗余”字符位一起被传送到接收器时,接收器产生和发送器相同的除数,如此即可检查出数据在传送过程中是否发生了错误。统计数据表明采用”冗余”字符方法错误防止率可达99%以上。

二:NAND FLASH与NOR FLASH异同.答:不同:

1)NOR Flash把整个存储区分成若干个扇区(Sector),而NAND Flash把整个存储区 分成若干个块(Block),可以对以块或扇区为单位的内存单元进行擦写和再编程。

2)NAND Flash执行擦除操作是十分简单的,而NOR型内存则要求在进行擦除前先 要将目标块内所有的位都写为0。由于擦除NOR Flash时是以64~128KB为单位的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND Flash是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

3)NOR Flash的读速度比NAND Flash稍快一些,NAND Flash的写入速度比NOR Flash 快很多。NAND Flash的随机读取能力差,适合大量数据的连续读取。

4)NOR Flash容量通常在1 MB~8MB之间。而NAND Flash用在8MB以上的产品当 中。NOR Flash主要应用在代码存储介质中,NAND Flash适用于资料存储。

5)在NOR Flash上运行代码不需要任何的软件支持。在NAND Flash上进行同样操作 时,通常需要驱动程序,也就是内存技术驱动程序(MTD)。NAND Flash和NOR Flash在进行写入和擦除操作时都需要MTD。

6)在NAND Flash中每个块的最大擦写次数是一百万次,而NOR Flash的擦写次数是 十万次。

区别:两者工艺不一样,NOR读取速度快,成本高,容量不易做大,NAND读取慢,成本低,容量很容易作大。

相同点:都是采用FLASH技术生产

功能:NOR适合作为芯片程序存储的ROM使用,NAND适合作为非易失性数据存储器 第八章

一:Linux的最常用的命令

答:1)adduser 示例:创建pdr帐户 adduser pdr 2)cat 示例:

cat text 在屏幕上显示文件text的内容;

cat-n textfile1 > textfile2 把 textfile1 的文件内容加上行号后输入 textfile2 这个文件里; 3)cd 示例:假设用户当前目录是 /home/xu 现需要更换到/home/xu/pro 目录中 $ cd pro 4)cp 示例:

$ cp-r /usr/xu/ /usr/liu/ 表示将/usr/xu 目录中的所有文件及其子目录拷贝到目录 /usr/liu中。

5)export 示例:显示当前所有环境变量的设置情况 #export 6)Fdisk 示例:查看当前系统中磁盘的分区状况,包括硬盘、U盘等fdisk-l 7)Ln: 类似windows下的快捷方式

示例:要为当前目录下的file文件建立一个硬链接,名为/home/lbt/doc/file/, 可用如下命令: ln file /home/lbt/doc/file 8)locate 示例:locate filename: 寻找系统中所有叫filename的文件

9)Ls 示例:将 /bin 目录以下所有目录及文件详细资料列出 : ls-lR /bin 10)minicom 示例:开启minicom的配置界面 minicom –s 11)Mkdir 示例:在当前目录中创建嵌套的目录层次inin 和inin下的mail目录权限设置为只有文件拥有者有读、写和执行权限。mkdir-p-m 700./inin/mail/ 12)Mount 示例:挂载ntfs格式的hda7分区到/mnt/cdrom文件夹mount-o iocharset=cp936 /dev/hda7 /mnt/cdrom 13)mv 示例:$ mv /usr/xu/ *.表示将/usr/xu 中的所有文件移到当前目录 用.表示

14)Passwd:passwd 作为普通用户和超级权限用户都可以运行,但作为普通用户只能 更改自己的用户密码,但前提是没有被root用户锁定;如果root用户运 行passwd,可以设置或修改任何用户的密码;passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码

示例:passwd pengdr 15)ping 示例:ping www.teniu.cc 16)pwd:查看”当前工作目录“的完整路径 示例:

[root@localhost ~]# pwd /root 17)reboot:执行reboot指令可让系统停止运作,并重新开机。示例:做个重开机的模拟(只有纪录并不会真的重开机)。reboot –w 18)rmdir 示例:在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删 除后,BBB 目录成为空目录,则 BBB 亦予删除。

rmdir-p BBB/Tes [root@localhost ~]# 19)setup 功能说明:设置程序,类似windows控制面板 语法:setup 20)su功能说明:变更用户身份。示例:变更账号为超级用户,并在执行df命令后 还原使用者。su-c df root 21)tar 功能说明:备份或解压文件。示例:压缩目录/etc为tar.gz后缀。# tar cvf backup.tar /etc 解压#tar –zxvf file.tar.gz #tar –jxvf file.tar.bz2 22)umount 功能:卸除文件系统。示例:卸载 /mnt区: umount /mnt/cdrom 23)whereis 功能:查询某个二进制命令文件、帮助文件等所在目录.比如:查找“ls” 这个二进制命令文件所在的目录 whereis ls

第九章

一:ADS编译环境的设置

二:系统启动代码bootloader概念

在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于 ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址 0x00000000开始执行。而在这个地址处安排的通常就是系统的BootLoader程序。

BootLoader就是在操作系统运行之前运行的一段小程序。通过它可以初始化硬件设备,从而将系统的软硬件环境设置到一个合适的状态,以便为最终调用操作系统做好准备。Bootloader是在嵌入式系统内核运行之前运行的一段引导加载程序。

作用:将内核映像从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。

嵌入式系统常见的Bootloader有vivi和U-Boot,RedBoot

题目一:简述Bootloader启动过程。

1、第一阶段

(1)、基本的硬件设备初始化(2)、为阶段2代码准备RAM空间(3)、拷贝阶段2代码到RAM空间(4)、设置好堆栈

(5)、跳转到阶段2的C程序入口点

2、第二阶段

(1)、初始化本阶段要使用到的硬件(2)、检测系统内存映射(memory map)(3)、将kernel和根文件系统映像从flash读到RAM空间(4)、为kernel设置启动参数(5)、调用内核

题目二:请简述嵌入式软件Bootloader的两种工作模式。

启动加载模式:启动加载模式称为“自举”(Autonomous)模式。即Bootloader从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。启动加载模式是 Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。

下载模式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被 Bootloader写到目标机上的FLASH 类固态存储设备中

三:Makefile文件的用途与写法

1.用途:makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。2.写法: 1)需要由make工具创建的目标体(target),通常是目标文件右可执行文件;2)要创建的目标体所依赖的文件(dependency_file);3)创建每个目标体进需要运行的命令(command)格式:target:dependency_files command 例如,有两个文件分别为hello.c和hello.h,创建的目标体为hello.o,执行的命令为gcc编译指令:gcc –c hello.c,那么,对应的Makefile就可以写为:

#The simplest example hello.o:hello.c hello.h gcc –c hello.c –o hello.o 接着就可以make了。使用make的格式为:#make target,这样make就会自动读入Makefile(也可以是首写字母小写makefile)并执行对应target的commank语句,并会找到相应的依赖文件。如下所示:

[root @localhost makefile] # make hello.o Gcc –c hello.c –o hello.o [root @localhost makefile] # ls Hello,c hello.h hello.o Makefile 可以看到,Makefile执行了”hello.o”对应的命令语句,并生成了”hello.o”的目标体.附:makefile的自动变量:

$* 不包括扩展名的目标文件名称

$+ 所以的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件 $< 第一个依赖文件

$? 所以时间戳比目标文件晚的依赖文件,并以空格分开 $@ 目标文件的完整名称

$^ 所有不重复的依赖文件,以空格分开

$% 如果目标是归档成员,则该变量表示目标的归档成员名称

题目一:Makefile和Make各实现什么功能?

Makefile文件内容 按照规则,对系统中本目录下的文件(.c、.s、.o、.h、.lib等)根据相互关系和要求进行组织,设定各自的编译方法,指定所生成的目标。Makefile是一种文本格式文件。

Make是Makefile文件的解释器

Make对Makefile文件解释后,生成Linux的shell命令和gcc编译命令,接着对命令执行,最终生成目标文件。

Makefile是工程系统编译批处理文件。

第十章

一:嵌入式编译环境的概念、建立方法以及步骤

第十一章

一:Linux驱动设备的分类与常用的数据结构

1.Linux系统设备分为三类:字符设备、块设备和网络设备 2.数据结构: 用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数(或称为功能接口函数)。这些设备的功能接口函数都被定义在 中的数据结构体里面。

struct file_operations{ };

struct inode{ };

struct file{ }; 二:内核驱动代码的书写规则

第二篇:ARM嵌入式技术复习总结

第一章 1.嵌入式系统定义/概念:嵌入式系统就是嵌入到对象体中的专用计算机系统。三要素:嵌入、专用、计算机。嵌入性:嵌入到对象体系中,有对象环境要求,专用性:软、硬件按对象要求裁减,计算机:实现对象的智能化功能。广义的讲,一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体,即以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用对功能。可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统发展的最高形式——片上系统(SOC)2.嵌入式系统的特性:a.只执行特定功能;b.以微控制器、外围器件为中心,系统构成可大可小;c.有严格的时序性和稳定性要求;d.自动操作循环,等待中断控制;e.程序被烧写在存储芯片中。(开发时应注意的a.嵌入式系统是面向具体应用的产品b.嵌入式软件特征:具有实时性,高质量、高可靠,程序固化c.需要软硬件开发工具和系统软件d.需要应用专家参与开发e.嵌入式系统分散而不可垄断)3.嵌入式系统的分类:a.按表现形式分(硬件范畴):芯片级嵌入(含程序或算法的处理器)、模块级嵌入(系统中的某个核心模块)、系统级嵌入(完整系统并有嵌入软件)b.按实时性要求分(软件范畴):非实时系统(PDA)、实时系统(软实时系统:消费类产品。硬实时系统:工业和军工系统)4.嵌入式微处理器(发展趋势:经济性、微型化、智能化)主要分类: 微控制器(MCU)(51单片机)、微处理器(MPU)(ARM、PowerPC)、数字信号处理器(DSP)(一般用在快速执行算法,做控制比较困难)、混合处理器和片上系统(SOC)(结构简洁,体积小、功耗低,可靠性高,设计生产效率高。Smart XA)、可编程片上系统(SOPC)5.嵌入式系统组成:粗略划分:嵌入式处理器、外围设备、嵌入式操作系统(可选)、嵌入式应用软件。稍细划分:嵌入式处理器、外围设备、驱动程序、嵌入式操作系统、应用接口、嵌入式应用软件。6.嵌入式操作系统简介:a.嵌入式操作系统是支持嵌入式系统的操作系统,它是嵌入式应用软件的基础和开发平台。b.功能:进程调度、内存管理、设备管理、文件管理、中断管理、系统功能接口(API调用,如网络功能)、设备驱动。c.特点:系统可裁减、可配置,系统具有实时性,系统稳定、可靠。d.实时系统的定义:能够对外部事件做出及时响应的系统,响应时间要有保证。硬实时系统:对系统响应时间有严格的要求,如果系统响应时间不能满足,就会引起系统崩溃或致命的错误。软实时系统:对系统响应时间有要求,但是如果系统响应时间不能满足,它并不会导致系统出现致命的错误或崩溃,只是降低系统的吞吐量。e.几种主流的嵌入式操作系统:µC/OS-II:教学的免费、面向中小型嵌入式系统应用。Vxworks:具有可靠、实时、可裁减特性。WinCE:它是微软针对个人电脑以外的电脑产品所研发的嵌入式操作系统。Linux/µCLinux:免费、源码开放的操作系统,µclinux面向没有MMU的硬件平台。PalmOS :具有开放的操作系统应用程序接口(API),可让用户灵活方便地定制操作系统。

第二章1.ARM体系的特点:a.低功耗、低成本、高性能(3/5级流水线)。b.采用RISC体系结构。c.使用大量的寄存器(37个寄存器31个通用6个状态)d.高效的指令系统(Thumb指令与等价的ARM代码相比较可节省30~40%以上的存储空间)e.在保证高性能的前提下尽量缩小芯片面积、降低功耗;所有的指令都可以根据前面的执行结果决定是否被执行。2.ARM7采用3级流水线(是把一个重复的过程分解为若干个子过程,每个子过程可以与其他子过程同时进行):取指(从程序存储器中取指令,放入指令流水线,占用存储器访问操作)、译码(指令译码,占用译码逻辑)、执行(执行指令/读写reg,占用ALU及数据路径)。一条指令有3个时钟周期的执行时间,但吞吐量是每个周期1条指令。PC 指向处于读取级的指令地址,而不是处于执行级的指令地址PC=当前执行指令地址+8。比较:ARM9是5级流水线(取指、译码、执行、存储器、写),哈佛架构,拥有独立的指令和数据总线;指令和数据的读取可以在同一周期进行。3级流水的ARM7内核是指令和数据总线复用的冯.诺依曼架构,指令和数据的读取不能在同一周期进行;5级流水线设计把寄存器读取、逻辑运算、结果回写分散在不同的流水当中,每一级流水的操作简洁,提升了处理器的主频。3.ARM微处理器的工作状态与模式:两种工作状态:ARM状态,此时处理器执行32位的字对齐的ARM指令;Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。状态切换:ARMTHUMB:当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法;当处理器处于Thumb状态时发生异常,则异常处理返回时,自动切换到Thumb状态。THUMBARM:当操作数寄存器的状态位为0时,执行BX指令;在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可使处理器切换到ARM状态。模式:用户模式:ARM处理器正常的程序执行状态,大部分任务执行在这种模式;快速中断模式:当一个高优先级中断产生时将会进入这种模式,用于高速数据传输或通道处理;外部中断模式:当一个低优先级中断产生时将会进入这种模式,用于通用的中断处理;管理模式:当复位或软中断指令执行时将会进入这种模式,供操作系统使用的一种保护模式;中止模式:当存取异常时将会进入这种模式,用于虚拟存储及存储保护;未定义模式:当执行未定义指令时会进入这种模式,软件仿真硬件协处理器;系统模式:供需要访问系统资源的操作系统任务使用,运行具有特权的操作系统任务。模式特点:1)用户模式特点:应用程序不能够访问受操作系统保护的系统资源;应用程序不能进行处理器模式的切换。2)系统模式特点:不属于异常模式,不是通过异常进入的。系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行模式的切换。它主要供操作系统使用。3)特权模式:除用户模式之外的工作模式,特点:应用程序可以访问所有的系统资源;可以任意地进行处理器模式的切换 4)异常模式:除用户模式、系统模式之外的五种模式,特点:以各自的中断或异常方式进入,并且处理各自的中断或异常。模式切换:软件控制进行切换(在特权模式下通过改变CPSR中的运行模式位[4:0]);通过外部中断和异常进行切换。4.数据类型: 8位、16位(半字对齐)、32位(字对齐)的有符号和无符号型。5.存储字数据:两种方法(大端、小端格式)。大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中;小端格式:与大端存储格式相反。缺省设置为小端格式。6.ARM状态下寄存器:程序计数器PC(R15)(ARM状态下,位[1:0]为0,位[31:2]用于保存PC;Thumb状态下,位[0]为0,位[31:1]用于保存PC)。R13常用作堆栈指针(SP)。R14也称作子程序连接寄存器或连接寄存器LR。当执行BL子程序调用指令时,可以从R14中得到R15的备份。寄存器R16用作CPSR(当前程序状态寄存器)。7.ARM/Thumb下寄存器区别:Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,Thumb和ARM状态下的R0~R7、CPSR和所有的SPSR是相同的;Thumb状态下的SP对应于ARM状态下的R13;Thumb状态下的LR对应于R14;Thumb状态下的PC对应于R15。8.异常:ARM有7种异常:复位、未定义指令、软件中断、指令预取中止、数据中止、IRQ、FIQ。异常响应:复位异常立即中止当前指令。其他:保存返回地址(将引起异常指令的下一条指令的地址保存到新的异常模式下的R14);保存当前状态寄存器CPSR的内容(将CPSR的内容保存到将要执行的异常中断对应的SPSR中);设置当前状态寄存器CPSR中的相应位(设置控制位使进入响应执行模式;禁止FIQ、IRQ);转去执行中断处理程序(取相应的中断向量给程序计数器PC)。返回:将返回地址装入PC ;恢复CPSR的值 ;清除中断屏蔽位。9.异常向量地址:复位-0x00000000(管理模式);未定义-0x00000004(未定义);软件中断-08(管理);中止(预取指令)-0c(中止);中止(数据)-10(中止);保留-0x00000014;IRQ-18(IRQ);FIQ-1C(FIQ)。10.异常优先级:复位>数据中止>FIQ>IRQ>预取指令中止>未定义中止、SWI

第五章1.编写应用程序都要用到的文件:a.INC目录下的文件: Def.h(基本数据类型重定义头文件U32,S16等)Option.h(是硬件系统重要设置头文件,修改系统的工作频率,总线宽度,一些重要地址的值)2410addr.h(是2410的寄存器的地址宏定义头文件)2410lib.h(调试时常用函数,还有一些其它的常用函数的头文件)b.SRC目录下的文件: 2410init.s 是2410初始化启动程序,由汇编语言写成2.ARM的启动过程—系统的初始化:包括两个级别的操作:系统运行环境初始化、应用程序初始化。a.运行环境初始化(对于嵌入式应用系统来说,由于没有操作系统的支持,存放在ROM的代码必须进行所有的初始化工作):①设置初始入口点(初始入口点是映象文件运行时的入口点,每个映像文件只有一个唯一的初始入口点,它保存在ELF头文件中。初始入口点必须位于映像文件的可执行区域;包含初始入口点的可执行域不能被覆盖,它的加载时地址和运行时地址必须是相同的)②设置中断向量表(如果系统运行时,地址0x00处为RAM,则系统初始化时必须重建异常中断向量表)③初始化存储系统④初始化数据栈指针⑤初始化关键的IO设备⑥设置中断昔日需要的RAM变量⑦使能异常中断(通过清除CPSR寄存器的中断禁止位实现)⑧切换处理器模式(系统还处于特权模式,如果下面要运行的应用程序是在用户模式下运行,就需要将处理器切换到用户模式。)⑨切换程序状态(所有的RAM内核都是从ARM状态开始执行的)b.应用程序初始化①将已经初始化的数据搬运到可写的数据区(这部分数据就是映像文件中的RW属性的数据)②在可写存储区建立ZI属性的可写数据区3.ARM的启动过程—初始化程序分析:①定义程序入口地址(由AREA伪操作定义: AREA Init,CODE,READONLYENTRY)②建立异常向量以及中断处理:1)建立中断向量入口2)建立中断服务程序入口地址表3)看门狗与中断禁止(当系统复位后,看门狗与中断要被首先禁止与被初始化,否则,当看门狗溢出产生的系统复位,引起中断,其它中断源产生中断时,CPU会进入一个未知的状态,出现程序跑飞等现象)4)系统时钟初始化5)电源低功耗模式6)内存控制器初始化(接口时序优化)7)模式的堆栈初始化地址(对程序中需要用到的每一种模式都要给SP定义一个堆栈地址)8)初始化用户执行环境(应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零)9)呼叫主应用程序(IMPORT main或B main)4.ARM映像文件:arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。映像文件一般由域组成。域最多由三个输出段组成(RO、RW、ZI)组成,输出段又由输入段(代码和数据)组成。5.中断(☆注:异常包含5种模式:管理(复位、软件中断SWI)、中止(指令预取中止、数据中止)、未定义、快速中断FIQ、外部中断IRQ。中断分两类:SWI、硬件(FIQ、IRQ)。异常包含中断,中断都属于异常)中断仲裁:决定中断的优先级,当中断控制器接收到多个中断请求时,其内的优先级仲裁器裁决后向CPU发出优先级最高的中断请求信号或快速中断请求信号,中断系统有6个分仲裁器和1个总仲裁器,每一个仲裁器可以处理6路中断。在编写中断服务程序时需要满足如下要求:(1)不能向中断服务程序传递参数;(2)中断服务程序没有返回值;(3)中断服务程序应要尽可能短,来减少中断服务程序的处理时间,保证实时系统的性能。使用中断的步骤:(1)在使用中断前先设置好相应模式下的堆栈。如当发生快速中断FIQ 时,CPU进入“快中断模式”,这时使用“快中断模式”下的堆栈。(2)对于“Request sources”中的中断,将INTSUBMSK 寄存器中相应位设为0。(3)将INTMSK 寄存器中相应位设为O。(4)确定使用的方式:是FIQ 还是IRQ。如果是FIQ,则在INTMOD 寄存器设置相应位为1。如果是IRQ,则在PRIORITY 寄存器中设置优先

级(5)准备好中断处理函数:①中断向量:在中断向量设置好当FIQ 或IRQ 被触发时的跳转函数。②对于IRQ,在跳转函数中读取INTPND 寄存器或INTOFFSET 寄存器的值来确定中断源,然后调用具体的处理函数。③对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源。④中断处理函数进入和返回。(6)设置CPSR 寄存器中的F位对于FIQ,或I位对于IRQ,其值为0时,表示开中断。

第六章1.Nor Flash与Nand Flash比较:Nor flash:读速度高,而擦、写速度低,容量小,价格高。Nand flash:读速度不如Nor flash,但擦、写速度高,容量大,价格低。有取代磁盘的趋势。现在不少用户从Nand flash启动和引导系统(开始 4KB代码,BANK0中,自动复制到内部SRAM中,利用这4KB的代码把更多的代码从Nand flash中读到SDRAM中),而在SDRAM上执行主程序代码。2.串口介绍:(1)UART(通用异步串行口):有三个独立的异步串行I/O 端口,每个串口(11个专用寄存器,共39个)都可以在中断和DMA 两种模式下进行收发。UART支持的最高波特率达230.4kbps。每个UART 包含:波特率发生器(以PCLK或UCLK为时钟源)、接收器、发送器和控制单元。发送器和接收器各包含1个16 字节的FIFO 寄存器和移位寄存器。工作原理:(FIFO模式)当发送数据的时候,数据先写到FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO 中。使用FIFO与不使用FIFO的比较:前者是通过对FIFO状态寄存器UFSTATn的查询,确定进行收发,后者是通过对收/发状态寄存器UTRSTATn的查询,确定进行收发。中断或DMA请求: 7种中断请求事件是:溢出错误、奇偶校验错误、帧格式错误、传输中断信号、接收缓冲器数据就绪、发送缓冲器空、发送移位器空。分成3类:错误中断请求、接收中断请求、发送中断请求。RS232:全双工,采用负逻辑,单端传送,适合短距离传输;RS422:单工差分,两条线相对电压传送,至少需要四条线传输;RS485:半双工,单工差分,差分异步传输,适合远距离传输。(2)USB接口(通用串行总线)(49个reg):主要用于PC与外围设备互连,数据传输速度为:低速1.5Mb/s,全速12Mb/s,高速480Mb/s。主要由5部分组成:USB芯片及协议程序(固件)、控制器(控制USB芯片)、控制器程序、USB设备驱动程序、USB设备。USB总线主要特点:USB端口不区分设备,即插即用、可热插拔,传输速度高,易扩展、可扩展到127个USB设备,对设备提供电源,成本低等。(3)I2C串行总线接口:(4个reg)总线信号为两线,一个能够双向传输的数据线SDA、另一个能够双向传输的时钟线SCL。是信号线

2最少的串行总线。总线的特点:a.有一个IC总线接口。b.I2C总线的速度:可以标准速度传输(100kb/s),也可以高速传输(高达400kb/s)。c.可以查询方式

和中断方式工作。d.可以主设备身份传输,也可以从设备身份传输,因此共有4种操作模式(主机、从机发送、接收)。主要有5部分构成:数据收发寄存器、数据移位寄存器、地址寄存器、时钟发生器、控制逻辑等部分。系统要求:a.各个节点设备必须具有I2C接口功能;b.各个节点设备必须共地;c.两个信号线必须接上拉电阻。(4)I2S串行总线接口:a.1通道音频I2S总线接口,可基于 DMA方式工作;b.串行,每通道 8/16 位数据传输;c.发送和接收具备 128 字节(64 字节加64 字节)FIFO;d.支持 IIS 格式和 MSB-justified数据格式。(5)网络接口:支持8位、16位的微处理器,可以工作在I/0方式或Memory方式。片内集成了双工SA总线接口,可以直接和有双工SA总线的微处理器系统无缝连接。(6)JTAG接口:硬件仿真器可以通过JTAG接口对开发板进行在线仿真调试,也可以使用sjf2410等烧写工具通过JTAG接口对其扩展的Flash存储器进行编程。(7)SPI 接口:a.兼容 2 通道 SPI 协议 2.11版;b.发送和接收具有 2×8 位的22移位寄存器;c.可以基于 DMA或中断模式工作3.串口总结:芯片级(IC、IS、SPI、USB),系统级(网络接口、JTAG接口、USB、UAR T :RS232/485/422)。URAT

传输距离:RS232<485(差分)<光缆。4.看门狗:看门狗是一种电路,具有监视并恢复程序正常运行的功能,是一个定时器电路。基本原理:设一系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,要求Ti>Tp。在程序运行一周期后,修改定时器的计数值,只要程序正常运行,定时器就不会溢出。若由于干扰等原因使系统不能在Tp 时刻修改定时器的计数值,定时器将在Ti 时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。功能:定时器功能、复位功能。构成:时钟、看门狗计时器、看门狗数据寄存器、复位信号发生器、控制逻辑等。5.补充:(1)I/O端口寄存器:引脚配置寄存器、数据reg、引脚上拉reg、保留reg。(2)LCD(液晶显示器):是一种数字显示技术,可以通过液晶和彩色过滤器过滤光源,在平面面板上产生图象。组成:LCD显示屏、显示控制器、缓冲存储器。

第七章1.Linux系统及特点:Linux是一套免费使用和自由传播的类Unix操作系统。特点:自由软件,开放源代码;真正的多用户、多任务操作系统;可灵活裁剪配置;支持多种硬件平台;提供强大的管理功能;完全符合POSIX标准;具有丰富的图形界面;具有强大的网络功能。2.Linux组成:①Linux内核,功能是:进程管理(负责创建和撤销进程以及处理他们和外部世界的连接)、内存管理(内核在有限的可用资源上为每个进程都创建了一个虚拟寻址空间)、文件系统(内核在没有结构硬件上构造结构化的文件系统)、设备控制(内核必须为系统中的每件外设嵌入相应的驱动程序)、网络功能(处理路由和地址解析问题)。②Linux Shell:常用的有:Bourne Shell(sh,最初始的Shell,并且在每种Unix上都可以使用),C-Shelll(csh),Korn Shell(ksh),Bourne Again Shell(bash,大多数Linux系统的默认Shell)。③Linux文件结构:文件结构是文件存放在磁盘等存储设备上的组织方法,主要体现在对文件和目录的组织上,目录提供了管理文件的一个方便而有效的途径。Linux目录采用多级树形结构,用户可以浏览整个系统,可以进入任何一个已授权进入的目录,访问那里的文件,目录树只有一个,不管OS管理几个磁盘分区。④Linux实用工具,分三类:编辑器:用于编辑文件;过滤器:用于接收数据并过滤数据;交互程序:允许用户发送信息或接收来自其他用户的信息。

第八章1.交叉编译环境的软件工具1)Binutils:Binutils是一组针对目标系统的二进制开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。2)GCC:编译器,gcc不但能够支持C/C++语言的编译,而且能够支持FORTRAN JAVA ADA等编程语言。3)Glibc:Glibc库是提供系统调用和基本函数的C库,可以编译生成静态库和动态库。4)GDB:GDB可以调试C和C++语言程序,功能:a.启动被调试程序。b.让被调试的程序在指定的位置停住。c.当程序被停住时,可以检查程序状态(如变量值)。5)Crosstool:实际上是一个脚本,用于编译和测试大多数体系结构的各gcc和glibc的版本组合。2.Linux开发环境组建:可分别建立以LINUX为操作系统的开发环境或者在Windows下安装模拟Linux环境的软件。几种组建方案:① Windows+ Linux +目标系统(可以解决开发环境问题,但同时用两个操作系统,来回切换,浪费时间)、②Windows+cygwin+目标系统(cygwin是运行于windows下的linux模拟运行环境,但是在使用某些特殊功能时,需要添加一些补丁)、③Windows+虚拟机(Linux)+目标系统(在不破坏原有操作系统的基础上,虚拟一台‘真实’计算机,在它上面安装linux和操作真实的linux一样)、④Windows+Linux服务器 +目标系统(只需要一台linux服务器即可,对客户机和服务器的硬件要求没什么特别需求)。3.用户、Shell、Linux之间关系:Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。Shell是用户和操作系统之间最主要接口。通过Shell,可以同时在后台运行多个应用程序,并且在把需要与用户交互的程序放在前台运行。4.makefile文件的作用:使用make 工具,可以将大型的开发项目分解成为多个易于管理的模块,make在执行时,需要一个命名为Makefile的文件。Makefile文件描述了整个工程的编译,连接等规则。Makefile说明了组成程序的各模块间的相互关系及更新模块时必须进行的动作,make按照这些说明自动地维护这些模块。在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法。

第九章1.BootLoader概念:系统上电之后,需要一段程序来进行初始化,如果它能将操作系统内核(从本地Flash或通过网络)复制到内存中运行,就称这段程序为Bootloader。其作用是,在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。2.两种操作模式:①启动加载模式,即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入;②下载模式,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件,这种模式通常在第一次安装内核与根文件系统时被使用,以后的系统更新也会使用Bootloader的这种工作模式。3.启动方式:①网络启动方式,使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。②磁盘启动方式,传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并且使用磁盘作为存储介质,在硬盘的主引导区,需要一个Bootloader可以从磁盘文件系统中把操作系统引导起来。③Flash启动方式,Bootloader的入口位于处理器上电执行第一条指令的位置,Bootloader引导Linux内核,就是要把内核映像解压到RAM中去,然后跳转到内核映像入口执行,从而实现自举启动,与磁盘启动相似。4.种类与特点:Bootloader种类繁多,比如x86上有LILO、GRUB等;对于ARM架构的CPU,有U-Boot、Vivi等。特点:LILO是Linux磁盘引导程序,GRUB是GNU的LILO替代程序;ViVi支持串口下载功能,代码量小;U-boot通用引导程序,支持串口、网络下载功能,代码量大;Redboot支持串口、网络下载功能,代码量最大;Blob:支持串口、网络下载功能,代码量小5.基本原理:①操作模式:„ ②通信:目标机上的Bootloader一般可通过串口与主机之间进行文件传输,也可以通过以太网连接并借助TFTP协议来下载文件,这样传输更快; ③Bootloader 的功能与结构:由于Bootloader的实现依赖于CPU的体系结构,大多数Bootloader都分为stage1和 stage2两大部分。stage1通常包括以下工作:硬件设备初始化、为加载Bootloader的stage2准备RAM空间、拷贝Bootloader的stage2到RAM空间中、设置堆栈、跳转到stage2的C入口点。stage2的代码通常用C语言来实现,stage2 执行映像的入口点是用汇编语言写一段trampoline小程序,用这段trampoline小程序来作为main()函数的外部包裹。

补充:1.LCD屏的主要技术参数:(1)像素:显示屏上所能控制的最小单位(2)分辨率:分辨率指 LCD 上象素的数目3)色深:在某一分辨率下,每一个像点可以有多少种色彩来描述,单位是“bit”,色深和分辨率之积决定了显示缓存区的大小(4)刷新频率:图像在屏幕上更新的速度,也即屏幕上的图像每秒钟出现的次数,单位是赫兹(5)物理尺寸:LCD的外观尺寸对角线长度,单位为英寸

2.分散装载技术:ARM的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件中指定的存储器分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址,当嵌入式系统在复位或重新上电时,在对CPU相应寄存器进行初始化后,首先执行ROM存储器的Bootloader代码,根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,定位在RAM存储器的代码和数据就在RAM存储器中运行,而不再从ROM存储器中取数据或取指令,从而大大提高了CPU的运行速率和效率。最常用的2种情况:(1)把中断程序作为一个单独的运行域,放在32位的RAM,(2)将启动代码以外的所有代码都复制到RAM中运行。

3.PWM:只对一方波序列信号的占空比按照要求进行调制,而不改变方波信号的其它参数,即不改变幅度和周期,因此脉宽调制信号的产生和传输,都是数字式的。只要带宽足够(频率足够高或周期足够短),任何模拟信号都可以使用PWM 来实现。应用:借助于微处理器,使用脉宽调制方法实现模拟信号是一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

第三篇:实习总结-嵌入式ARM

实训总结

班级 卓越1301姓名***

通过这段时间的学习使我学到了很多知识,并且了解到ARM的应用以及对开发板的应用,为以后的学习奠定了一定的基础。

嵌入式系统一般定义为以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统这是从技术角度。从系统角度上是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。

广义上讲,凡是带有微处理器的专用软硬件系统都可称为嵌入式系统。如各类单片机和DSP系统。这些系统在完成较为单一的专业功能时具有简洁高效的特点。但由于他们没有操作系统,管理系统硬件核软件的能力有限,在实现复杂多任务功能时,往往困难重重,甚至无法实现。从狭义上讲,我们更加强调那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的嵌入式系统。

嵌入式的应用也比较广泛涉及军事国防、工业控制、消费电子和网络。在家用方面更是数字电视、信息家电、智能玩具、手持通讯、存储设备的核心。

在ARM指令集中了解到ARM的寻址方式以及它的的特性,具有高效、快速的特点,还有Thumb指令集具有灵活、小巧的特点。

在这次实训中做了两个项目,一个是LED灯,实现LED灯的点亮是比较简单的,通过查找手册可以很快的了解到要使用的寄存器和方法,另一个项目是DS18B20这个比较复杂,除了要掌握对寄存器的使用,还要对了解对串口的初始化,读写字节等等。

感谢这次实训,通过这次的实训项目,使我大体了解制作项目的步骤,了解了嵌入式技术的掌握是需要一个过程的。实事求是的说,嵌入式技术的全面掌握是有相当难度的,通过积累和动手总会有收获的,从实验中也明白了一个大的项目并不是一个人可以完成的,团队协作很重要。

姓名:***

年级:卓越1301

202_-7-5

第四篇:ARM嵌入式linux复习心得总结1

202_.10.9 Evo杨

ARM嵌入式linux复习心得总结1:

一、Linux定制安装:

从新安装配置了一遍Linux,我使用的是Vmware7.0安装RHEL5.5,对于Linux的安装主要是要选择定制安装也就是Vmware7.0(下面简称Vm)中新建虚拟机开始部分选择”Custom(advanced)”,因为这里我所使用的FTP、sumba等服务器是需要定制加上的一开始没有注意结果悲剧了…(以后一定要仔细的选择!),在next后面应该选择最后一个选项这样自定义的选项会更加多,同样可以选择定制安装的一些选项,在这里同样有个地方要注意:

1、最好使用默认的内存分配方式

2、*(重要)选择bridged networking 的网络连接方式(这里要注意,第一次安装的时候没有注意使用的是默认值也就是NET模式,最后在设置NFS和sumba服务器的时候(也可能是其他的操作错误)无法与PC机ping通讯这里花费了大量的时间研究!后面就是Linux系统的安装了,这里我使用的是图形化界面的安装(以前大一的时候用命令行安过一次自己英语太垃圾了,安了整整一上午…)

3、在最后配置的时候防火墙要禁用,因为这里防火墙会阻止一切自发的与本机联网的事件,在后面使用NFS以及sumba服务器的时候是不能打开的,第一次安装的时候吃过这方面的亏以后要注意!

4、禁用SELinux,这个也是与安全有关的,现在暂时禁用就可以了。

二、再次回顾了一下Linux的命令,这里比较熟悉,跟走路一样这里必须专业起来!总的来说有一下几个命令必须灵活运用:

1、useradd(添加用户名,后面使用sumba服务器的时候需要用到,使用率较低)

2、passwd(添加用户密码,一般配合useradd使用,使用率较低)

3、su(切换用户,经常用)

4、shutdown(关机命令,用法有多种,我一般不用,虚拟机直接断电就行了)

5、cp(拷贝,不解释)

6、mv(移动或更名,不解释)

7、rm(删除,不解释)

8、mkdir(创建目录)

9、cd(改变工作目录,经常用)

10、pwd(显示当前目录)

11、ls(查看目录)

12、tar(针对tar.gz打包和解压,这里主要记住 tar cvzf * 和tar xvzf * 一个是压缩,一个是解压)

13、tar(针对tar打包和解压,这里主要记住 tar cvf * 和tar xvf * 一个是压缩,一个是解压)

14、unzip(解压zip文件)

15、chmod(更改权限)

16、df(查看磁盘使用情况)

17、ifconfig(查看网络配置、查看ip等)

18、netstat(查看网络状态)

19、grep(查找字符串,这个其实很重要,但自己总是忘记可能是一般不用的原因)20、rpm(用于软件安装)

21、mount(挂载,很重要用语挂载CDROM、硬盘以及共享文件等)

22、find(找到*文件存在路径)

三、vi编辑器的使用,使用比较熟练好像加“!”的都是强制执行的。

四、安装tftp服务器:

常用命令:*netstat –a | grep tftp 这里检测当前tftp的情况,在资料上是说检测安装情况,我觉得不是应该是检测启动情况,当然这个也是包括安装与否的,这里要注意!有的时候他是安装上的但是没有打开,查看配置文件是就会发现disable 默认是 = yes 意思是默认是关闭的我们有几种方法将他打开:

1、使用setup命令启动tftp

2、配置 #vi /etc/xinetd.d/tftp 中把disable中的yes改为no

3、使用命令启动 #/etc/init.d/xinetd start

五、安装NFS服务器: 这个功能是共享Linux与Linux之间文件的,后面开发ARM的时候联通内核与文件系统使用

六、安装samba服务器

首先是要配置samba服务器的配置文件位置在:#vi /etc/samba/smb.conf 在Share Definitions中添加 【root】

Comment

= Root Ditectories

Browseable

= yes

Writable

= yes

Path

= /

valid users

=

smb

valid users

=

MYDOMAIN%s 其中可以在【home】前在命令模式下输入“6yy”(复制这六行!)然后再输入“p”(粘贴)然后再修改,这样修改起来比较方便,也是绝大多数教程都使用的方法,其中要注意几点:

1、要是使用复制方法然后修改的话要注意看清楚Comment这行后面Root Ditectories 这行的Root是不要忘了修改【homes】中式Home而【root】中是Root切记!(这里自己在前一次安装的时候没有留意导致后面Samba 服务器不能使用!!)

2、smb 这是用户名这里引用一下教材的语言:添加用户,注意添加用户的用户与修改配置文件部分valid users = smb相同,如果smb用户存在则不需要添加!

配置完毕要重新启动samba服务器 #/etc/init.d/smb restart

最后在windows中运行即可。

七、Samba、NFS等PC与虚拟机的网络配置(重点)这里着重总结一下这次网络的配置,虚拟机的网络配置非常重要,即使Linux不需要上网可是他们之间的数据传送也是十分必要的,例如Vmtools这个工具,smb、NFS、tftp等,我在这里的网络配置花费了大量的时间研究,主要是samba服务器总不能配置成功,网上也有许多的方法不过讲的都很细许多功能的实现都比较抽象,我之所以总是没有成功在上面的几个方面上已经详细的解释了,这里不再次做总结,其中有几点与老师或查资料得到的几点信息在这里要总结一下:

1、在所有的服务器等联网活动之前一定要把网络通信配置好!在PC中首先要ipconfig一下查询一下PC机网络配置情况(ip、网关等)然后再在虚拟机中使用命令setup打开网络配置去掉自动分配IP选用静态ip然后将ip等项目输入进去,这里要输入的一共三项,后两项是相同的只有ip是需要改变的,切记要分配在同一个网段!这样才能实现局域网功能

2、我问了问教授Linux的一位老师他曾经因为更改了本地连接的IP导致虚拟机上的网络服务器不能用了,当更改回原来的ip才能使用,这里我并没有出现这种情况因为我在设置ip的时候使用的是动态分配地址的ip路由器,在设置完成后并没有出现服务器失效的情况所以我认为这里老师可能使用了某个ip绑定了吧。

八、Vmtools的安装使用

这个工具很好用在XP中安装比较方便,但在Linux中有点儿复杂,当然只是有点儿而已,使用Vmware自动下载就可以完成后Linux自动加载了一个cdrom里面就有一个vmtools的tar 解压包(有时需要自己加载)他在文件中找到安装文件安装即可。这里引用一下网络同仁的资源我觉得他写的吧、简单明了(http://www.teniu.cctl.h> void create_file(char *filename){ If(create(filename,0666)<0)

//创建文件函数判断创建是否成功 后面的是文件的权限:可读可写不可执行!

{ printf(“create file %s failure!n”,filename);

exit(EXIT_FAILURE);} Else { Printf(“create file %s success!”,filename);} }

Int main(int argc,char *argv[])// 这里的argc是程序参数个数(如ls –a 这就是两个参数,也就是说是两个字符串,而argv【】表示的是参数名字 argv【0】=ls argv【1】=-a 后面应该还有一个参数char *env 代表的是环境变量的字符串(各种路径)){

If(argc<2)

//判断文件是否符合要求,这个一般小于0就行 { Perror(“you haven’t input the filename,please try again!n”);

Exit(EXIT_FAILURE);//这个最后等于1 其实就是个return 1; } Create_file(argv[1]);Exit(EXIT_SUCCESS);

//这个最后等于0 其实就是个return 0;

}

十一、今天心得体会:错误与进步同在!正视错误,解决错误,取得进步!

第五篇:ARM嵌入式linux复习心得总结1

202_.10.9 Evo杨

ARM嵌入式linux复习心得总结1:

一、Linux定制安装:

从新安装配置了一遍Linux,我使用的是Vmware7.0安装RHEL5.5,对于Linux的安装主要是要选择定制安装也就是Vmware7.0(下面简称Vm)中新建虚拟机开始部分选择”Custom(advanced)”,因为这里我所使用的FTP、sumba等服务器是需要定制加上的一开始没有注意结果悲剧了…(以后一定要仔细的选择!),在next后面应该选择最后一个选项这样自定义的选项会更加多,同样可以选择定制安装的一些选项,在这里同样有个地方要注意:

1、最好使用默认的内存分配方式

2、*(重要)选择bridged networking 的网络连接方式(这里要注意,第一次安装的时候没有注意使用的是默认值也就是NET模式,最后在设置NFS和sumba服务器的时候(也可能是其他的操作错误)无法与PC机ping通讯这里花费了大量的时间研究!后面就是Linux系统的安装了,这里我使用的是图形化界面的安装(以前大一的时候用命令行安过一次自己英语太垃圾了,安了整整一上午…)

3、在最后配置的时候防火墙要禁用,因为这里防火墙会阻止一切自发的与本机联网的事件,在后面使用NFS以及sumba服务器的时候是不能打开的,第一次安装的时候吃过这方面的亏以后要注意!

4、禁用SELinux,这个也是与安全有关的,现在暂时禁用就可以了。

二、再次回顾了一下Linux的命令,这里比较熟悉,跟走路一样这里必须专业起来!总的来

说有一下几个命令必须灵活运用:

1、useradd(添加用户名,后面使用sumba服务器的时候需要用到,使用率较低)

2、passwd(添加用户密码,一般配合useradd使用,使用率较低)

3、su(切换用户,经常用)

4、shutdown(关机命令,用法有多种,我一般不用,虚拟机直接断电就行了)

5、cp(拷贝,不解释)

6、mv(移动或更名,不解释)

7、rm(删除,不解释)

8、mkdir(创建目录)

9、cd(改变工作目录,经常用)

10、pwd(显示当前目录)

11、ls(查看目录)

12、tar(针对tar.gz打包和解压,这里主要记住 tar cvzf * 和tar xvzf * 一个是压缩,一个是解压)

13、tar(针对tar打包和解压,这里主要记住 tar cvf * 和tar xvf * 一个是压缩,一个是解压)

14、unzip(解压zip文件)

15、chmod(更改权限)

16、df(查看磁盘使用情况)

17、ifconfig(查看网络配置、查看ip等)

18、netstat(查看网络状态)

19、grep(查找字符串,这个其实很重要,但自己总是忘记可能是一般不用的原因)

20、rpm(用于软件安装)

21、mount(挂载,很重要用语挂载CDROM、硬盘以及共享文件等)

22、find(找到*文件存在路径)

三、vi编辑器的使用,使用比较熟练好像加“!”的都是强制执行的。

四、安装tftp服务器:

常用命令:*netstat –a | greptftp这里检测当前tftp的情况,在资料上是说检测安装情况,我觉得不是应该是检测启动情况,当然这个也是包括安装与否的,这里要注意!有的时候他是安装上的但是没有打开,查看配置文件是就会发现disable 默认是 = yes 意思是默认是关闭的我们有几种方法将他打开:

1、使用setup命令启动tftp2、配置 #vi /etc/xinetd.d/tftp 中把disable中的yes改为no3、使用命令启动 #/etc/init.d/xinetd start

五、安装NFS服务器: 这个功能是共享Linux与Linux之间文件的,后面开发ARM的时候

联通内核与文件系统使用

六、安装samba服务器

首先是要配置samba服务器的配置文件位置在:#vi /etc/samba/smb.conf

在Share Definitions中添加

【root】

Comment=Root Ditectories

Browseable=yes

Writable=yes

Path=/

valid users=smb

valid users=MYDOMAIN%s

其中可以在【home】前在命令模式下输入“6yy”(复制这六行!)然后再输入“p”(粘贴)然后再修改,这样修改起来比较方便,也是绝大多数教程都使用的方法,其中要注意几点:

1、要是使用复制方法然后修改的话要注意看清楚Comment这行后面Root

Ditectories 这行的Root是不要忘了修改【homes】中式Home而【root】

中是Root切记!(这里自己在前一次安装的时候没有留意导致后面Samba

服务器不能使用!!)

2、smb 这是用户名这里引用一下教材的语言:添加用户,注意添加用户的用户与修改配置文件部分valid users = smb相同,如果smb用户存在则不

需要添加!

配置完毕要重新启动samba服务器 #/etc/init.d/smb restart

最后在windows中运行即可。

七、Samba、NFS等PC与虚拟机的网络配置(重点)

这里着重总结一下这次网络的配置,虚拟机的网络配置非常重要,即使Linux不需要上

网可是他们之间的数据传送也是十分必要的,例如Vmtools这个工具,smb、NFS、tftp等,我在这里的网络配置花费了大量的时间研究,主要是samba服务器总不能配置成功,网上也有许多的方法不过讲的都很细许多功能的实现都比较抽象,我之所以总是没有成功在上面的几个方面上已经详细的解释了,这里不再次做总结,其中有几点与老师或查资料得到的几点信息在这里要总结一下:

1、在所有的服务器等联网活动之前一定要把网络通信配置好!在PC中首先要ipconfig

一下查询一下PC机网络配置情况(ip、网关等)然后再在虚拟机中使用命令setup打开网络配置去掉自动分配IP选用静态ip然后将ip等项目输入进去,这里要输入的一共三项,后两项是相同的只有ip是需要改变的,切记要分配在同一个网段!这样才能实现局域网功能

2、我问了问教授Linux的一位老师他曾经因为更改了本地连接的IP导致虚拟机上的网

络服务器不能用了,当更改回原来的ip才能使用,这里我并没有出现这种情况因为我在设置ip的时候使用的是动态分配地址的ip路由器,在设置完成后并没有出现服务器失效的情况所以我认为这里老师可能使用了某个ip绑定了吧。

八、Vmtools的安装使用

这个工具很好用在XP中安装比较方便,但在Linux中有点儿复杂,当然只是有点

儿而已,使用Vmware自动下载就可以完成后Linux自动加载了一个cdrom里面就有一个vmtools的tar 解压包(有时需要自己加载)他在文件中找到安装文件安装即可。这里引用一下网络同仁的资源我觉得他写的吧、简单明了(http:///viewarticle.php?id=66813)

安装linux时,一定要安装gcc和kernel-source,VMware要对内核头文件进行编译。注:linux区分大小写,例如,用户名root和Root就是两个用户了。你想进入tmp目录,而你输入的是Tmp,嘿嘿,肯定是进不去的!

按下alt+f2,输入konsole 新建一个终端。

注:如果你不是以root用户登录,你不能安装程序。用su命令可以切换到root用户,不会用命令的话,注销后用root登录。

输入 /sbin/telinit

3用root登录,输入root的密码,如果你忘了,我只能同情你了。按下alt+ctrl把鼠标切出来,点击菜单上的“安装VMware-tools”。

回到虚拟机中,挂载cdrom。

mount /dev/cdrom /mnt/cdrom进入cdrom目录

cd /mnt/cdrom将光盘中的内容复制到tmp目录下

cp VM* /tmp/

注:*号是通配符。还有,输入单个命令时按Tab自动输入。

进入tmp目录

cd /tmp

解压缩.tar.gz文件

tar zvxf VMware*.tar.gz

屏幕哗哗的闪呀!进入解压后的vmware-tools-distrib目录

cd vmware-tools-distrib

执行安装文件

./vm*.pl

一路默认回答,皆按回车键。

以上都很顺利,很多人都卡在了这里,这个该死的目录怎么也找不到,why?是因为你没安装gcc或kernel-source,回本文开头去看吧!

配置你的x windows 设置。输入yes并按回车键。

选择你linux的显示屏幕大小。

Enioy!

最后显示的是VMware开发组的注记。要让他们知道中国有这么多用破解版的,他们就不这么写了。呵呵。

输入startx启动Xwindows

OK。

我就是参考这个文章安装完成的它使用的是红旗的Linux不过我在红帽的Linux5中同样使用顺利所以将此贴贴上便于以后参考!

九、Makefile

Makefile是个将多个文件链接编译的工具使用方法很简单假设有两个文件一个是main.c 一个是fun.c以及同文件 fun.h

建立Makefile文件输入:

main:main.o fun.ogcc main.o fun.o –o main main.o:main.c fun.hgcc –c main.c –o main.o fun.o:fun.c fun.hgcc –c fun.c –o fun.o clean:rm –f main *.o(这部分代码在make clean时执行!)从中可以看出编译的规律

目标:汇编文件…..gcc 汇编文件

1、汇编文件

2、…..–o 目标文件名(这里同编译一条代码时相同)

十、文件编程-文件创建

#include

#include

#include

#include

#include

void create_file(char *filename)

{

If(create(filename,0666)<0)//创建文件函数判断创建是否成功 后面的是文件的权限:可读可写不可执行!

{printf(“create file %s failure!n”,filename);exit(EXIT_FAILURE);

}

Else

{

Printf(“create file %s success!”,filename);

}

}

Int main(int argc,char *argv[])// 这里的argc是程序参数个数(如ls –a这就是两个参数,也就是说是两个字符串,而argv【】表示的是参数名字 argv【0】=lsargv【1】=-a后面应该还有一个参数char *env 代表的是环境变量的字符串(各种路径)){

If(argc<2)//判断文件是否符合要求,这个一般小于0就行 {Perror(“you haven’t input the filename,please try again!n”);Exit(EXIT_FAILURE);//这个最后等于1其实就是个return 1;

}

Create_file(argv[1]);

Exit(EXIT_SUCCESS);//这个最后等于0其实就是个return 0;

}

十一、今天心得体会:错误与进步同在!正视错误,解决错误,取得进步!

ARM9嵌入式复习总结
TOP