ARM嵌入式体系结构与接口技术CortexA9版习题答案.docx
- 文档编号:6686295
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:27
- 大小:30.14KB
ARM嵌入式体系结构与接口技术CortexA9版习题答案.docx
《ARM嵌入式体系结构与接口技术CortexA9版习题答案.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式体系结构与接口技术CortexA9版习题答案.docx(27页珍藏版)》请在冰豆网上搜索。
ARM嵌入式体系结构与接口技术CortexA9版习题答案
第一章
1.简述ARM可以工作的几种模式。
答:
ARMv7-A架构处理器共有8种工作模式,即用户模式(User)、快速中断模式(FIQ)、外部中断模式(IRQ)、特权模式(Supervisor)、数据访问中止模式(Abort)、未定义指令中止模式(Undef)、系统模式(System)、监控模式(Monitor)
2.ARM 核有多少个寄存器?
答:
ARM处理器有40个32位长的寄存器
3.什么寄存器用于存储PC和LR寄存器?
答:
R15和R14寄存器
4.R13通常用来存储什么?
答:
R13通常用来存储堆栈指针
5.哪种模式使用的寄存器最少?
答:
用户模式(User)和系统模式(System),因为这两种模式下没有SPSR寄存器
6.CPSR的哪一位反映了处理器的状态?
答:
T位是处理器的状态控制位
第二章
1.熟悉Eclipse开发环境。
答:
略,参照第2.3节
2.新建一个工程,编写一个汇编程序实现3+13=16的操作。
答:
略,参照第2.6节
第三章
1.用ARM 汇编实现下面列出的操作。
R0=15
R0=R1/16(有符号数)
R1=R2*3
R0=−R0
答:
R0=15 --MOVR0,#15
ﻩR0=R1/16 -- MOVR0,R1,ASR#4
BICR0,R0,#0x78000000
R1=R2*3--MOVR3,#3
MULR1,R2,R3
R0=−R0ﻩ-- MOVR1,#-1
ﻩﻩﻩ MOVR2,R0
MUL R0,R1,R2
2.BIC指令的作用是什么?
ﻩ答:
将一个寄存器中的某一位或者某几位清零
3.执行SWI 指令时会发生什么情况?
ﻩ答:
执行SWI指令时ARM处理器会自动将CPSR拷贝到SVC模式下的SPSR,然后修改CPSR寄存器的T位使处理器进入ARM状态,修改CPSR寄存器的低五位模式位使处理器进入SVC模式,修改CPSR寄存器的I位禁止IRQ中断,保存当前SWI指令下一条指令的地址到SVC模式下的LR寄存器,然后PC的值改为异常向量表中偏移地址为0x08的地址。
4.B、BL、BX指令的区别有哪些?
答:
B与BL都可以使程序跳转到指定的地址(label)处执行程序
B跳转指令 ﻩﻩpc←label
BL 带返回的连接跳转pc←label,同时将BL下一条指令地址保存到LR
BX使程序跳转到指令中<Rm>指定的地址执行程序,并将
BX 跳转并切换状态 pc←Rm&0xfffffffe,T←Rm[0]
5.下面哪个数据可以作为数据操作指令的有效立即数?
0x101 0x1f80xf000000f 0x08000012 0x104
答:
0x1f8、0xf000000f、0x104
6.ARM在哪些工作模式下可以修改CPSR 寄存器?
答:
特权模式下才能修改CPSR寄存器,即快速中断模式(FIQ)、外部中断模式(IRQ)、特权模式(Supervisor)、数据访问中止模式(Abort)、未定义指令中止模式(Undef)、系统模式(System)、(Cortex-A系列)监控模式(Monitor)
7.写一个程序,如果R0的值大于0x50,则将 R1 的值减去0x10,并把结果送给R0。
ﻩ答:
CMPR0,#0x50
ﻩSUBGT R0,R1,#0x10
8.编写一段ARM汇编程序,实现数据块复制,将R0指向的8个字的连续数据保存到R1指向的一段连续的内存单元中。
ﻩ答:
LDMIAR0!
,{R2-R9}
STMIA R1!
{R2-R9}
第四章
1.在ARM 汇编中如何定义一个全局的数字变量?
答:
使用.global伪操作
ﻩ语法格式:
.global 全局变量名并且被初始化为0
2.ADR和 LDR的用法有什么区别?
答:
ADR伪指令的功能是把标签所在的地址加载到寄存器中
LDR伪指令用于装载一个32位的常数或地址到寄存器中
3.AAPCS 中规定的ARM寄存器的使用规则是什么?
答:
AAPCS中定义了ARM寄存器使用规则如下。
(1)在进行子函数调用时,当子函数中有参数时,子程序间通过寄存器R0、R1、
R2、R3来传递参数,如果参数多于4个,则多出的部分用堆栈传递,被调用的子程序在返回前无须恢复寄存器R0~R3 的内容。
(2)在子程序中,使用寄存器R4~R11来保存局部变量。
如果在子程序中使用到了R4~R11中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。
在Thumb程序中,通常只能使用寄存器R4~R7 来保存局部变量。
(3)寄存器 R12用作子程序间scratch寄存器(用于保存 SP,在函数返回时使用
该寄存器出栈),记作ip。
在子程序间的连接代码段中常使用这种规则。
(4)寄存器R13用作数据栈指针,记作sp,sp中存放的是当前使用的栈的栈顶的
地址。
在子程序中寄存器R13不能用作其他用途。
寄存器sp 在进入子程序时的值和退出子程序时的值必须相等。
(5)寄存器 R14称为连接寄存器,记作lr。
它用于保存子程序的返回地址。
如果
在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
(6)寄存器R15是程序计数器,记作pc。
它不能用作其他用途。
4.什么是内联汇编?
ﻩ答:
在C代码中插入汇编语言的方法称为内联汇编。
5.汇编代码中如何调用C 代码中定义的函数?
ﻩ答:
(1)调用的C带有参数,需要使用R0~R3寄存器进行参数的传递,如果参数多于四个
多出来的部分使用堆栈传递。
(2)调用C程序时,使用BL跳转指令,格式为:
BL函数名
ﻩ(3)如果C程序带有返回值,使用寄存器R0传递。
第五章
1.什么是GPIO?
ﻩ答:
GPIO的英文全称为 General-PurposeIOports,也就是通用 IO接口。
2.Exynos4412有几组GPIO端口?
答:
Exynos4412有37组GPIO端口
3.编程实现利用Exynos4412的GPIO 控制LED3 闪烁。
ﻩ答:
ﻩ.text @定义一个代码段
ﻩ.global_start @定义一个全局的标号 _start
_start:
ﻩ @汇编的入口,相当于c的main函数
ldrr0,=0x11000c20ﻩ @配置引脚的功能,将GPX1CON寄存器的[3:
0]这个位于设置为0x1
ﻩldrr4,[r0]
ﻩbicr4, #0xf
ﻩorrr4,#0x1
ﻩstrr4,[r0]
loop:
ﻩbl led_on ﻩﻩ@点亮LED3
ﻩbldelayﻩ@延时
blled_offﻩ@熄灭LED3
ﻩbldelayﻩﻩﻩ@延时
b loopﻩﻩ@相当于C程序中的while
(1),防止程序跑飞
led_on:
ldrr1,=0x11000c24 @配置GPX1_0引脚输出高电平
ﻩldrr5,[r1]
ﻩorrr5,#0x1
ﻩstrr5,[r1]
ﻩmovpc, lr
led_off:
ﻩldr r1, =0x11000c24ﻩ@配置GPX1_0引脚输出低电平
ldr r5,[r1]
bicr5,#0x1
ﻩstr r5,[r1]
movpc,lr
delay:
ﻩ @延时函数
movr7,#0x10000000
ms:
sub r7,#1
cmpr7, #0
moveqpc,lr
ﻩbms
.end ﻩ @代表汇编的结束
第六章
1.异常向量表位于存储器的什么位置?
答:
存储器映射地址0x00000000 是为向量表(一组32位字)保留的。
也可通过设置CP15的C12寄存器将异常向量表的首地址设置在任意地址
2.IRQ或 FIQ异常的返回指令是什么?
ﻩ答;SUBSPC,LR, #4
3.什么类型的异常优先级最高?
答:
RESET异常
4.什么指令可以放在中断向量表
ﻩ答:
跳转指令(BLable)
ﻩLDR指令(LDRPC,Lable地址)
5.ARM中断控制器有什么作用?
答:
ARM 内核只有两个外部中断输入信号nFIQ和nIRQ。
但对于一个系统来说,中断源可能多达几十个。
为此,在系统集成时,一般都会有一个中断控制器来处理异常信号。
这时候用户程序可能存在多个IRQ/FIQ的中断处理函数。
为了使从向量表开始的跳转始终能找到正确的处理函数入口,需要设置处理机制和方法。
不同的中断控制器处理方法不同。
6.编程实现按键K3的中断检测,当按键按下时打印相应信息。
答:
#include"exynos_4412.h"
#include "uart.h"
/*中断处理函数 */
voiddo_irq()
{
ﻩintirq_num;
/*读中断号*/
irq_num=CPU0.ICCIAR& 0x3ff;
ﻩ/*判断是哪个中断发生了*/
ﻩswitch(irq_num)
ﻩ{
//case57:
case 58:
ﻩ//key3按下了
ﻩﻩ/*清中断挂起位*/
ﻩEXT_INT41_PEND=0x4;
printf("The KEY3ispressed!
!
!
\n");
ﻩbreak;
//case59:
ﻩ//case60:
ﻩdefault:
ﻩbreak;
ﻩ}
/*把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断*/
CPU0.ICCEOIR=CPU0.ICCEOIR&(~(0x3ff<<0)) | irq_num;
}
voidinterrupt_init()
{
ﻩ/* 1. 配置GPX1_2引脚作为中断功能*/
ﻩGPX1.CON=GPX1.CON &(~(0xf<< 8))|(0xf<<8);
ﻩ/*2.设置中断的触发方式--下降沿触发*/
EXT_INT41_CON = EXT_INT41_CON &(~(0x7<<8)) | (0x2<< 8);
ﻩ/*3.打开GPIO控制器上的使能开关,让中断能到达GIC*/
ﻩEXT_INT41_MASK =EXT_INT41_MASK&(~(0x1<<2));
/*GIC*/
/* 4.打开58号中断在GIC中对应的开关*/
ICDISER.ICDISER1 = ICDISER.ICDISER1|(0x1<<26);
/* 5.把58号中断分发给CPU0来处理*/
ﻩICDIPTR.ICDIPTR14= ICDIPTR.ICDIPTR14&(~(0xff<< 16)) |(0x1 <<16);
/*6.打开分发使能的总开关,让58号中断能到达CPU接口*/
ICDDCR=ICDDCR |(0x1<<0);
/*7.打开CPU接口到达所连接的处理器的总开关*/
CPU0.ICCICR=CPU0.ICCICR|(0x1<<0);
/*8.设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大)*/
CPU0.ICCPMR =CPU0.ICCPMR &(~(0xff<<0)) | (0xff<<0);
}
intmain()
{
//初始化按键中断
interrupt_init();
//初始化串口
ﻩuart_init();
ﻩwhile
(1);
ﻩreturn0;
}
第七章
1.串行通信与并行通信的概念是什么?
答:
串行通信是指计算机与I/O设备之间数据传输的各位是按顺序依次一位接一位进行传送。
并行通信是指计算机与 I/O 设备之间通过多条传输线交换数据,数据的各位同时进行传送。
2.同步通信与异步通信的概念及区别是什么?
ﻩ答:
概念:
异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。
同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。
区别:
异步通信:
(1)以字符为单位传送信息。
(2)相邻两字符间的间隔是任意长。
(3)因为一个字符中的波特位长度有限,所以需要的接收时钟和发送
时钟只要相近就可以。
(4)异步方式特点就是:
字符间异步,字符内部各位同步。
同步通信:
(1)以数据块为单位传送信息。
(2)在一个数据块(信息帧)内,字符与字符间无间隔。
(3)因为一次传输的数据块中包含的数据较多,所以接收时钟与发送
时钟严格同步,通常要有同步时钟。
3.RS-232C串口通信接口规范是什么?
答:
略,参照本书7.1.7节
4.在Exynos4412串口控制器中,哪个寄存器用来设置串口波特率?
答:
UBRDIVn和UFRACVALn
第八章
1.PWM 输出波形的特点是什么?
答:
若令频率不变,直接改变脉冲的宽度,亦即控制开关元件的导通时间;比如现在是高电平导通,那么高电平时间越长,低电平时间越短,导通时间就长;否则就越短。
2.编程实现输出占空比为2︰1、波形周期为9ms的PWM波形。
ﻩ答:
#include"exynos_4412.h"
intmain()
{
ﻩ/*1.配置GPD0_0引脚作为PWM的输出功能*/
ﻩGPD0.CON=GPD0.CON& (~(0xf<<0))|(0x2<< 0);
ﻩ/*2.设置一级分频系数和二级分频系数,周期为1us*/
ﻩPWM.TCFG0=PWM.TCFG0&(~(0xff<<0))| (99<< 0);
ﻩPWM.TCFG1= PWM.TCFG1&(~(0xf <<0));
/*3.设置PWM输出脉冲的周期和占空比*/
ﻩPWM.TCNTB0=9000;
PWM.TCMPB0=3000;
ﻩ/*4.打开手动更新,更新TCNTB的值到递减计数器*/
PWM.TCON=PWM.TCON|(1<< 1);
/* 5.关闭手动更新,打开自动重装载功能*/
PWM.TCON=PWM.TCON|(1<<3);
/*6.将手动装载关闭*/
ﻩPWM.TCON=PWM.TCON& (~(1 <<1));
ﻩ/* 7.开启PWM*/
ﻩPWM.TCON|=(0x1<<0);
ﻩwhile
(1);
return0;
}
第九章
1.在控制系统中为何要加入看门狗功能?
ﻩ答:
检测程序的正常运行,当程序跑死后,看门狗产生一个强制系统复位。
这样可以使程序重新运行,减小程序跑死的危害。
2.编程实现看门狗定时器作为普通 16 为定时器功能,定时1s循环打印信息。
#include "exynos_4412.h"
/*中断处理函数*/
void do_irq()
{
intirq_num;
/*读中断号*/
irq_num =CPU0.ICCIAR& (0x3ff << 0);
ﻩ/*判断是哪个中断发生了*/
switch (irq_num)
ﻩ{
ﻩcase75:
//1S定时时间到
ﻩ/*清中断 */
WDT.WTCLRINT=1;
ICDICPR.ICDICPR2 =ICDICPR.ICDICPR2| (0x1 <<11);
ﻩﻩprintf("TheWDT_Timer1S!
\n");
break;
ﻩdefault:
break;
ﻩ}
ﻩ/*把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断 */
ﻩCPU0.ICCEOIR=CPU0.ICCEOIR &(~(0x3ff <<0))|irq_num;
}
voidinterrupt_init()
{
ﻩ/*GIC*/
ﻩ/* 1.打开75号中断在GIC中对应的开关*/
ICDISER.ICDISER2=ICDISER.ICDISER2|(0x1<<11);
ﻩ/* 2.把75号中断分发给CPU0来处理*/
ﻩICDIPTR.ICDIPTR18=ICDIPTR.ICDIPTR18& (~(0xff<<24))|(0x1<< 24);
/*3.打开分发使能的总开关,让75号中断能到达CPU接口 */
ICDDCR=ICDDCR|(0x1<<0);
ﻩ/* 4.打开CPU接口到达所连接的处理器的总开关*/
CPU0.ICCICR=CPU0.ICCICR |(0x1 <<0);
/*5.设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大)*/
CPU0.ICCPMR=CPU0.ICCPMR&(~(0xff<<0))|(0xff <<0);
}
voidwdt_init(void)
{
/*1.设置一级预分频值 =100000000 /(249+1)= 400000HZ*/
ﻩWDT.WTCON=WDT.WTCON|(249<< 8);
/*2.设置二级预分频值= 400000 /128=3125HZ*/
ﻩWDT.WTCON= WDT.WTCON|(0x3<< 3);
/*3.禁止看门狗定时器复位功能*/
ﻩWDT.WTCON=WDT.WTCON&(~0x1);
/*4.使能看门狗定时器能够中断信号*/
WDT.WTCON=WDT.WTCON|(0x1<< 2);
ﻩ/*5.给递减计数器赋初值喂狗*/
WDT.WTDAT=3125;
ﻩWDT.WTCNT=3125;
/*6.打开看门狗定时器*/
ﻩWDT.WTCON=WDT.WTCON|(1<<5);
}
void main(void)
{
ﻩwdt_init();
ﻩinterrupt_init();
while
(1)
ﻩ{
}
}
3.编程实现 1s 内不对看门狗实现喂狗操作,看门狗会自动复位。
ﻩ答:
#include"exynos_4412.h"
voidmain(void)
{
unsigned inti = 0;
/*1.设置一级预分频值= 100000000/(249+1) = 400000HZ*/
WDT.WTCON =WDT.WTCON|(249 << 8);
ﻩ/*2.设置二级预分频值=400000 /128=3125HZ*/
ﻩWDT.WTCON=WDT.WTCON| (0x3<<3);
ﻩ/*3.使能看门狗定时器能够产生复位信号*/
WDT.WTCON=WDT.WTCON|1;
/*4.给递减计数器赋初值喂狗*/
WDT.WTCNT =3125;
/*5.打开看门狗定时器*/
WDT.WTCON=WDT.WTCON |(1<<5);
ﻩwhile(1)
{
/*1s 内不对看门狗实现喂狗操作,看门狗会自动复位*/
ﻩ}
}
第十章
1.编程实现RTC的定时中断功能。
ﻩ答:
#include"exynos_4412.h"
/*中断处理函数*/
voiddo_irq()
{
ﻩintirq_num;
ﻩ/*读中断号*/
ﻩirq_num= CPU0.ICCIAR &(0x3ff<<0);
ﻩ/*判断是哪个中断发生了*/
switch(irq_num)
{
case77:
//1S定时时间到
ﻩ/*清中断*/
ﻩRTCINTP = RTCINTP|0x1;
ICDICPR.ICDICPR2=ICDICPR.ICDICPR2|(0x1<<13);
ﻩﻩprintf("TheRTC-TICINT!
\n");
ﻩﻩbreak;
ﻩdefault:
ﻩbreak;
ﻩ}
/*把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断*/
CPU0.ICCEOIR=CPU0.ICCEOIR& (~(0x3ff<<0))|irq_num;
}
voidinterrupt_init()
{
ﻩ/*GIC*/
/*1. 打开77号中断在GIC中对应的开关*/
ﻩICDISER.ICDISER2=ICDISER.ICDISER2 |(0x1 <<13);
/*2.把77号中断分发给CPU0来处理*/
ICDIPTR.ICDIPTR19= ICDIPTR.ICDIPTR19&(~(0xff<< 8))| (0x1<<8);
ﻩ/*3. 打开分发使能的总开关,让75号中断能到达CPU接口*/
ICDDCR=ICDDCR |(0x1<< 0);
/*4.打开CPU接口到达所连接的处理器的总开关 */
CPU0.ICCICR= CPU0.ICCICR| (0x1<<0);
/*5.设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大) */
ﻩCPU0.ICCPMR=CPU0.ICCPMR& (~(0xff<<0))|(0xff<<0);
}
intmain()
{
ﻩinterrupt_init();
RTCCON|=0x1<<8;
TICCNT =32768;
while
(1)
ﻩ{
}
ﻩreturn0;
}
2.编程实现 RTC 定时器系统定时器功能。
#include"exynos_4412.h"
/*中断处理函数*/
voiddo_irq()
{
ﻩintirq_num;
ﻩ/*读中断号 */
ﻩirq_num=CPU0.ICCIAR & (0x3ff<<0);
/*判断是哪个中断发生了*/
switch(irq_num)
ﻩ{
ﻩcase76:
//定时时间到
ﻩ/*清中断 */
ﻩRTCINTP=RTCINTP|0x2;
ﻩﻩICDICPR.ICDICPR2=ICDICPR.ICDICPR2| (0x1<<12);
ﻩprintf("TheRTC-timer
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 嵌入式 体系结构 接口 技术 CortexA9 习题 答案