嵌入式系统习题部份汇总解读Word格式文档下载.docx
《嵌入式系统习题部份汇总解读Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统习题部份汇总解读Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
,{<
PC}
如果是异常处理后的返回,如IRQ中断返回又如何改写代码?
7、在修复产生数据中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行返回指令:
SUBSPCR14_abt,#8;
而预取中止时为:
SUBSPCR14_abt,#4
试解释减8原因?
而在预取中止中为什么减4?
答:
由于ARM为三级流水,执行段相对取指令段差为8,产生数据中止是在执行段结束点进入,此时PC值为数据中止指令地址+12,即保存当前PC到R14_abt为数据中止指令地址+12,因此在修复产生数据中止的原因后,返回地址应为数据中止指令地址下一条指令,处理程序都必须执行返回指令:
SUBSPCR14_abt,#8,才能实现其目的。
而在预取中止中时,出现中止异常是在执行段点,此时保存到R14_abt值为预取中止指令地址+8,因此要恢复到中止指令地址必为当前保存的R14_abt值减4,即执行SUBSPCR14_abt,#4操作,就可恢复到预取中止指令的下一条指令继续执行。
8、什么是小端存储?
什么是大端存储?
小端存储就是其存储格式为保存的字最低地址的字节看作是最低位字节,最高地址字节被看作是最高位字节。
因此,存储器系统字节0连接到数据线7-0。
大端存储就是其存储格式为将最高位字节保存在最低地址字节,最低位字节保存在最高地址字节。
因此存储器系统字节0连接到数据线31-24。
9、ARM7TDMI中T、D、M、I的含义是什么?
T表示具有高密度16位的Thumb指令机扩展功能;
D表示具有支持片上调试功能;
M表示具有64位乘法指令;
I表示增加了EmbededICE观察点硬件。
10、ARM7TDMI采用几级流水线?
使用何种存储器编址方式?
ARM7TDMI采用三级流水段,分别为取指段、译码段和执行段。
使用字节编址方式。
11、ARM处理器模式和ARM处理器状态有何区别?
ARM处理器模式是指用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。
每种模式都表明一种程序使用内部寄存器和一些片内外的硬件设备权利。
而ARM处理器状态是指Thumb状态和ARM状态,即程序指令的执行译码按16位Thumb指令集还是按32位ARM指令集译码执行。
12、分别列举ARM的处理器模式和状态。
ARM处理器模式分别是用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。
ARM处理器状态是指16位Thumb指令集运行的Thumb状态和32位ARM指令集运行的ARM状态。
13、PC和LR分别使用哪个寄存器?
PC使用R15;
LR使用R14。
14、R13寄存器的通用功能是什么?
R13寄存器在ARM状态时,可用作通用寄存器功能,但通常为堆栈指针SP,但在Thumb状态时,其压栈PUSH和弹栈POP指令都要用到R13(SP)。
15、CPSR寄存器中哪些位用来定义处理器状态?
在CPSR寄存器中b5位T定义处理器状态,T=0为ARM状态,T=1为Thumb状态。
16、ARM和Thumb指令的边界对齐有何不同?
ARM指令长度为32位,其边界对齐存取地址位都是按b[1:
0]=00方式进行,而Thumb指令长度为16位,其边界对齐存取地址位都是按b[0]=0方式进行。
17、描述一下如何禁止IRQ和FIQ的中断?
对CPSR中的b7(I位)和b6(F位)标志位置位时,可分别来禁止IRQ和FIQ中断。
18、定义R0=0x12345678,假设使用存储指令将R0的值存放在0x4000单元中。
如果存储器格式为大端格式,请写出在执行加载指令将存储器0x4000单元的内容取出存放到R2寄存器操作后得R2的值;
如果存储器格式改为小端格式,所得的R2值又为多少?
低地址0x4000单元的字节内容分别是多少?
按大端格式和小端格式存储,从存储器中读出的值是不变的,R2=0x12345678。
按大端格式从0x4000单元读出的值为0x12,按小端格式从0x4000单元读出的值为0x78。
19、请描述进入内核时异常操作步骤?
答:
1)在LR中保存下一条指令的地址;
2)将CPSR复制到适当的SPSR;
3)根据异常将CPSR模式强制设为某一值;
4)强制PC从相关的异常处取指。
5)异常结束时,异常处理程序必须将LR中的值减去偏移量后移入PC。
6)将SPSR的值复制回CPSR。
7)清零在入口置位的中断禁止标志。
20、请描述一下ARM7TDMI产生异常的条件分别是什么?
各种异常会使处理器进入哪种模式?
进入异常时内核有何操作?
各种异常的返回指令又是什么?
ARM7TDMI产生异常:
异常条件模式返回指令
快速中断请求快中断模式SUBSPC,R14_fiq,#4
中断请求中断模式SUBSPC,R14_irq,#4
预取中止请求中止模式SUBSPC,R14_abt,#4
数据中止请求中止模式SUBSPC,R14_abt,#8
未定义指令中断请求未定义指令模式MOVSPC,R14_und
软件中断请求管理模式MOVSPC,R14_svc
进入内核时异常操作是:
1)将LR中保存下一条指令的地址;
21、简单描述一下ARM7的三级流水线,并说明其对程序设计的影响。
ARM7的三级流水分为取指段、分析段和执行段。
对程序设计的影响:
提高指令执行的速度,并使处理和存储系统连续操作。
ARMThumb
PCPC取指
PC-4PC-2译码
PC-8PC-4执行
由此看出,它对子程序调用返回、异常恢复返回,LR值需减一个常数值作为返回地址。
22、ARM7TDMI(-S)有几种寻址方式?
LDRR1,[R0,#0x08]属于哪种寻址方式?
有8种,分别是:
寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、基址寻址、(多寄存器寻址、块拷贝寻址)、堆栈寻址、相对寻址。
其中:
LDRR1,[R0,#0x08]属于基址寻址。
23、ARM指令的条件码有多少个?
默认条件码是什么?
ARM指令的条件码有16个,默认条件码是:
AL编码为1110即无条件执行。
24、ARM指令中第二个操作数有哪几种形式?
列举5个8位图立即数。
ARM指令中第2个操作数有3种形式:
1)#immed_8r常数表达式;
2)Rm寄存器方式;
3)Rm,shift寄存器移位方式。
例如:
0x3FC、0、0xF0000000、200、0xF0000001。
25、将ARM指令中,使用第2个操作数时,第2操作数的形式可为常数表达式#immed_8r,这种常数的合理表达方式是什么?
这种常数须对应8位位图数据的循环移位偶数位得到的任何32位数据。
26、将ARM指令中,使用第2个操作数时,第2操作数的形式可为常数表达式#immed_8r,请说明下面常数哪些合理,哪些非法?
0x3FC,0x1F,0x1FE,0,0xF0000000,511,0xFFFF,0x1010,0xF0000010,200,0xF0000001,0x12800000,0x4000003B,0x0016C000
合法常量:
0x3FC/0/0xF0000000/200/0xF0000001/0x1F,0x12800000,0x4000003B,0x0016C000;
非法常量:
0x1FE/511/0xFFFF/0x1010/0xF0000010。
27、将比较两个值大小,并进行相应加1处理,C代码为:
if(a>
b)a++;
elseb++;
写出对应的ARM指令程序(其中设R0为a,R1为b)?
CMPR0,R1
ADDHIR0,R0,#1;
若R0>
R1,则R0=R0+1
ADDLSR1,R1,#1;
若R0≤R1,则R1=R1+1
28、将C代码:
if((a!
=10)&
&
(b!
=20))a=a+b转化为ARM指令程序?
CMPR0,#10;
比较R0是否为10
CMPNER1,#20;
若R0不为10,则比较R1是否为20
CMPNER0,R0,R1;
若R0不为10且R1不为20,指令执行,R0=R0+R1
29、LDR/STR指令的偏移形式有哪4种?
LDRB和LDRSB有何区别?
LDR/STR指令的偏移形式有:
1)零偏移;
2)前索引偏移;
3)程序相对偏移;
4)后索引偏移。
LDRB仅为无符号字节数据装载,其装载后的高24位为0,而LDRSB为有符号字节数据装载,高24位为符号位的扩展。
30、请指出MOV指令与LDR加载指令的区别及用途。
MOV指令是数据处理过程中的操作,可以传递立即数和寄存器到另一个寄存器的操作,而LDR加载指令用于将存储器单元数据装载到寄存器的操作。
31、CMP指令的操作是什么?
写一个程序,判断R1的值是否大于0x30,是则将R1减去0x30。
CMP指令操作是比较操作;
判断R1的值是否大于0x30,是则将R1减去0x30程序如下:
CMPR1,#0x30
SUBGTR1,R1,#0x30
Or
SUBHIR1,R1,#0x30
32、调用子程序是用B还是用BL指令?
请写出返回子程序的指令?
调用子程序是用BL指令。
返回子程序的指令:
BLlable
MOVPC,LR
33、LDR伪指令用途?
其指令格式与LDR装载指令的差别?
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器,映射真正指令类型由编译程序决定;
LDR伪指令指令格式为LDRRn,=expr,LDR加载指令为LDRRn,[地址值]。
34、ARM状态与Thumb状态的切换指令是什么?
请举例说明。
ARM状态与Thumb状态的切换指令是BXRm。
ARM_CODEADRR0,THUMB_CODE+1
CODE16
THUMB_CODEMOVR0,#10
MOVR1,#20
ADDR0,R1
BTHUM_CODE
END
35、Thumb状态与ARM状态的寄存器有区别吗?
Thumb指令对哪些寄存器访问受到一定限制?
Thumb状态与ARM状态的寄存器本身并无区别,都是32位寄存器。
但Thumb指令仅对R8-R15受到一定限。
36、Thumb指令集的堆栈入栈、出栈指令是哪两条?
压栈指令:
PUSH{reglist[,LR]};
弹栈指令:
POP{reglist[,PC]}
37、Thumb指令集的BL指令转移范围为何能达到±
4MB?
其指令编码是怎样的?
Thumb指令集的BL采用2条这样的指令组合成22位半字偏移(符号扩展为32位),使指令转移范围为±
4MB。
其指令编码为:
1111+H+offset11共16位。
其中H为1位,offset11为了11位。
38、在中断向量中转移指令为什么没有用B指令?
而是用什么指令实现跳转的?
在中断向量中转移指令没有用B指令是由于B指令转移范围仅在±
32MB内,因此满足不了中断向量的全地址范围内的转移。
实际中断向量中转移指令是用LDRPC,addr,和文字池(DCD伪指令)来实现的,它可以实现4GB范围内跳转。
39、LPC2114可使用的外部晶振频率范围是多少(使用/不使用PLL功能时)?
使用PLL功能时,外部晶振频率范围为10-25MHZ;
不使用PLL功能时为1-30MHZ。
在复位时。
40、描述一下LPC2210的P0.14、P1.20、P1.26、BOOT1和BOOT0引脚在芯片复位时分别有什么作用?
并简单说明LPC2000系列ARM7微控制器的复位处理流程。
LPC2210的P0.14决定外部复位后是否进入ISP状态,如为低电平则进入ISP状态。
P1.20决定复位后是否使用P1.16-P1.25作为跟踪端口进行跟踪同步。
P1.26决定复位后是否使用P1.31-P1.26作为调试端口。
BOOT1和BOOT0引脚在芯片复位时决定复位后存储器的来源以及存储器的宽度。
LPC2000系列ARM7微控制器的复位处理流程:
流程略(见书P119、120)。
41、LPC2000系列ARM7微控制器对向量表有何要求(向量表中的保留字)?
LPC2000系列ARM7微控制器要求:
在向量表中所有32个32位指令二进制编码的向量按有符合数据累加之和为0,这时向量表才有效,且芯片复位后,能脱机独立运行。
因此向量表中的保留字是配置数据累加和为0而留着的。
42、如何启动LPC2000系列ARM7微控制器的ISP功能?
相关电路应该如何设计?
微控制器在复位后可能有多种初始状态,决定于引脚状态和只读存储器的数据。
当有外部复位信号~Reset,P0.14低电平时,进入ISP状态,当P0.14为高电平时,同时BOOT0和BOOT1为高电平时,进入ISP状态。
相关电路应该为:
43、LPC2000系列ARM7微控制器片内Flash是多少位宽度的接口?
它是通过哪个功能模块来提高Flash的访问速度?
LPC2000系列ARM7微控制器片内Flash是128位宽度的接口,是通过数据缓冲模块、预取缓冲模块、分支跟踪缓存模块、两Flash存储模块来提高Flash的访问速度。
44、LPC2210的BANK0存储块使用32位总线,访问BANK0时,地址线A1、A0是否有效?
EMC模块中的BLS0—BLS3具有什么功能?
如果存储器组配置成32位宽度,地址线A0和A1无用,这是由于地址位的增减与存储器数据增减同步,此时A0和A1可作为GPIO使用(由PINSEL2设置)。
EMC模块中的BLS0—BLS3具有字节定位的选择信号功能,当BLS0为低时,存取定位到低8位字节上,当BLS1为低时,存取定位次到低8位字节上,当BLS2为低时,存取定位到次高字节,当BLS3为低时,存取定位到高位字节上。
45、如果存储器组配置寄存器中RBLE位置1,表示按字节区分存储器组,现有程序:
LDRR0,=0x80000001
movR1,0x55
STRR1,[R0]
请问执行STR指令后,存储器地址线上的地址应为0x80000000,数据线的前16位数据中,低8位为无效,高8位为0x55。
EMC模块中的引脚线BLS0和BLS1电平分别为高电平和低电平。
(填高低电平)
46、在startup.s启动代码中,设置异常向量表时,IRQ入口处为什么放置
LDRPC,[PC,#-0x0ff0]指令而非LDRPC,IRQ_Addr。
这是由于LDRPC,IRQ_Addr指令不能提供灵活的转移地址,在处理时就要耗费大量的时间解决IRQ转移分类问题。
而LDRPC,[PC,#-0ff0]指令转移地址来源于完部的VICVectAddr寄存器保存的地址值。
不同的中断异常,其VICVectAddr的值不同,可通过初始配置,节省了软件的转移选择开销。
47、在startup.s启动代码中,设置异常向量表时,IRQ入口处放置
LDRPC,[PC,#-0x0ff0]指令中PC-0x0FF0地址单元是指向VICVectAddr寄存器的地址。
48、BOOT0和BOOT1与BCFG0[29:
28]的关系和区别是什么?
Bank0用于引导程序运行,BCFG0[29:
28]的复位值与BOOT0和BOOT1设定有关。
BOOT0和BOOT1与BCFG0[29:
28]的关系:
Bank复位时BOOT[1:
0]的状态BCFG[29:
28]存储器宽度
0LL008位
0LH0116位
0HL1032位
0HH1032位
1xx1032位
2xx0116位
3xx008位
而对Bank1、Bank2和Bank3而言,BCFG[29:
28]决定存储器宽度,与BOOT[1:
0]设定无关。
对Bank0而言,BCFG[29:
28]的复位值由BOOT[1:
0]设定决定,且存储器宽度也由BOOT[1:
0]决定。
49、请问引脚连接模块选择寄存器有哪些?
请举一个例子说明选择寄存器的功能?
引脚连接模块选择寄存器有PINSEL0、PINSEL1和PINSEL2。
如设定:
PINSEL0&
=0x00000001;
则选择P0.0脚,功能为TxD(UART0)。
50、启动代码中总线引脚设置为:
ResetInitLDRR0,=PINSEL2
IF:
DEF:
EN_CRP
LDRR1,=0x0f814910
ELSE
LDRR1,=0x0f814914
ENDIF
STRR1,[R0]
……
分析每条代码的含义,并说明PINSEL2配置0x0f814910和配置0x0f814914的区别?
程序清单中,当预定义有EN_CRP宏时,将会编译程序清单LDRR1,=0x0f814910语句,并将PINSEL2寄存器设置为0x0f814910,否则编译LDRR1,=0x0f814914语句,并将PINSEL2寄存器设置为0x0f814914。
区别:
前一种执行禁止使用JTAG口调试,起到加密作用。
后一种使用JTAG口调试。
51、LPC2000系列ARM7微控制器具有引脚功能复用特性,那么如何设置某个引脚为指定功能?
例如通过设置PINSEL0[1:
0]=00时,引脚为GPIO功能;
设置为01时,引脚为UART0的TxD功能。
设置为10时,引脚为PWM1功能脚。
52、设置引脚为GPIO功能时,如何控制某个引脚单独输入/输出?
当需要知道某个引脚当前的输出状态时,是读取IOPIN寄存器还是读取IOSET寄存器?
设置引脚为GPIO功能时,控制某个引脚单独输入/输出是用IODIR方向控制寄存器控制,寄存器中每位对应控制着I/O位,如IODIR[0]对应px.0脚,IODIR[31]对应px.31脚,写入1时对应引脚作为输出功能,写入0时作为输入功能。
当需要知道某个引脚当前的输出状态时,是读取IOPIN寄存器。
53、P0.2和P0.3口是I2C接口,当设置它们为GPIO时,是否需要外接上拉电阻才能输出高电平?
需要外接上拉电阻1-10KΩ,这是因此I2C接口两根线都开漏输出。
54、使用SPI主模式时,SSEL引脚是否可以作为GPIO?
若不能,SSEL引脚应如何处理?
使用SPI主模式时,SSEL引脚不可以作为GPIO,对SSEL引脚的处理,使用SPI主模式时,必须选择相应的引脚用作SSEL功能并使其保持高电平。
55、LPC2114的两个UART是符合什么标准?
哪一个UART可用ISP通信?
哪一个UART具有MODEM接口?
必须符合16C550工业标准;
UART0可用ISP通信,UART1具有MODEM接口功能。
56、LPC2114具有几个32位定时器?
PWM定时器是否可以作通用定时器使用?
LPC2114具有2个32位定时器,定时器0和定时器1,PWM定时器是专用定时器,不可作通用定时器使用。
57、LPC2000系列ARM7微控制器具有哪两种低耗模式?
如何降低系统的功耗?
LPC2000系列ARM7微控制器具空闲模式和掉电模式的低耗模式。
在空闲模式下,处理器、存储器系统和相关控制器以及内部总线不再消耗功率,但外设继续保持并可产生中断使处理器恢复运行。
在掉电模式下,振荡器关闭,芯片没有任何内部时钟,处理器状态和寄存器、外设寄存器以及内部SRAM值在掉电模式下被保持。
芯片的逻辑电平保持静态。
复位或特定的不需要时钟仍能工作的中断可终止掉模式,并使芯片恢复正常运行。
58、有符号和无符号加法
下面给出A和B的值,可先手动计算A+B,并预测N、Z、V和C标志位的值。
其中(A,B)值分别为(0xFFFF000F,0x0000FFF1)或(0x7FFFFFFF,0x02345678)或(67654321、23110000),将三组用分别用LDR伪指令向寄存器(R0,R1)附值。
其程序如下:
STARTLDRR0,=A
LDRR1,=B
LOOPBLADD_SUB
BLOOP
ADD_SUBADDSR0,R0,R1
END
试判断如果A和B为有符号数时,计算结果和标志位的状态?
如果为无符号数时,计算结果和标志的状态?
0xFFFF000F0x7FFFFFFF67654321A
+0x0000FFF10x0234567823110000B
结果:
0x1000000000x8234567790764321
N=0;
Z=1;
V=0;
C=1N=1;
Z=0;
V=1;
C=0N=0