ARM体系结构-测试题-答案-20091029 联系客服

发布时间 : 星期六 文章ARM体系结构-测试题-答案-20091029更新完毕开始阅读f5cb812731126edb6f1a10dc

专业的嵌入式技术研发、推广、培训、认证机构

ARM阶段测试题答案

ARM体系结构

1、 请简述ARM处理器的特点,至少说出5个以上的特点。(5分)

:低功耗;低成本,高性能,RISC结构;指令定长;支持Thumb(16位)/ARM(32位)双指令集;体积小;

2、 请写出ARM内核和ARM SoC处理器的异同,并举例进行说明。(5分) :ARM内核是ARM SoC处理器中的核心部分,所有ARM SoC都采用ARM的体系结构和指令集,ARM SoC主要是在ARM 内核基础上继承了Memory Controller,Interrtupt Controller,Timer,DMA Controller 以及像 GPIO,USB,IIC,LCD 等外设控制器。

3、 ARM内核有多少种工作模式?请写出这些工作模式的英文缩写。(7分) :ARM有7种工作模式,usr、sys、svc、irq,abt,und、fiq。

4、 ARM内核有多少个寄存器,请列举出这些寄存器的名字和数量。(5分) :ARM有37个寄存器,(1)未分组寄存器:R0-R7,共8个;(2)分组寄存器R8-R14,其中FIQ模式下有单独的一组R8-R12共5个,另外6种模式共用一组R8-R12,共5个,USR和SYS模式共用一组R13-R14,共2个,另外5种模式下各有独自的一组R13-R14,共10个;(3)程序计数器PC即R15寄存器,共1个;(4)状态寄存器CPSR,和5个备份状态寄存器SPSR,共6个;ARM总计37个寄存器。 5、 ARM通用寄存器中,有3个寄存器有特殊功能和作用,请写出它们的名字和作用。(6分)

:R13:SP栈指针寄存器,用来保存程序执行时的栈指针位置;R14:LR返回链接寄存器,用来保存程序执行BL指令或模式切换时的返回原程序继续执行的地址;R15:PC程序计数器,保存程序执行的当前地址。

6、 请描述一下CPSR寄存器中相关Bit的情况和作用。(5分) :条件位(指令进行算术运算后的结果是否有进位,借位等),I位(IRQ异常允许位),F位(FIQ异常允许位),T位(ARM/Thumb工作状态),模式位(处理器工作模式) 7、 请写出以下相关ARM指令语句的注释:(7分)

MOV R0, PC 把PC的值传送到 R0寄存器,此时PC地址为当前指令位置+8 ADD R0, R1, #1 把R1加上1的结果给R0寄存器 LDR R0, =0x56000010 是伪指令,把0x56000010放到R0寄存器中,采用文字池技术。 LDR PC, [PC, #4] 把当前PC值加4位置的内容赋值给PC,实现绝对跳转 MRS R0, CPSR 把CPSR的值传送给R0 BL LOOP 带返回地址的跳转指令,把下一条指令给LR后,跳转到Loop 地址 STMFD R13!,{R0-R12} 压栈指令,把R0到R12寄存器的值通过R13栈指针进行压栈保存,同时这个栈是满递减方式的栈。

8、 什么是立即数?请简要描述立即数在使用时有什么注意要点。(2分)

立即数,主要是指寻址时直接在指令中出现的数,在使用时注意(1)立即数前需要加#(2)ARM指令只有32位长,立即数在指令中占12位存储空间,ARM用这12位空间8位表示有效数字-基数B,4位表示译为的数M,按照把B循环右移M*2位,构造成一个新的32位的数,其它位补0,所以在使用立即数时,要注意其是否合法。

9、 请问BL指令跳转时LR寄存器保存的是什么内容?并请简述原因。(3分)

BL跳转时,LR中保存的是执行BL跳转指令的下一条指令的地址,考虑流水线的情况,即当前的PC-4。LR用来在需要返回程序时从LR中还原程序执行的位置继续执行。 10、 请描述一下什么是处理器现场,如何进行保存现场?(5分)

每种工作模式下都包含R0-R15,CPSR这17个寄存器,程序的执行当前状态就保存在这些寄存器中,称为处理器现场。当发生模式切换时,由于其中的一些寄存器是多种模式下共用的寄存器,为了防止共用处理器寄存器中的值被破坏,所以需要保存原模式下的处理器现场,利用STM批量存储指令,把处理器现场对应的寄存器保存到栈上,待还原时再出栈恢复(模式和返回地址)。其中保存现场的工作,

专业的嵌入式技术研发、推广、培训、认证机构

硬件完成了CPSR模式的保存和PC返回地址的保存,其他寄存器的保存工作主要依靠软件压栈完成,其中LR因为可能被异常处理程序中的BL跳转指令修改,所以一般都需要软件压栈再保存。 11、 请描述一下什么是小尾端Littler-Endian存储格式,如何编程确定处理器的存储格式?(2分) 小尾端:低地址存低字节,高地址存高字节。测试:按字节打印int型的0x12345678,如是小尾端,则先打78.(通过 union 的方式也可以实现测试是否是小尾端) 12、 请写出一条完整的ARM软件中断指令,并简要描述其作用。(2分)

SWI 0x1。SWI指令触发软中断异常,使程序的执行流跳转到异常向量表地址0x8,0x1是软中断的中断号,软中断处理程序可根据不同的中断号调用对应的处理子程序。一般SWI软中断都用于操作系统的系统调用。 13、 请描述一下ARM体系中异常向量表的概念。(7分)

异常向量表是从0x0地址开始,一共32个字节,包含8个表项,其中有1个保留不用,其他7个表项对应7种异常发生后的跳转位置,这7种异常发生后分别对应到5种异常模式。每个表项里面放的一般都是一条跳转指令,用来跳转到真正的异常处理程序入口,通过B指令,或者LDR PC,[PC, #?] 的方式都可以实现此类跳转。 14、 产生软中断和硬中断异常时,程序计数器跳转到的地址是哪里?(2分) 软中断:0x8,硬中断:0x18。 15、 请写出发生异常后,在进行异常响应时,硬件完成了哪些工作?(5分) 异常响应时:(1)硬件自动保存程序的返回地址到要切换的工作模式下的LR中;(2)硬件自动保存CPSR到要切换的工作模式下的SPSR中;(3)修改CPSR的模式位;(4)映射相应模式下的寄存器;(5)设置PC跳转到要进入的异常向量表的入口地址。

ARM SOC编程开发

16、 请写出一个ARM程序生成的bin文件映像中包含哪些内容?(3分)

ARM生成的bin文件包含:RO,RW 两个段,注意 ZI 段一般都不在 bin 文件中占用存储空间。 17、 请写出完整编译生成bin文件的命令行:使用文件为 start.s main.c (5分) armasm start.s –o start.o armcc –c main.c –o main.o

armlink start.o main.o –first start.o –o main.axf fromelf –bin main.axf –o main.bin 18、 请写出armlink时经常使用的参数选项及其作用,不少于3个。(3分)

-first 指定目标二进制文件哪个链接时放在存储的最前面;-entry 指定程序的入口地址,即程序从哪里开始首先执行;-ro-base 指定程序链接时RO段采用的内部加载基址;-rw-base 指定RW段加载时的加载地址。 19、 请举例说明在ARM处理器上进行一次中断处理和中断异常处理的差异。(3分)

中断处理相比异常处理,主要是中断需要初始化中断源和中断控制器,中断发生后在ISR中要清除相应Pending位,而且要在进入中断处理程序一开始就清除。 20、 请写出从中断异常进行返回时,软件编程要处理的事项和注意要点。(2分) (1)返回地址LR的调整。(2)在恢复PC的同时,恢复CPSR(恢复原来的模式,返回被打断的地址。) 21、 请详细描述我们在S3C2440开发板实验过程中进行串口初始化的流程和要点。(5分) 时钟频率设置(MPLL,PCLK的设置),串口数据位8位,停止位1位,奇偶校验无,波特率设置需要根据PCLK代入公式进行计算等 22、 请详细描述我们在S3C2440开发板实验过程中进行按键中断触发的流程和要点。(8分) SVC和IRQ模式下的SP栈指针设置,IO管脚复用设置,设置按钮的触发模式(下降沿触发),管脚的中断模式使能,中断掩码寄存器屏蔽位打开,清除PND寄存器中的pending位,打开CPSR-I位; 23、 请说明S3C2440处理器,关于 memory map 的情况。(5分)

专业的嵌入式技术研发、推广、培训、认证机构

2440的memory分为8个bank,每个bank的固定大小为128M,每个bank均可以产生一个片选信号,共1G的地址空间,8个片选信号,bank0-bank5用来存放SROM器件,bank6和bank7用来存放SDRAM器件。 24、 请详细描述 bootloader 启动代码的设计流程,并说明你目前所实现的bootloader已经完成的功能有哪些,实现中遇到了哪些困难和bug问题? (5分)

bootloader的设计流程:硬件的初始化(1)初始化看门狗(2)关中断(3)设置处理器时钟(4)初始化SDRAM器件(5)初始化串口(6)实现shell命令解释器功能,(7) 提供通过串口的下载功能download和执行功能go。要求能够讲的出你自己实现bootloader过程中遇到的实际问题和解决办法,这个很重要。 25、 请说明以下代码中可能存在的3个bug,并给出解决办法。(3分) #define UART_BASE 0x50000000

#define UTRSTAT0 *(volatile unsigned int *) UART_BASE+0x10 #define UTXH0 *(volatile unsigned int *) UART_BASE+0x20 int main(void) {

if( UTRSTAT0 & 0x4 == 0x4 )

UTXH0 = 'a'; return 0;

}

(1) UART_BASE+0x10应该加上括号(2)& 的优先级比 == 要低,所以要加括号。(3) if应该改为while( !(UTRSTAT0 & 0x4) )

附加题:

请说明SRAM, SDRAM, Nor Flash 和Nand Flash的异同,并详细描述各自编程上的注意要点。 异同见教材,编程上要注意说明 SRAM和NorFlash无须初始化就可以使用,SDRAM和NandFlash都需要初始化驱动代码才可以工作,NorFlash的写需要靠芯片手册规定的时序来做,STR指令不能够直接写入NorFlash和NandFlash,但可以直接写入SRAM和SDRAM。 NandFlash器件是属于IO方式进行读,和其他3种器件的总线读方式不一样,因此读写NandFlash需要相应的驱动。