嵌入式系统.docx
《嵌入式系统.docx》由会员分享,可在线阅读,更多相关《嵌入式系统.docx(21页珍藏版)》请在冰豆网上搜索。
![嵌入式系统.docx](https://file1.bdocx.com/fileroot1/2023-4/19/be0e9d6a-4e34-4005-a4e3-7f78883f711c/be0e9d6a-4e34-4005-a4e3-7f78883f711c1.gif)
嵌入式系统
第二章
一.ARM处理器有什么特点?
ARM处理器的三大特点是:
耗电少功能强、16位/32位双指令集和合作伙伴众多。
1、体积小、低功耗、低成本、高性能;
2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
3、大量使用寄存器,指令执行速度更快;
4、大多数数据操作都在寄存器中完成;
5、寻址方式灵活简单,执行效率高;
6、指令长度固定。
二.ARM的那个寄存器作为PC使用?
哪个作为LR使用
ARM的寄存器,全部共有37个32位长的寄存器。
但ARM核心同时最多只可以有18个同时执行的寄存器:
包含了16个通用寄存器和2个状态寄存器,16个通用寄存器中包含了3个专用寄存器,R13、R14和R15。
R13用作堆栈指针SP
R15用做程序计数器PC,
R14用做子程序链接寄存器LR。
3.ARM有几种运行模式?
那些具有特权?
如何改变处理器的模式?
ARM有7中工作模式:
用户模式、快速中断模式、外部中断模式、管理模式、数据访问中止模式、未定义指令中止模式、系统模式。
除了用户模式以外,其余所有6种模式称之为特权模式,权限比用户模式高,其中特权模式中除去系统模式外的5种模式称之为异常模式,常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
处理器模式可以通过控制进行切换,也可以通过外部中断或异常处理过程进行切换。
大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受操作系统保护的系统,应用程序也不能直接进行处理器模式切换。
当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。
4.ARM有几种异常?
其异常处理方式和x86有什么不同?
1)复位(Reset)异常(管理模式);
2)未定义指令(undefined instruction)异常(未定义模式);
3)软件中断(SWI)异常(管理模式);
4)指令预取中止(Prefech Abort)异常(中止模式);
5)数据访问中止(Data Abort)(中止模式);
6)快速中断请求(FIQ)(FIQ模式);
7)外部中断请求(IRQ)(IRQ模式)。
机制一样:
申请中断、相应中断、中断处理、中断返回
由于硬件不一样,细节上有很大区别,比如ARM的中断向量表:
ARM:
VectorsLDRPC,Reset_Addr;0x00000000复位
LDRPC,Undef_Addr;0x00000004未定义异常
LDRPC,SWI_Addr;0x00000008软件中断
LDRPC,PAbt_Addr;0x0000000C预取指中止
LDRPC,DAbt_Addr;0x00000010数据中止
NOP;0x00000014保留;
LDRPC,IRQ_Addr
LDRPC,[PC,#-0x0FF0];0x00000018中断
LDRPC,FIQ_Addr;0x0000001C快速中断
X86:
偏移量与段地址结合的方式
5.试比较ARM和x86的I/O寻址方式有什么不同?
ARM:
立即数寻址:
操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也是称为立即数。
寄存器的值为操作数。
ARM指令普遍采用此种寻址方式。
寄存器偏移寻址:
寄存器偏移寻址是ARM指令集特有的寻址方式。
当第二作数是寄存器偏移方式时,第二寄存器操作数在与第一操作数结合之前,选择进行移位操作。
寄存器寻址:
第二操作数的移位位数可以用立即数方式或者寄存器方式给出。
寄存器间接寻址:
寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。
基址加偏址寻址:
将寄存器的值与指令中给出的偏移地址址量相加,所得结果作为操作数的物理地址。
堆栈寻址:
堆栈寻址用于数据栈与寄存器组之间批量数据传输。
当数据写好和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这个问题。
X86:
立即数寻址:
操作数包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。
寄存器寻址:
操作数存放在CUP的内部寄存器中。
直接寻址方式:
操作数的存储器中,指令中直接包含有操作数的有效地址,默认的段地址在DS段寄存器。
寄存器间接寻址:
操作数在存储器中,操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中。
可使用段超越前缀改变。
寄存器相对寻址:
操作数在存储器中,操作数有效地址是一个基址寄存器BX、BP或变址寄存器SI、DI的内容加上指令中给出的位置量之和。
相对基址变址寻址:
操作数在存储器中,操作数的有效地址由基址寄存器的内容与变址寄存器的内容及指令中位置量相加得到,可用段超越前缀改变。
6.若允许FIQ和IRQ中断,CPSR应该如何处置?
当允许IRQ中断时,CPSR【7】=0即CPSR的I位置为0.当允许FIQ中断时,CPSR【6】=0即CPSR的F位为0。
如果2个中断同时发生时,由于FIQ拥有最高中断优先级,而IRQ只有中等中断优先级,所以先执行FIQ中断(CPSR【7】=0),当中断结束后再执行IRQ中断(CPSR【6】=0)
FIQ:
CPSR[4:
0]=0B10001//进入FIQ模式
IRQ:
CPSR[4:
0]=0B10010//进入IRQ模式
CPSR[5]=0//在ARM状态执行
CPSR[6]=0//允许FIQ中断
CPSR[7]=0//允许IRQ中断
7.什么是ARM的E变种?
E变种增加一些附加指令用于增强处理器对一些典型的DSP算法的处理性能,主要包括以下指令。
·几条新的实现16位数据乘法和乘加操作的指令
·实现饱和的带符号数的加减法操作的指令。
·进行双字数据操作的指令,包括双字读取指令LDRD,双字写入指令STRD和协处理器的寄存器传输指令MCRR/MRRC。
·cache予取指令PLD。
E变种首先在ARM体系结构版本5T中使用,用字符E表示。
在ARM体系结构版本5以前的版本中,以及在非M变种和非T变种的版本中,E是无效的。
8.ARM的哪一种(或几种)模式使用的寄存器最少,使用的是哪些寄存器?
由上图可知用户模式和系统模式使用的寄存器最少,使用的有31个通用寄存器和一个状态寄存器,分别是:
未分组寄存器R0~R7;分组寄存器R8~R14;程序计数器R15;状态寄存器CPSR
9.R13通常用来存储什么?
通常用来作为堆栈指针
第三章
1.举例说明ARM的各种寻址方式(P61)
答:
1、立即寻址:
ADDR0,R0,#3
2、寄存器寻址:
ADDR0,R1,R2
3、寄存器间接寻址:
LERR0,[R1]
4、寄存器移位寻址:
ADDR3,R2,R1,LSL#2
5、基址变址寻址:
LDRR0,[R1,#-8]
6、多寄存器寻址:
LDMIAR0,{R1,R2,R3}
7、堆栈寻址:
LDMFDR13!
{R0,R4-R12,PC}
8、拷贝寻址:
LDMIAR0!
{R2-R9}
9、相对寻址:
BLNEXT
……
NEXT:
……
MOVPC,LR
2.R0和R1中有两个32位数,若R0>R1,则R0=R0-R1;若R0(1)请用CMP、B和SUB指令完成上述操作。
答:
CMPR0,R1
BLTLESS
BRTMORE
LESS:
SUBR1,R1,R0
BEQ
MORE:
SUBR0,R0,R1
BEQ
EQ:
END
或
AREAStrCopy,CODE,READONLY;程序起始定义
ENTRY;第一条指令的标识符
start
MOVR0,#5
MOVR1,#4
CMPR0,R1
BLTLess
BGTMore
Bstop
LessSUBR1,R1,R0
Bstop
MoreSUBR0,R0,R1
stop
END
(2)请用条件SUB指令完成上述操作。
答:
CMPR0,R1
SUBGTR0,R0,R1
SUBLTR1,R1,R0
或
AREAStrCopy,CODE,READONLY
ENTRY
start
MOVR0,#5
MOVR1,#4
CMPR0,R1
SUBLTR1,R1,R0
SUBGTR0,R0,R1
stop
END
3、用指令实现以下功能
答:
(1)R0=16
MOVR0,#16
(2)R1=R0X4
MULR1,R0,#4
(3)R0=R1/16
LSRR0,R1,#4
或MOVR0,R1,LSR#4
(4)R1=R2X7
MULR1,R2,#7
4、说明以下指令功能
答:
(1)、ADDSR0,R1,R1,LSL#2
将R1加上4倍的R1赋值给R0。
或R0=R1+R1*4; 并根据运算结果更新标志位
(2)、RSBR2,R1,#0
R2=0-R1,即将R1求反赋值给R2
5、下列指令序列完成什么功能?
答:
(1)ADDR0,R1,R1,,LSL#1
将R1加上左移一位后的R1并将结果赋值给R0。
(R0=R1+R1*2)
(2)SUBR0,R0,R1,LSL#4
将R0减去左移一位后的R1并将结果赋值给R0。
(R0=R0-R1x*16)
(3)ADDR0,R0,R1,LSL#7
将R0加上左移7位后的R1并将结果赋值给R0。
(R0=R0+R1*128)
第四章
1、在ARM汇编语言程序设计中,语句一般是由指令,伪操作、宏指令和伪指令组成的。
什么是伪操作、宏指令和伪指令呢?
它们与指令由什么不同呢?
各有什么优点?
答:
1)定义:
A.指令:
每一条指令都对应一种CPU操作。
B.伪操作又称为伪指令,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。
C.宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。
2)区别:
a.每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。
b.宏指令的作用是把一个复杂的或者是不直观的语句或是组合用一个简单的、易记的形式表示,当编译器遇到源程序中的宏时,就把它定义的内容原封不动的copy过来。
如果程序中使用100次宏,这段代码就被复制100次。
3)特点:
伪操作----成如数据定义、分配存储区、指示程序结束等功能;
宏指令-----简化程序代码的编写和提高程序的可读性。
2、对比说明ADR、ADRL与LDR的区别与联系。
(P353)
答:
1)定义:
1)ADR:
为小范围的地址读取伪指令,将基于PC相对偏移的地址值读取到寄存器中。
2)ADRL:
为中等范围的地址读取伪指令,将基于PC相对偏移的地址值读取到寄存器中。
3)LDR:
大范围的地址读取伪指令,用于加载32位的立即数或一个地址值到指定寄存器,在汇编编译源程序时,LDR伪指令被替换成一条合适的指令。
如加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该伪指令,否则汇编器将使用文字池。
2)区别:
1)ADR:
指令格式:
ADR{cond}register,expr
其中register加载的目标寄存器
expr为地址表达式,当地址值是非字对齐时,取值范围-255~255字节之间;当地址是字对齐是,取值范围-1020~1020字节之间。
2)ADRL:
指令格式
ADRL{cond}register,expr
其中register加载的目标寄存器
expr地址表达式,当地址值是非字对齐时,取值范围-64K~64K字节之间;当地址是字对齐时,取值范围-256K~256K字节之间。
3)LDR:
指令格式
LDR{cond}register,=[expr/label_expr]
其中register加载的目标寄存器
expr为32位的立即数;label_expr基于PC的地址表达式或外部表达式。
3)联系:
ADR、ADRL和LDR均为地址读取伪指令。
3、编写一个汇编程序,在ARM程序代码中调用Thumb子程序,并返回ARM程序完成其功能。
答:
CODE32;表明以下是ARM指令
--------
BLXTSUB1
-------
CODE16;表明以下是Thumb指令
TSUB1
-------
BXR14;转向ARM
或
AREAEXAMPLE,CODE,READONLY
ENTRY;程序入口处
CODE16;thumb代码
Thumb
ADDR1,R1,R0;R1=R1+R0
BXLR;返回到arm状态
CODE32;ARM代码
Start
MOVR0,#1;及时数1赋值给R0
MOVR1,#5;及时数5赋值给R1
ADRR3,Thumb+1;获取目标地址,末位1,
MOVLR,PC;保存返回地址
BXR3;切换到thumb状态
END
4、编一段C语言与汇编语言的混合代码,在C语言程序中调用汇编语言代码,完成字符STR1,STR2内容的转换。
答:
unsignedcharstr1='A';
unsignedcharstr2='B';
printf("%c",str1);
printf("%c",str2);
_asm//嵌入汇编代码
{
moval,str1//将str1的值赋给a1
xchgal,str2//交换al和str2的值,现str2=str1
movstr1,al//将a1的值赋给str1
}
printf("%c",str1);//输出
printf("%c",str2);//输出
getchar();
或
#include"stdio.h"
voidmain()
{
unsignedcharstr1='A';//定义字符串str1的内容为A
unsignedcharstr2='B';//定义字符串str2的内容为B
printf("str1和str2的初始值\n");
printf("%c",str1);//输出str1的值
printf("%c\n",str2);//输出str2的值
_asm//汇编交换子程序
{
moval,str1//将str1的值赋给a1
xchgal,str2//将a1的值与str2交换
movstr1,al//将a1的值赋给str1
}
printf("str1和str2交换后的值\n");
printf("%c",str1);//输出str1的值
printf("%c",str2);//输出str2的值
getchar();
}
或
Cfile.c
#include
externvoidstrcopy(char*d,constchar*s);
intmain()
{
constchar*srcstr="abcde";
chardststr[32];
printf("Beforecopying:
n");
printf("'%s'n'%s'n",srcstr,dststr);
strcopy(dststr,srcstr);
printf("Aftercopying:
n");
printf("'%s'n'%s'n",srcstr,dststr);
return0;
}
Asmfile.s
AREASCopy,CODE,READONLY
EXPORTstrcopy
strcopy
;r0pointstodestinationstring
;r1pointstosourcestring
LDRBr2,[r1],#1;loadbyteandupdateaddress
STRBr2,[r0],#1;storebyteandupdateaddress;
CMPr2,#0;checkforzeroterminator
BNEstrcopy;keepgoingifnot
MOVpc,lr;Return
END
这是一个c语言调用汇编的例子,功能是为了实现字符串的拷贝,其中汇编文件为字符串拷贝的功能子函数。
5、下列语句中,那些是无效的汇编语言指令?
并指出无效指令中的错误。
1)ABC:
MOVR1,R3
1)错“ABC:
”不能用“:
”号
2)Count:
LDRR0,#0X80
2)错Count大小写必需一致
3)LDMIAR5,{R1,R3,R4}
3)错Equ大小写必需一致
4)STARTLDRR0,=0x123456H
4)对
5)STARTLDRR0,=0x123456
5)对
6)对
或答:
(1)、
(2)(3)是错误的。
(4)(5)(6)是正确的。
其中
(1)中的冒号应去掉;
(2)中的“Count”与(3)中的“Equ”大小写应统一。
注意:
symbol必须顶格书写。
(ARM汇编其后不加“:
”)(GUN汇编要加“:
”)
symbol命名规则:
由字母,数字,下划线组成;除局部标号外,不能以数字开头。
指令不能顶格书写。
ARM指令,伪指令,伪操作,寄存器名可以全部为大写字母,也可全部为小写字母;不可大小写混用。
如果语句太长,可以将一条语句分几行来书写,在行末用“\”表示换行(即下一行与本行为同一语句)。
“\”后不能有任何字符,包含空格和制表符(Tab)。
6、试编写程序,实现计算2+4+6+8+…+2N的值。
答:
MOVR5,#0
MOVR3,#0
MOVR4,#0
LABLEEQU#0X2300000
MOVLABLE,#300
LKM
ADDR3,R3,#2
ADDR4,R4,R3
ADDR5,R5,#1
CMPR5,#LABLE
BLNELKM
END
或
AREAExample,CODE,READONLY
ENTRY;程序入口处
CODE32;ARM代码
START
MOVR0,#0;设定寄存器R0,R1,R2的值为0
MOVR1,#0;其中RO代表每次加的值
MOVR2,#0;R1代表每次计算的结果
csEQU100;设定累加次数为100
LJ
ADDR0,R0,#2;R0=R0+2
ADDR1,R1,R0;R1=R1+R0
ADDR2,R2,#1;R2=R2+1
CMPR2,#cs;比较R2和cs的值,达到一百时停止程序,否则跳转到LJ继续执行
BLNELJ
END
或
MOVR0,#0
LDRR1,=2N
MOVR2,#0
LOOPADDR0,R0,#2
ADDR2,R2,R0
CMPR1,R0
BNELOOP
第五章
1、简述S3C44B0X最小系统应包含哪些部分?
(书P130)
答:
一个最小嵌入式系统包括如下部分:
供电系统(电源)、时钟系统、调试测试接口、复位电路和存储器系统及嵌入式控制器。
2、S3C44B0X可使用的外部晶振频率范围是多少?
(使用/不使用PLL功能时)
答:
20MHZ~66MHZ
若不使用PLL功能,则晶振频率范围为20-66MHz都能工作,在使用PLL或ISP功能的时候,则须为30-55MHz才能工作,太低或太高都不能工作。
3、设一个基于S3C44B0X的系统使用的晶振为11.0592MHZ石英晶振,请计算出最大的系统时钟频率为多少MHZ?
此时PLL的M值和P值为多少?
答:
锁相环输出Fpllo与锁相环输入Fin的关系
S3C44B0X的PLL模块的输出时钟频率Fpllo和输入参考时钟频率Fin的关系由下式决定:
Fpllo=(mxFin)/(px2^s)
m=M+8,也就是分频器M的分配值+8
p=P+2,也就是分频器P的分频值+2
规定:
Fpllo大于20MHz,并且小于66MHz
又因为PLL的输入时钟是Fin=11.0592MHz,
要求PLL的输出时钟最大频率
则可以把PLLCON的三个分频系数字段值设为:
MDIV=66,即M分频系数为66
PDIV=6,即M分频系数为6
SDIV=1,即M分频系数为1
根据公式:
Fout=(m*fin)/(p*2^s)
得:
Fout=((66+8)*11059200)/((6+2)*2^1)=51148800=51MHz
所以PLL的输出时钟最大频率是Fout=51MHz
4、给出S3C44B0X与存储器SST39VF160、HY57V641620HG的连接方式,并说明存储器的地址在系统中如何映射?
书P153~157,P159~160
答:
(1)S3C44B0X自身不具有ROM,因此必须外接ROM来存储掉电后仍需要保存的代码和数据。
本系统采用SST39VF160闪速存储器(FLASHMemory)作为系统的ROM,此器件具有非易使性,可轻易擦写。
S3C44B0X与存储器SST39VF160的连接方式
(2)HY57V641620HG分成4个Bank;每个Bank的容量为1M×16位。
Bank的地址由BA1和BA0决定,00对应Bank0、01对应Bankl、10对应Bank2、 11对应Bank3。
在每个Bank中,分别用行地址脉冲选通RAS和列地址脉冲选通CAS进行寻址。
HY57V641620HG的行地址取地址线A0~A11位,即RA0~RA11;列地址取地址线低8位,即CA0~CA7。
SDRAM由S3C44B0X专用SDRAM片选信号nSCS0/nGCS6选通,地址空间为0x0C000000~0x0C7FFFFF。
S3C44B0X与存储器HY57V641620HG的连接方式
5.S3C44B0X的中断寄存器包括哪些?
采用外部中断方式触发设计3X3键盘,画出接口电路,并给出键盘扫描法。
答:
S3C44B0X的中断寄存器包括中断控制寄存器,;中断挂起寄存器;中断模式寄存器;中断屏蔽寄存器;IRQ从群优先级寄存器;IRQ主群优先级寄存器;当前IRQ从群优先级寄存器;当前IRQ主群优先级寄存器;IRQ中断服务挂起寄存器。