嵌入式考试考点总结.docx
《嵌入式考试考点总结.docx》由会员分享,可在线阅读,更多相关《嵌入式考试考点总结.docx(18页珍藏版)》请在冰豆网上搜索。
![嵌入式考试考点总结.docx](https://file1.bdocx.com/fileroot1/2023-5/29/aa8287a9-9455-444b-a5f5-b20f8f507210/aa8287a9-9455-444b-a5f5-b20f8f5072101.gif)
嵌入式考试考点总结
第一章
1.简述嵌入式系统的定义?
嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
2.简述的组成,并画出画出简图。
3.BSP全称是什么?
HAL全称是什么?
在嵌入式系统中起什么作用?
BSP全称是Boardsupportpackage,板极支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。
HAL全称是HardwareAbstractionLayer(硬件抽象层)是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。
4.嵌入式处理器有哪几类,试举例说明。
嵌入式微处理器,MPU
嵌入式微控制器,MCU
嵌入式数字信号处理器,DSP
嵌入式片上系统,SoC
嵌入式可编程片上系统,SoPC
第二章
1.简述ARM7TDMI的含义
T:
支持高密度16位的Thumb指令集
D:
支持片上调试
I:
支持EmbededICE观察硬件
M:
支持64位乘法
S:
ARM7TDMI的可综合(synthesizable)版本(软核)
2.什么是哈佛体系结构,什么是冯诺依曼体系结构,二者有什么不同?
ARM采用何种体系结构?
哈佛结构:
程序存储器与数据存储器分开,是两个相互独立的存储器,每个存储器独立编址,独立访问。
设置了程序总线和数据总线,使数据的吞吐率提高了一倍。
并行体系结构,取址和执行能完全重叠运行。
适合于数字信号处理。
大多数DSP都是哈佛结构。
冯·诺依曼理论:
数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
将数据与指令存储在同一存储器中,统一编址,依靠指令计数器提供的地址来区分是指令还是数据。
取指令和取数据都访问同一存储器,数据吞吐率低。
被大多数计算机采用。
ARM7—冯·诺依曼体系
ARM9是哈佛结构
3.什么是CISC,什么是RISC,二者有什么不同?
ARM是哪种类型?
CISC:
复杂指令集.具有大量的指令和寻址方式,指令长度可变。
8/2原则:
80%的程序只使用20%的指令。
大多数程序只使用少量的指令就能够运行。
RISC:
精简指令集(ReducedInstructionSetComputer)只包含最有用的指令,指令长度固定。
确保数据通道快速执行每一条指令。
使CPU硬件结构设计变得更为简单。
ARM处理器为RISC芯片,其简单的结构使ARM内核非常小,这使得器件的功耗也非常低。
4.若寄存器R1=0x01020304,分别按小端模式和大端模式存储在0x30000000字单元中,试分别列出两种模式下内存存储内容,并标出内存地址。
5.什么是Cache,简述其工作原理
Cache是高速缓存,它的工作原理是高速缓存是一种小型、快速的存储器,它保存部分主存内容的拷贝。
当CPU要读取一个数据时,首先从缓存中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
第三章
1.ARM处理器有几种工作模式?
各种工作模式分别有什么特点?
ARM7TDMI有7种处理器模式。
用户模式:
正常程序运行的工作模式,不能直接从用户模式切换到其它模式
系统模式:
用于支持操作系统的特权任务等,可以直接切换到其它模式
快中断模式:
用于快速中断处理,支持高速数据传输及通道处理,只有在FIQ异常响应时,才进入此模式。
中断模式:
用于通用中断处理,只有在IRQ异常响应时,才进入此模式。
管理模式:
供操作系统使用的一种保护模式,只有在系统复位和软件中断响应时,才进入此模式。
中止模式:
用于虚拟内存和/或存储器保护。
未定义模式:
支持软件仿真的硬件协处理器,只有在未定义指令异常响应时,才进入此模式。
2.简述ARM和Thumb状态的特点,及进入这两种状态的方式。
ARM指令集:
指令32位,效率高,代码密度低,所有ARM指令都是可以有条件执行的。
Thumb指令集:
指令16位,代码密度较高,Thumb指令仅有一条指令具备条件执行功能。
保持ARM的大多数性能上的优势,是ARM指令集的子集。
ARM与Thumb状态切换(BXRn)
进入Thumb状态:
当操作数寄存器的状态位Rn[0]为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。
此外,当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef等),则异常处理返回时,自动切换到Thumb状态。
进入ARM状态:
当操作数寄存器的状态位Rn[0]为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态。
此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
3.ARM处理器总共有多少个寄存器?
这些寄存器按其在编程中的功能如何进行划分(多少通用寄存器,多少状态寄存器)?
这些寄存在使用中各有何特殊之处(R13、R14、R15、CPSR、SPSR)?
ARM处理器共有37个32位寄存器寄存器,31个通用寄存器和6个状态寄存器。
它们不能在同一使劲同时被访问,对其的访问取决于处理器状态和处理器模式。
R13:
堆栈指针,用于保存堆栈的出入口处地址、保存待使用寄存器的内容
R14:
连接寄存器,当使用BL指令调用子程序时,返回地址将自动存入14中;当发生异常时,将R14对应的异常模式版本设置为异常返回地址;其他时候作为通用寄存器。
R15:
程序寄存器,总是指向正在“取指”的指令,在ARM状态下,R15的bit[1:
0]是无定义且必须被忽略的,而R15的bit[31:
2]含有程序计数值。
在Thumb状态下,R15的bit[0]是无定义且必须被忽略的,而R15的bit[31:
1]含有程序计数值。
CPSR:
为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。
每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
4.简述CPSR各部分的作用。
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通常不变。
Q位:
仅ARM5TE/J架构支持指示增强型DSP指令是否溢出
J位仅ARM5TE/J架构支持,J=1:
处理器处于Jazelle状态
中断禁止位包括I和F位:
当I位置位时,IRQ中断被禁止;当F位置位时,FIQ中断被禁止。
T位反映了正在操作的状态:
当T位为1时,处理器正在Thumb状态下运行;当T位清零时,处理器正在ARM状态下运行。
Mode位(处理器模式位):
0b10000User,0b10001FIQ,0b10010IRQ,0b10011Supervisor,0b10111Abort,0b11011Undefined,0b11111System
5.ARM处理器有几种异常,每种异常的产生会进入哪种模式?
(1)Arm微处理器支持7种工作模式,分别为:
(2)用户模式(Usr)用于正常执行程序;
(3)快速中断模式(FIQ)用于高速数据传输
(4)外部中断模式(IRQ)用于通常的中断处理
(5)管理模式(SVC)操作系统使用的保护模式(高权限),复位和软件中断进
数据访问终止模式(abt)当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护
(6)系统模式(sys)运行均有特权的操作系统任务
(7)未定义指令终止模式(und)用于支持硬件协处理器的软件仿真(浮点、微量运算)
其中除了用户模式以外,其余所有6种模式称之为非用户模式(特权模式,权限比用户模式高),
其中特权模式中除去系统模式外的5种模式称之为异常模式(在用户模式和系统模式看来这些都属于异常),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
6.试述ARM处理器对异常的响应过程。
1.在适当的LR中保存PC值,当异常入口来自:
ARM状态,那么ARM7TDMI将当前PC存到LR中;
为Thumb状态,那么ARM7TDMI将当前PC存到LR中;异常处理器程序不必确定状态。
2.将CPSR复制到适当的SPSR中;
3.将CPSR模式位强制设置为与异常类型相对应的值;
4.强制PC从相关的异常向量处取指。
ARM7TDMI内核在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。
注:
异常总是在ARM状态中进行处理。
当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。
7.如何从异常处理程序中返回?
当异常结束时,异常处理程序必须:
1.将LR(R14)中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;
2.将SPSR的值复制回CPSR;
3.清零在入口置位的中断禁止标志。
注:
恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。
8.简述ARM的基本指令格式,第二操作数的作用。
opcode:
指令助记符;cond:
执行条件;S:
是否影响CPSR寄存器的值;Rd:
目标寄存器;Rn:
第1个操作数的寄存器;operand2:
第2个操作数;
灵活的使用第2个操作数“operand2”能够提高代码效率。
它有如下的形式:
#immed_8r——常数表达式;该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。
Rm——寄存器方式;在寄存器方式下,操作数即为寄存器的数值。
Rm,shift——寄存器移位方式;将寄存器的移位结果作为操作数(移位操作不消耗额外的时间),但Rm值保持不变
9.简述ARM的条件执行。
10.ARM指令的寻址方式有几种,试分别叙述其各自的特点并举例说明。
1、寄存器寻址:
操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。
MOVR1,R2;将R2的值存入R1
2、立即寻址:
立即寻址指令中的操作码字段后面的地址码部分即是操作数本身
SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位
3、寄存器移位寻址:
寄存器移位寻址是ARM指令集特有的寻址方式。
当最后一个操作数是寄存器移位方式时,最后一个寄存器操作数在与前面操作数结合之前,选择进行移位操作。
MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即是R0=R2×8
4、寄存器间接寻址:
寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
LDRR1,[R2];将R2指向的存储单元的数据读出,保存在R1中
5、基址寻址:
基址寻址就是将基址寄存器的内容与指令中给出的偏移量(<4K)相加/减,形成操作数的有效地址。
基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。
LDRR2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容,放入R2
6、多寄存器寻址:
多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。
LDMIAR1!
{R2-R7,R12};将R1指向的单元中的数据读出到R2~R7、R12中(R1自动加4)
7、堆栈寻址:
堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。
堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。
存储器堆栈可分为两种:
向上生长:
向高地址方向生长,称为递增堆栈
向下生长:
向低地址方向生长,称为递减堆栈
寻址方式分类——堆栈寻址
LDMFDSP!
{R1-R7,LR};将数据出栈,放入R1~R7,LR这8个寄存器,同时SP自动更新。
8、块拷贝寻址:
多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。
STMIAR0!
{R1-R7};将R1~R7的数据保存到存储器中,存储指针R0在保存第一个值之后增加,增长方向为向上增长。
9、相对寻址:
相对寻址是基址寻址的一种变通。
由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
BLSUBR1;调用到SUBR1子程序
BEQLOOP;条件跳转到LOOP标号处
...
LOOPMOVR6,#1
...
SUBR1...
11.ARM的指令可以支持哪些种类的堆栈,对每种堆栈操作的指令有哪些
满递增堆栈(FA):
堆栈指针指向最后压入的数据,且由低地址向高地址生成。
满递减堆栈(FD):
堆栈指针指向最后压入的数据,且由高地址向低地址生成。
空递增堆栈(EA):
堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
空递减堆栈(ED):
堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
1.试实现128位的减法
AREABlock,CODE,READONLY
ENTRY
start
ldrr1,=num1
ldrr2,=num2
ldrr3,=result
ldrr4,[r1],#4
ldrr5,[r2],#4
subsr0,r4,r5
strr0,[r3],#4
ldrr4,[r1],#4
ldrr5,[r2],#4
sbcsr0,r4,r5
strr0,[r3],#4
ldrr4,[r1],#4
ldrr5,[r2],#4
sbcsr0,r4,r5
strr0,[r3],#4
ldrr4,[r1],#4
ldrr5,[r2],#4
sbcsr0,r4,r5
strr0,[r3],#4
MOVr0,#0x18;angel_SWIreason_ReportException
LDRr1,=0x20026;ADP_Stopped_ApplicationExit
SWI0x123456
AREABlockData,DATA,READWRITE
Num1DCD55,66,77,88
Num2DCD11,22,33,44
resultDCD0,0,0,0
END
2.试通过软件,使处理器切换到快中断模式
CPSR的Mode位(处理器模式位):
0b10001FIQ
3.试用跳转指令B(而非BL),实现对函数FUN1的调用
B指令,该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。
指令格式如下:
B{cond}FUN1
第四章
1.简述前后台、占先式、非占先式嵌入式操作系统的特点,分析响应中断时各自不同的处理方法
对最简单的应用的开发来说,应用程序一般是一个无限的循环,可称为前后台系统或超循环系统循环中调用相应的函数完成相应的操作,这部分可以看成后台行为,后台也可以叫做任务级。
中断服务程序处理异步事件,这部分可以看成前台行为,前台也叫中断级。
时间相关性很强的关键操作一定是靠中断服务程序来保证的。
中断是一种硬件机制,用于通知CPU有个异步事件发生了。
中断一旦被识别,CPU保存部分(或全部)上下文即部分或全部寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。
中断服务子程序做事件处理,处理完成后,程序回到:
1.在前后台系统中,程序回到后台程序;2.对非占先式内核而言,程序回到被中断了的任务;3.对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。
2.试分析无操作系统的嵌入式软件与有操作系统的嵌入式软件的异同
3.简述BootLoader的功能
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。
可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
在一个基于ARM7TDMIcore的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
4.简述嵌入式中间件的功能
嵌入式的中间件概念也是从软件上面移植过来的。
就层次方面来说,嵌入式的中间件是为了上次应用更好的开发,屏蔽底层硬件细节,便于升级和维护。
底层驱动和上层应用中间,除了操作系统自身的封装以外,人为的添加中间件,可以更好的划分模块之间的关系,有利于协作开发。
5.典型的嵌入式操作系统有哪些
PlamOS、WindowsCE、Vxworks、μC/OS-Ⅱ、Linux
6.嵌入式软件有哪些特点,可以分哪几类及各自特点?
4.任务间通信的方法有哪些
管道、信号量、消息队列、邮箱
第五章
第九章
1.简述S3C44B0的片上资源。
1.简述ARM汇编语言与C语言混合编程的基本规则
2.试分别用汇编中调用C程序,C程序中调用汇编程序,C程序中内嵌汇编语句,汇编中访问C程序变量实现a+b的加法程序
2,简述ARM的大端存储格式和小端存储格式,将0x12345678分别按照大端格式和小端格式保存于地址0x10000000
5试说明在异常处理时LR寄存器的使用方法,包括异常的入口和出口处理
1写一条ARM加法指令,完成操作R1=R2*17
ADDR1,R2,R2,LSL#4
2假设处理器工作在系统模式下,试写子程序,禁止IRQ中断(已知IRQ禁卫为CPSR的第7位)
3编写汇编程序以实现下列流程中所示功能
一种:
二种:
4采用S3C44B0x实现的矩阵键盘接口电路如下图所示,请画出运用行扫描法识别键盘闭合键的流程图,并写出相应的程序。
有关寄存器的说明如下:
(程序中分别用rPCONF,rPDATF,rPUPF表示PCONF,PDATF,PUPF寄存器的地址)
#include
#include
charReadKeyVal(void)
{
unsignedchari,j,H_val,L_val;
charkeyval=-1;
rPCONF=0x55;
rPUPF=0xff;
rPDATF=0xf0;
if((L_val=(rPDATF&0xf0))!
=0xf0)
{
H_val=0xfe;
for(i=0;i<4;i++)
{
rPDATF=H_val;
for(j=0;j<100;j++);
if((L_val=(rPDATF&0xf0))!
=0xf0)
{
L_val=((L_val>>4))|0xf0;
Keyval=get_val(H_val)*4+get_val(L_val);
returnkeyval;
}
else
H_val=(H_val<<1)|0x01;
}
}
returnkeyval;
}
charget_val(unsignedcharval)
{
unsignedcharI,x;
x=0;
for(i=0;i<4;i++)
{
if((~val)==1)returnx;
val=(val>>1)|0x80;
x=x+1;
}
}