1 / 24
文档名称:

南工大ARM嵌入式系统参考复习题.pdf

格式:pdf   大小:1,255KB   页数:24页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

南工大ARM嵌入式系统参考复习题.pdf

上传人:mama1 2023/3/27 文件大小:1.23 MB

下载得到文件列表

南工大ARM嵌入式系统参考复习题.pdf

文档介绍

文档介绍:该【南工大ARM嵌入式系统参考复习题 】是由【mama1】上传分享,文档一共【24】页,该文档可以免费在线阅读,需要了解更多关于【南工大ARM嵌入式系统参考复习题 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
精品文档
ARM嵌入式系统设计参考复****题(2017-11)
主要知识点:
第一章
:
“以应用为中心,以计算机技术为基础,软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求
的专用计算机系统”
根据应用的要求,沿着“体积小、低功耗、高可靠”方向发展,对运算速度、存储容量没有统一要求。三要素:嵌入、专用、计
算机。
?
一般由硬件层,中间层(HAL或BSP)和软件层组成。
粗略划分:嵌入式处理器、外围设备、嵌入式操作系统(可选)、嵌入式应用软件
稍细划分:嵌入式处理器、外围设备、驱动程序、嵌入式操作系统、应用接口、嵌入式应用软件
:①系统内核小②专用性强③系统精简④高实时性。
:
嵌入式微处理器(MPU):就是和通用计算机的处理器对应的CPU,可以认为是“增强型”通用微处理器。
嵌入式微控制器(MCU):就是将整个计算机系统的主要硬件集成到一块芯片中,芯片内部集成ROM/EPROM、RAM、
总线,总线逻辑、定时/计数器、Watchdog、I/O、串行口、A/D等各种必要功能和外设。
嵌入式DSP处理器(DSP):是专门用于信号处理方面的处理器,在系统结构和指令算法方面进行了特殊设计,具有很
高的编译效率和指令执行速度。
嵌入式片上系统(SOC):是追求产品系统最大包容的集成器件。绝大多数系统构件都在一个系统芯片内部。
第二章
:是AdvanceRISCMachine的缩写,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可
以认为是一种技术的名字。
“9TDMI”的含义:
9:采用版本为9的ARM微处理器T:支持16为压缩指令集Thumb,D:支持片上Debug,称为D变种
M:内嵌硬件乘法器Multiplier,称为M变种I:嵌入式ICE,支持片上断点和调试,称为I变种。
-A8处理器的三种工作状态:
ARM状态,处理器执行32位的字对齐的ARM指令;Thumb状态:处理器执行16位的半字对齐的Thumb指令和
ThumbEE状态:执行16位的半字对齐的Thumb指令集变种。
8种工作模式:用户模式(usr)、快速中断模式(fiq)、外部中断模式(irq)、管理模式(svc)、中止模式(abt)、未
定义模式(und)、系统模式(sys)和监控模式(mon)。特权模式:除usr之外的其它的7种工作模式都是特权模式。异
常模式:除usr和sys之外的其它的6种工作模式都是持权模式。
?各类有哪些寄存器?寄存器LR有什么用途?
分两类:33个通用寄存器和7个状态寄存器。
33个通用寄存器:R0~R15;R13_svc、R14_svc;R13_abt、R14_abt;R13_und、R14_und;R13_irq、R14_irq;
R8_fiq-R14_fiq、R13_mon、R14_mon;。7个状态寄存器:CPSR;SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、
SPSR_fiq和SPSR_mon。
LR(R14):也称作子程序链接寄存器或链接寄存器LR,当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)
的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、
R14_abt、R14_und和R14_mon用来保存R15的返回值。
:
N:正负号/大小标志位0表示:正数/大于;1表示:负数/小于Z:零标志位0表示:结果不为零;1表示:结果为零C:
进位/借位/移出位0表示:未进位/借位/移出0;1表示:进位/未借位/移出1V:溢出标志位0表示:结果未溢出;1表
.:.
精品文档
示:结果溢出I、I和F:irq和fiq中断允许和禁止控制位,=1禁止irq或fiq中断=0允许irq或fiq中断。T:控制(标
志)位——反映处理器的运行状态T=1时,程序运行于Thumb状态,T=0时,程序运行于ARM状态。
TM:控制位——决定了处理器的运行模式
模式TM[4:0]
用户10000
快中断10001
中断10010
管理10011
中止10111
未定义11011
系统11111
监控10110
(进入异常)执行哪些操作。
①保存返回地址、②保存当前状态寄存器CPSR的内容、③设置当前状态寄存器CPSR中的相应位、④转去执行中断处理程序。
第三章
“operand2”有哪些具体形式:三种:寄存器、寄存器移位、8位位图立即数。
,有基地址和偏倚地址两部分组成。(1)基地址可以是哪些寄存器?(2)偏移地址可以有哪些
形式?(3)总地址的计算方法有哪些?怎么表示?(4)变址寻址应用于哪些指令?
(1)基地址可以是通用寄存器R0---R15中的任意一个。
(2)偏移地址可以有三种形式:12位立即数、寄存器、寄存器移位。
(3)总地址的计算方法有三种:
前变址(前索引):先基址+偏址,生成操作数地址,做指令指定的操作。如:LDRRd,[Rn,#m]
后变址模式(修改基址寄存器):①基址寄存器不加偏移作为操作数地址。②完成指令操作后,用(基址+偏移)的值修改基址寄
存器。如:LDRRd,[Rn],#m
自动变址模式(修改基址寄存器):①先基址+偏移,生成操作数地址,做指令指定的操作。②然后自动修改基址寄存器。如:
LDRRd,[Rn,#m]!
(4)有4条指令:LDR、STR、LDM、STM
:立即寻址、寄存器寻址、寄存器间接寻址、变址寻址、多寄存器寻址、堆栈寻址、块拷贝寻址、相对寻

:ADR:小范围的地址读取伪指令、ADRL:中等范围的地址读取伪指令、LDR:大范围的地址读取伪指令、
NOP:空操作伪指令。
?各类有哪些指令(可以不考虑协处理器指令)。
五类:存器访问指令、数据处理指令、跳转指令、协处理器指令、杂项指令。
存储器访问指令:单存储器存取指令,多存储器存取指令。
数据处理指令:算术运算指令,逻辑运算指令,数据传送指令,比较指令,测试指令。
跳转指令:B跳转指令BL带链接的跳转指令BX带状态切换的跳转指令BLX带链接和状态切换的跳转指令。
杂项指令:程序状态寄存器操作指令,中断操作指令。
?各个条件码的符号及意义。(比较常用的应该会)。
条件码000000010010001101000**********
助记符EQNECS/HSCC/LOMIPLVSVC
含义相等不相等无符号数大于或等于无符号数小于负数非负数溢出没有溢出
标志Z=1Z=0C=1C=0N=1N=0V=1V=0
.:.
精品文档
1000
HI
无符号数大于
C=1且Z=0
1001
LS
无符号数小于或等于
C=0或Z=1
1010
GE
有符号数大于或等于
N=V
1011
LT
有符号数小于
N!=V
1100
GT
有符号数大于
Z=0且N=V
1101
LE
有符号数小于或等于
Z=1或N!=V
1110
AL
无条件执行
arm采用32位架构,基本数据类型4种,填空
Byte8位字节
HalfWord16半字2字节对齐
Word32字4
DoubleWord64双字8
内核工作模式,cortexa8,(课本8种)8种
usr
fiq
irq
svc特权模式
abt数据访问中止模式
und未定义指令中止模式
sys
mon监控模式,可在安全模式和非安全模式切换
.:.
精品文档
8个模式中,除用户模式usr,其他7个全部特权模式
7个特权模式中,除了系统模式,剩下6个都属于异常模式
异常模式:
快速中断请求模式(FIQ)用于高速数据传输
外部中断请求模式(IRQ)用于通常的中断处理
特权模式(SVC)
数据访问终止模式(abt)当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护
未定义指令中止模式(und)用于支持硬件协处理器的软件仿真
监控模式(mon)
Arm微处理器工作模式,分别为:
(Usr)用于正常执行程序
(FIQ)用于高速数据传输
(IRQ)用于通常的中断处理
(SVC)操作系统使用的保护模式(高权限),复位和软件中断进入
(abt)当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护
(sys)运行拥有特权的操作系统任务
(und)用于支持硬件协处理器的软件仿真(浮点、微量运算)
(mon),可在安全模式和非安全模式切换
异常模式优先级如下:
1(最高)SVC复位
2abt数据中止
3FIQ(快速中断请求)
4IRQ(外部中断请求)
5abt预取指令中止
6(最低)und未定义指令,SWI软件中断
.:.
精品文档
arm7为止使用流水线3级
取指令,从寄存器装载一条指令
译码为下一周期准备控制信号
执行处理指令,结果写会寄存器
arm9,五级流水线3级+缓冲/数据回写
arm106级流水线
寄存器R13用作数据栈指针,记作SP。
寄存器R14称为链接寄存器,记作LR,它用于保存子程序的返回地址。
寄存器R15是程序计数器,记作PC,不能用作其它用途。
CPSR当前程序状态寄存器理解CPSR格式,里面标志位含义等等
跳转指令,bl跳转32mb范围,跳转pc,如ldrbpc,...可以4GB范围
AAPCS标准子程序调用,用R0-R3存储参数,R0存返回值
I2C总线,通过串行数据线(SDA)和串行时钟线(SCL)在连接到总线的器件间传
递信息。传输时包含寻址和数据信息,每个字节8位,每个字节后必须跟一个响应位。
A_D转换结束的表达式是!(TSAADCCON0&(1<<15))
获取AD转换结果的表达式是(TSDATX0&0xfff)
LCD16M色的像素颜色的数据格式是怎样的4个字节,前3个字节分别为红,绿,蓝
三原色的色号。64K色的数据则用16位表示一个像素的颜色,三原色配比是5/6/5。
android操作系统的源码结构分为3个部分:
核心工程(CoreProject),扩展工程(ExternalProject),包(Package),应用程
序(Application)在package/apps目录中。
二、简答题:
1、Cortex-A8是ARMv7-A架构的,共有哪几种工作模式,其中哪几种属于异常模式?
usr用户模式
fiq快速中断模式
irq外部中断模式
svc特权模式
abt数据访问中止
und未定义指令中止模式
.:.
精品文档
sys系统模式
mon监控模式,安全模式切换
8种工作模式,除用户模式,都是特权模式
特权模式里面,除系统模式,其他都是异常模式。
即异常模式6种:
Fiq快速中断异常模式
Irq外部中断请求模式
svc特权模式
abt数据访问中止模式
und未定义指令中止模式
mon监控模式
,SPSR的功能各是什么?
CPSR(当前程序状态寄存器)在任何处理器模式下被访问。它包含了条件标志位、中断
禁止位、当前处理器模式标志以及其他的一些控制和状态位。中断时,保存当前程序状
态,处理器模式等等。
每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存
器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常
中断退出时,可以用SPSR来恢复CPSR
CPSR格式
CPSR格式如下所示。SPSR和CPSR格式相同。
31302928272676543210
NZCVQIT[1:0]JIFTM4M3M2M1M0
***条件标志位***
N——n=1表示运算结果为负数,n=0表示结果为正数或零。
z——z=1表示运算的结果为零;z=0表示运算的结果不为零。
C——进位,借位标志
V——V=1表示符号位溢出
J——ThumbEE状态位
M4-0模式位
3、简述S5PV210外部中断处理和响应的流程。
中断发生后,处理:
.:.
精品文档
通过堆栈和spsr寄存器,入栈保存现场,设置cpsr模式位,处理器模式变成外部中
断模式。外部中断中断发生后,VIC0IRQSTATUS相应位置改变,中断向量地址VIC0ADDRESS
相应位改变,,pc跳到向量表的特定地址,从该地址开始执行,跳转调用我们写的中断处理函
数,执行中断处理程序。
/**/
rVIC0INTENABLE|=(1<<16);
/**/
rVIC0INTSELECT|=(1<<16);//0为fiq模式,1irq
/*,强制转换提取
EINT16_31_IRQHandler函数地址*/
rVIC0VECTADDR16=(unsignedint)EINT16_31_IRQHandler;
voidEINT16_31_IRQHandler(void)
{。。。}
三、编程应用题:(阅读分析,加注释、填空与编程)
,传送到0x400800开始的区域。
解:MOVR0,#0x400000
LDRR1,=0x400800
MOVR7,#200
LP:LDRBR2,[R0],#1
STRBR2,[R1],#1
SUBSR7,R7,#1
BNELP
HERE:BHERE
,查找存储器从0x400000开始的100个字中为0的数目,将其结果存到0x400190中。
解:
MOVR0,#0x400000
MOVR1,#0
MOVR7,#100
LP:LDRR2,[R0],#4
CMPR2,#0
BNENEXT
ADDR1,R1,#1
NEXT:SUBSR7,R7,#1
BNELP
STRR1,[R0]
HERE:BHERE
.:.
精品文档
,实现1+2+…+100的运算。
MOVR2,#100
MOVR1,#0
LOOPADDR1,R1,R2;R1中为累加和
SUBSR2,R2,#1;R2控制循环
BNELOOP
}

汇编的为:
delay:
ldrr0,=0x6000000
temp:
subr0,r0,#1
cmpr0,#0
bnetemp
bxlr
上面程序参考c语言的写法
voiddelay()
{
volatileinti,j;
for(i=0;i<0x6000000;i++);
}

按k2按键,松手,led闪烁
#include""
#include""
#definerGPJ2CON*((volatileunsignedlong*)0xe0200280)
#definerGPJ2DAT*((volatileunsignedlong*)0xe0200284)
voidkey_init()
.:.
精品文档
{
rGPH2CON&=~(0xf<<0);//全部清0,设置输入模式,然后按键被按值变成0
}
voidled_init()
{
rGPJ2CON&=~(0xf<<0);
rGPJ2CON|=(0x1<<0);
rGPJ2DAT|=(0x1<<0);
}
voiddelay()
{
inti,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
intkeyled(void)
{
printf("按键灯测试\n");
key_init();
led_init();
while(1)
{
if(((rGPH2DAT&(0x1<<0))==0))//如果按键2按下,按键值0,
{
//printf("key2putdown!\n");delay();
if(((rGPH2DAT&(0x1<<0))==0))//重新判断消抖动影响
{
//printf("keyreallyputdown!\n");
while(!(rGPH2DAT&(0x1<<0)));//松手检测
rGPJ2DAT&=~(0x1<<0);//亮
delay();
rGPJ2DAT|=(0x1<<0);//led暗
}
}
}
return0;
}
ARM部分实验程序(仅供参考):
.:.
精品文档
<实验一>ARM开发平台使用入门
.equnum,2
.
.global_start
_start:
Reset_Handler:
movr0,#0;/*setupthethreeparameters*/
movr1,#3
movr2,#2
blarithfunc;/*callthefunction*/
stop:
bstop
;#********************************************************************************************
;#*AccordingR0valudetoexecutethecode
*
;#********************************************************************************************
arithfunc:;/*labelthefunction*/
cmpr0,#num;/*Treatfunctioncodeasunsignedinteger*/
bhsDoAdd;/*Ifcodeis>=2thendooperation0.*/
adrr3,JumpTable;/*Loadaddressofjumptable*/
ldrpc,[r3,r0,LSL#2];/*Jumptotheappropriateroutine*/
JumpTable:
.wordDoAdd
.wordDoSub
DoAdd:
addr0,r1,r2;/*Operation0,>1*/
bxlr;/*Return*/
.:.
精品文档
DoSub:
subr0,r1,r2;/*Operation1*/
bxlr
<实验二>GPIOLED接口控制实验(LED显示灯控制)
控制实验平台的发光二极管LED1,LED2,LED3,LED4,使它们有规律的点亮和熄灭,具体顺序如下:LED1亮->LED2
亮->LED3亮->LED4亮->LED1灭->LED2灭->LED3灭->LED4灭->全亮->全灭,如此反复。
/*******************************************************************************name:
*func:led_onturnontheledsonebyone
******************************************************************************/
voidled_on(void)
{
inti,nOut;nOut=0xF0;rGPFDAT=nOut&0x70;for(i=0;i<100000;i++);rGPFDAT=nOut&0x30;
for(i=0;i<100000;i++);rGPFDAT=nOut&0x10;for(i=0;i<100000;i++);rGPFDAT=nOut&0x00;
for(i=0;i<100000;i++);
}
/*******************************************************************************name:
*func:led_offturnofftheledsonebyone
******************************************************************************/
voidled_off(void)
{
inti,nOut;nOut=0;
rGPFDAT=0;for(i=0;i<100000;i++);rGPFDAT=nOut|0x80;for(i=0;i<100000;i++);rGPFDAT|=nOut
|0x40;for(i=0;i<100000;i++);rGPFDAT|=nOut|0x20;for(i=0;i<100000;i++);rGPFDAT|=nOut|0x10;
for(i=0;i<100000;i++);
}
/*******************************************************************************name:
*func:led_on_offturnonthe4ledsandthenturnoffthe4leds
******************************************************************************/voidled_on_off(void)
{
inti;rGPFDAT=0;for(i=0;i<100000;i++);rGPFDAT=0xF0;for(i=0;i<100000;i++);
.:.
精品文档
}
/*******************************************************************************name:
*func:led_testi/ocontroltest(led)
******************************************************************************/
voidled_test(void)
{
rGPFCON=0x11110000;2//PORTF7/6/5/4OUTPUT
uart_printf("\nI/O(DiodeLed)TestExample\n");led_on();led_off();led_on_off();delay(1000);
uart_printf("end.\n");
}
<实验三>LED数码管综合实验
#include""
#include""
#defineU8unsignedchar
unsignedcharseg7table[16]={
/*01234567*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
/*89ABCDEF*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
};
/*****************************************************************************
//Functionname:delay
//Description:延时子程序
//Returntype:void
//Argument:count,延时的数值
*****************************************************************************/
voiddelay(intcount)
{
intcnt;
for(count=count;count>0;count--)
for(cnt=0;cnt<1000;cnt++);
.:.
精品文档
}
voidGpio_init(){
=0x11111111;
=0xff;
=~0xff;
=|0x3;
}
intmain()
{
inttemp,i,j,lp,flag=0;
intsegN=0;
intsg[5];
uart_init();
printf("CVTS5PV210JtagKeyPadTest...\n");
Gpio_init();
flag=1;
while((flag!=0)&&(lp<6)){
for(j=0;j<lp;j++){
*((U8*)0x88007000)=~(0x01<<j);
*((U8*)0x88009000)=seg7table[sg[j]];
delay(30);
}
for(i=0;i<8;i++){
/**********************************************************
~7引脚输出高电平,~1将始终是高电平,~7设置成低电
平,那么,当按键按下时,~1的引脚将会变成低电平,由此判断按键
******************************************************************/
.:.
精品文档
=0xff;//~7引脚输出高电平
&=~(0x1<<i);//~7设置成低电平
delay(10);
temp=&0x3;
delay(10);
//~1的引脚将会变成低电平,由此判断按键
if(t