第一篇:ARM 2017年复习题总结
ARM 2017年复习题总结
简答题
什么是嵌入式操作系统?
答:嵌入式系统是以应用为中心,以计算机技术为基础,软/硬件可裁减,功能。可靠性,成本,体积,功耗要求严格的专用计算机系统。
与通用计算机相比,嵌入式系统有哪些特点? 答:(1).嵌入式系统通常是面向特定应用的;
(2).嵌入式系统是将计算机技术,半导体技术和电子技术与各行各业的具体应用相结合的后的产物,是一门综合技术学科;
(3).嵌入式系统和具体应用有机的结合在一起,它的升级换代也是和具体产品同步进行的,因此嵌入式产品一旦进入市场,就有较长的生命周期;
(4).为了提高执行速度和可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存储于磁盘等载体中;
(5).嵌入式系统本身不具有自主开发能力,即使设计完成以后用户通常也不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。
ARM处理器有几种寻址方式,说明各种寻址的方式。答:
立即寻址:操作数直接放在指令中。例如:ADD R0,R0,#0x3f ;R0←R0+0x3f 寄存器寻址:操作数放在寄存器中。例如:ADD R0,R1,R2
;R0←R1+R2 寄存器间接寻址:操作数在内存,以寄存器中的值作为操作数的地址。例如:LDR R0,[R1]
;R0←[R1] 基址加偏移量寻址(基址变址寻址):基址寄存器的内容与指令中的偏移量相加形成操作数的有效地址
例如:LDR R0,[R1,#4] LDR R0,[R1,R2] ;R0←[R1+R2]
;R0←[R1+4] 多寄存器寻址:一条指令可以完成多个寄存器值的传送。例如: LDMIA R0,{R1,R2,R3,R4} 12] 堆栈寻址:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。例如:STMFD R13!,{R0,R4-R12,LR} LDMFD R13!,{R0,R4-R12,PC}
/ 17
;R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+举例介绍嵌入式处理器有哪几类?
答:1.嵌入式微处理器(Embedded Microprocessor Unit,EMPU);
2.嵌入式微控制器;(Embedded Microcontroller Unit,EMCU)
3.嵌入式DSP处理器(Embedded Digital Signal Processor,EDSP);
4.嵌入式片上系统(Embedded System on Chip,EsoC); 什么是立即数?请简要描述立即数在使用时有什么注意要点。
立即数,主要是指寻址时直接在指令中出现的数,在使用时注意(1)立即数前需要加#(2)ARM指令只有32位长,立即数在指令中占12位存储空间,ARM用这12位空间8位表示有效数字-基数B,4位表示译为的数M,按照把B循环右移M*2位,构造成一个新的32位的数,其它位补0,所以在使用立即数时,要注意其是否合法。请问BL指令跳转时LR寄存器保存的是什么内容?并请简述原因。
BL跳转时,LR中保存的是执行BL跳转指令的下一条指令的地址,考虑流水线的情况,即当前的PC-4。LR用来在需要返回程序时从LR中还原程序执行的位置继续执行。ARM内核有多少个寄存器,请列举出这些寄存器的名字和数量。
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个寄存器。
ARM通用寄存器中,有3个寄存器有特殊功能和作用,请写出它们的名字和作用。(6分)R13:SP栈指针寄存器,用来保存程序执行时的栈指针位置;R14:LR返回链接寄存器,用来保存程序执行BL指令或模式切换时的返回原程序继续执行的地址;R15:PC程序计数器,保存程序执行的当前地址。
ARM的CPSR寄存器的位定义如图所示,试简述各位的功能。(8分)
3***6543210NZCV标志位含义 保留IFTM[4-0]
N N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零 Z Z=1 表示运算的结果为零;Z=0 表示运算的结果为非零 C C=1 表示有进位,C=0 表示没有进位 V V=1 表示符号位溢出,V=0 表示结果没有溢出 Q 在ARM vTE/J 架构支持,指示DSP 指令是否溢出
J 仅ARM 5TE/J 架构支持,J = 1 表示处理器处于Jazelle 状态 I I=1 表示禁止IRQ F F=1 表示禁止FIQ T 仅ARM xT 架构支持,T = 0 表示处理器处于ARM 状态,T=1 表示处理器处于Thumb 状态
什么是伪指令和伪操作?在ARM汇编中有哪几种伪 指令?
/ 17
答:在ARM汇编语言程序中有些特殊助记符,这些助记符与一般指令的助记符的不同之处在于没有相对应的操作码或者机器码,通常称这些特殊指令助记符伪指令,他们多完成的操作成为伪操作;
在ARM汇编中,有如下几种伪指令:
(1)符号定义伪指令;
(2)数据定义伪指令;
(3)汇编控制伪指令;
(4)信息报告伪指令;
(5)宏指令及其他伪指令。
如何定义寄存器列表,试举一个使用寄存器列表的例子,要求实现4个字的内存复制。答:
AREA
EXAMPLE1,CODE,READONLY
ENTRY LDR
R0,=0XFF
;把地址0XFF赋给R0
LDR
R5,=0X0F
;把地址0X0F赋给R5 START PBLOCK
RLIST
{R1-R4}
;把R1-R4定义为PBLOCK LDMIA
R0,PBLOCK
;把R0为首地址的内存4个字单元装载至R1到R4中 STMIA
R5,PBLOCK
;把R1到R4的值依次存至R5为首地址的内存字单元 STOP
B
STOP
;死循环
END
如何定义一个宏,宏与子程序的区别是什么? 答:宏的格式为:
MARCO和MEND [$标号]
宏名
[$参数1,$参数2…..] 指令序列 MEND
MARCO表示一个宏定义的开始,MEND表示一个宏的结束,MARCO和MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后在程序中就可以在程序中通过宏的名称及参数调用该段代码。
宏指令可以重复使用,这一点的使用方式与子程序有些相似,子程序可以节省存储空间,3 / 17
提供模块化的程序设计。但使用子程序机构时需要保存/恢复现场,从而增加了系统的开销,因此,在代码传递的参数较多并且比较短时,可以使用宏代替子程序,宏在被调用的地方展开。
ARM汇编中如何定义一个段,段有几种属性?
答:AREA用于定义一个代码段,数据段,或者特定属性的段。
段的几种属性如下:
READONLY表示只读属性;
READWRITE表示本段可读写;
CODE定义代码段;
DATA定义数据段;
ALIGN=表达式的对齐方式为2的表达式次方;;
COMMON:定义一个通用段,这个段不包含用户代码和数据。
在一个汇编源文件中如何包含另一个文件中的内容?
答:通常可以使用GET/INCLUDE指令,在某源文件中定义一些宏指令,用MAP和FIELD定义结构化数据结构类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他源文件中。
1.ARM7TDMI采用了几级流水线工作方式,简要说明。答:三级
1、取指令
2、译码
3、执行
2.ARM9采用了几级流水线工作方式,简要说明。
答:五级流水线工作方式,1.取指2.指令译码3.执行4.数据存储访问5.写寄存器 3.哈佛体系结构和冯诺依曼体系结构有何不同。
答:哈佛体系结构的两套地址总线和数据总线是分开的,冯诺依曼体系结构是复用的。1.简述ARM发生异常时,ARM核心会自动做哪些事情?从异常返回时,我们要做哪些事情?
当异常产生时, ARM core: 拷贝 CPSR 到 SPSR_
改变处理器状态进入 ARM 状态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断(如果需要)保存返回地址到 LR_
/ 17
设置 PC 为相应的异常向量 返回时, 异常处理需要: 从 SPSR_
Note:这些操作只能在 ARM 态执行.2.用ARM汇编指令写出实现64位加法和64位减法的代码段,使用的寄存器请自行分配。假定低32位数存放在r0和r1里面,高32位数存放在r2和r3里面。加法:
ADDS r0, r0, r1 //加S是因为要让这个操作影响标志位
ADC r2, r2, r3 //ADC是带进位的加法,如果上一条指令产生进位则一起加进来 减法:
SUBS r0, r0, r1 //加S是因为要让这个操作影响标志位 SBC r2, r2, r3 // SBC是带进位的减法指令
3.请列举ARM处理器的模式和异常,并说明各个发生异常时ARM处理器所处的模式 异常: Reset Data Abort FIQ IRQ Prefetch Abort SWI Undefined instruction 处理器模式
User : 非特权模式,大部分任务执行在这种模式
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式
IRQ : 当一个低优先级(normal)中断产生时将会进入这种模式
Supervisor :当复位或软中断指令执行时将会进入这种模式
Abort : 当存取异常时将会进入这种模式
Undef : 当执行未定义指令时会进入这种模式
System : 使用和User模式相同寄存器集的特权模式 4.FIQ的什么特点使得它处理的速度比IRQ快? 1)FIQ优先级比IRQ高,不会被中断
2)FIQ有自己的专属寄存器:r8~r12,不用对通用寄存器入栈保护,可以加快速度 3)FIQ位于异常向量表的末尾0x1c,故无需跳转,可以在这里直接放置异常处理函数 5.什么指令可以放在中断向量表?
/ 17
跳转指令,给PC赋值的指令 B,LDR,MOV 6.ARM处理器 中断向量表位于存储器的什么位置? 默认:0x0 也可以配置成:0Xffff0000 7.下列 ARM 指令将做什么? a)LDRH r0,[r1,#6] b)LDR r0, =0x999 a:将r1寄存器的值加上6,然后把以这个值为地址的内存单元里的值取半字(低16位)赋给r0 b:将立即数0x999赋给r0,注意这是一个伪指令 8.SWP 指令的优势是什么?用来实现什么功能?
功能:在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。可以用来实现信号量 9.专业名词解释
RISC
(Reduce Instruct Set Computer);
IP
(Intellectual Property);
ISR
(Interrupt Servers Routine)JTAG
(Join Test Active Group)
IDE
(Integrate Development Environment)RTOS(实时操作系统); CISC(复杂指令集); Kernel(内核)
Scheduler(调度)non-preemptive(非抢先式)
初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包含如下典型任务:(1)定义程序入口点(2)设置异常向量;(3)初始化存储器系统;(4)初始化堆栈指针寄存器;(5)初始化临界I/O设备;(6)初始化C代码的运行环境;(7)改变处理器的运行模式和状态;
/ 17
(8)使能中断;(9)进入C代码运行
选择题
1.ARM 属于 RISC 架构
2.ARM 指令集是 32位宽,Thumb 指令集是16位宽的。3.ARM 指令集是4字节对齐,Thumb 指令集是2字节对齐的 4.复位后,ARM处理器处于SVC模式,ARM状态
5.ARM处理器总共37个寄存器,System模式下使用17个寄存器,SVC模式下使用18个寄存器。
6.ARM处理器中优先级别最高的异常为RESET,FIQ,IRQ异常可以用来相应中断 7.ARM数据处理指令中有效的立即数是(ACEGH)
[A] 0X00AB0000
[B] 0X0000FFFF [C ] 0XF000000F [D ] 0X08000012 [E] 0X00001F80 [F] 0XFFFFFFFF [G] 0 [H] 0XFF000000 8.ATPCS规定中,推荐子函数参数最大为4 个 9.ATPCS规定中,栈是满减
10.在ARM汇编编程,寄存器有多个别名,通常PC是指R15,LR 是指R14,SP是指R13 11.CPSR寄存器中反映处理器状态的位是T位 12.下面属于ARM 子程序调用指令的是BL 13.ARM7属于冯.诺依曼结构,ARM9属于哈佛结构。14.ARM7是3级流水线,ARM9是5级流水线。
15.ARM中可以访问状态寄存器的指令是MRS,能够访问内存的指令是LDR 16.下面哪种操作系统最方便移植到嵌入式设备中(D)
[A] DOS [B] UNIX [C ] WINDOWS XP [D ]LINUX 17.以下哪项关于SRAM和DRAM的区别是不对(A)
(A)SRAM比DRAM慢
(B)SRAM比DRAM耗电多(C)DRAM存储密度比SRAM高得多
(D)DRM需要周期性刷新
18.下面哪种嵌入式操作系统很少用于手机终端设备上(CE)
(A)Symbian
(B)WinCE
(C)uc/os 19.S3C2410采用的是ARM920T核心
20.下面哪点不是嵌入式操作系统的特点(C)A.内核精简 B.专用性强
C.功能强大
D.高实时性
(D)linux(E)VxWorks 21.NAND FLASH和NOR FLASH的叙述正确的是(D)A.NOR的读速度比NAND稍慢一些
B.NAND的写入速度比NOR慢很多
/ 17
C.NAND的擦除速度远比NOR的慢 22.MMU的作用有(AB)
D.大多数写入操作需要先进行擦除操作
[A] 内存保护
[B] 地址转换 [C ] 加快存取速度 [D ] 安全保密 [E] 内存分配 23.以下属于DMA特点的有(BC)
[A] 占用CPU
[B] 占用总线 [C ] 不占用CPU [D ] 不占用总线 24.以下哪种方式不属于文件系统的格式(B)(A)FAT
1.在ARM体系结构中,要从主动用户模式(User)切换到超级用户模式(Supervisor),采用何种方法?先修改程序状态备份寄存器(SPSR)到对应的模式,再更新CPU状态
2.嵌入式系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。例如:对于S3C2410来说,Boot Loader会映射到0x00000000地址处。
3.CPSR中的低8位称为控制位,下列不属于控制位的是【A】。A、N
B、I
C、F
D、T 4.ARM中可以访问状态寄存器的指令是MRS,能够访问内存的指令是LDR。5.下列条件码中表示不相等的是NE。EQ 相等 NE 不相等
CS/HS 无符号数大于或等于 CC/LO 无符号数小于 MI 负数 PL 正数或零 VS 溢出 VC 没有溢出 HI 无符号数大于
LS 无符号数小于或等于 GE 有符号数大于或等于
LT 有符号数小于
GT 有符号数大于
LE 有符号数小于或等于
AL 任何 无条件执行(指令默认条件)NV 任何 从不执行(不要使用)6.CPSR中的低8位称为控制位,其中I位等于1表示禁止IRQ中断。
7.ARM微处理器支持7种工作模式。其中,除用户模式之外的其余6种称为特权模式,在这6种之中,除系统模式之外的其余5种又称为异常模式。8.下列ARM指令中,可用于满递增堆栈操作的是STMIB。9.ARM伪指令中,可用于大范围地址读取的是LDR。10.同CISC相比,下面哪一项不属于RISC处理器的特征。【D】
A、采用固定长度的指令格式,指令规整、简单、基本寻址方式有2~3种。B、减少指令数和寻址方式,使控制部件简化,加快执行速度。
C、数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率,同时简化处理器的设计。
/ 17
(B)DOS
(C)NTFS
(D)Ext D、RISC处理器都采用哈佛结构
11.以下叙述中,不符合RISC指令系统特点的是【B】。A、指令长度固定,指令种类少
B、寻址方式种类丰富,指令功能尽量增强 C、设置大量通用寄存器,访问存储器指令简单 D、选取使用频率较高的一些简单指令
12.下面关于ARM处理器的体系结构描述哪一个是错误的。【B】 A、三地址指令格式
B、所有的指令都是多周期执行 C、指令长度固定 D、Load-Store结构
1.相对于ARM指令集,Thumb指令集的特点是【D】。A、指令执行速度快
B、16位指令集,可以得到密度更高的代码,对于需要严格控制成本的设计非常有意义 C、Thumb模式有自己独立的寄存器
D、16位指令集,代码密度高,加密性能好
2.在ARM寄存器结构中,栈指针使用R13寄存器。
3.32位体系结构的ARM处理器有7种不同的处理器工作模式,和6个主要用来标识CPU工作状态和程序运行状态的状态寄存器。
4.在下列ARM处理器的各种模式中,只有用户模式不可以自由地改变处理器的工作模式。5.在ARM的汇编程序中,ADR、ADRL、LDR、NOP等被称为伪指令。
填空题
1.常见的ARM处理器内核有ARM7、ARM9和【ARM11】等。2.按总线所传送的信息类型,总线分为【地址总线】、【数据总线】和【控制总线】。3.GPIO的中文全称是【通用输入/输出口】。
4.ARM处理器有两种状态,分别是【ARM】和【Thumb】。5.计算机结构分为【冯·诺依曼】结构和【哈佛】结构。
6.ARM处理器支持的数据类型中,字节为【8】位、半字为【16】位、字为【32】位。7.ARM体系结构版本中V【4】版架构是目前应用最广的ARM体系架构,ARM7、【ARM9】都采用该架构。
8.常用的嵌入式操作系统有【嵌入式Linux】、【VxWords】等。9.ARM嵌入式系统主要由【嵌入式硬件】、【嵌入式软件】和【开发工具】构成。10.S3C2410 支持两种引导方式,分别是【Nor-Flash】启动方式、【Nand-Flash】启动方式。11.一个嵌入式系统由3部分组成,分别是【嵌入式硬件】、【嵌入式软件】和【开发工具】。
判断题:
1、所有的电子设备都属于嵌入式设备。(F)
2、冯诺依曼体系将被哈佛总线所取代。(F)
3、嵌入式开发不需要硬件支持。(F)
/ 17
4、移植操作系统时需要修改操作系统中与处理器直接相关的程序。F
5、USB2.0的最大通信速率为12MB。(F)
6、嵌入式开发需要专门的软件和硬件设备。(T)
编程题
;例三:ADR伪指令 AREA adrlabel1, CODE, READONLY
ENTRY
start
BL func
B.LTORG func
ADR R0, start
ADR R1, DataArea
;ADR R2, DataArea+4300
ADRL R3, DataArea+4300
MOV PC, LR DataArea
SPACE 8000
END
;例五:利用跳转表实现程序跳转
AREA Jump, CODE, READONLY num EQU 2
ENTRY start
MOV R0, #0
MOV R1, #3
MOV R2, #2
BL arithfunc
B.arithfunc
CMP R0, #num
MOVHS PC, LR
ADR R3, JumpTable
LDR PC, [R3,R0,LSL #2] JumpTable
DCD DoAdd
DCD DoSub DoAdd
ADD R0, R1, R2
MOV PC, LR
/ 17
DoSub
SUB R0, R1, R2
MOV PC, LR
END
3、存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。
MOV R0,#0x400000
MOV R1,#0 LP
LDRB R2,[R0,R1]
CMP R2,#0x61
BLO NEXT
CMP R2,#0x7B;0x61---0x7A为小写字母的ASC
SUBLO R2,R2,#0x20
STRBLO R2,[R0,R1] NEXT
ADD R1,R1,#1
CMP R1,#100
BNE LP
8、编写一简单ARM汇编程序段,实现1+2+…+100的运算。
MOV R2,#100
MOV R1,#0 LOOP
ADD R1,R1,R2 ;R1中为累加和
SUBS R2,R2,#1 ;R2控制循环
BNE LOOP
4、编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
MOV R0,#0x400000
LDR R1,[R0] ;取第1个数
LDR R2,[R0,#4] ;取第2个数
CMP R1,R2 ;两个数相比较
MOVHI R1,#1 ;R1大
MOVLO R1,#-1 ;R1小
MOVEQ R1,#0 ;两个数相等
STR R1,[R0,#8]
7、编写一程序,存储器中从0x400200开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x400208处。
LDR R0,=0x400200
LDR R2,=0xFFFFFFFF
LDR R1,[R0] ;取低32位数
EOR R1,R1,R2 ;取反
/ 17
STR R1,[R0] ;存低32位反码
ADDS R1,R1,#1 ;又加1为求补
STR R1,[R0,#8] ;存低32位补码
LDR R1,[R0,#4] ;取高32位数
EOR R1,R1,R2 ;取反
STR R1,[R0,#4] ;存高32位反码
ADC R1,R1,#0 ;高32位求补
STR R1,[R0,#12] ;存高32位补码
例七:汇编语言与C/C++的混和编程 项目名:Example7.mcp 文件名:Example7_asm.s 文件名:Example7_c.c ——————————————————————————————————————— AREA Asm_C, CODE, READONLY
ENTRY
LDR SP,=0x4000
IMPORT __main
BL __main
B.END ——————————————————————————————————————— #include
1、写一条ARM 指令,分别完成下列操 作: a)r0 = 16
MOV R0,#16 b)r0 = r1 / 16(带符号的数字)
MOV R0,R1,ASR,#4 c)r1 = r2 * 3
MUL R1,R2,#3 d)r0 =-r0
RSB R0,R0,#0
2、写几条ARM 指令,使能IRQ中断 MRS R0,CPSR BIC R0,R0,#0x80 MSR SPSR,R0
3、编写程序,将存储器从0x400000开始的200个字节的数据,传送到0x400800开始的区域。
AREA copy,CODE,READONLY
ENTRY START
MOV R0, #0x400000
/ 17
LDR R1, =0x400800
MOV R7,#200 LOOP
LDRB R2, [R0], #1
STRB R2, [R1], #1
SUBS R7, R7, #1
BNE LOOP
STOP
B STOP
END
4、编写一程序,查找存储器从0x400000开始的100个字中为0的数目,将其结果存到0x400190中。
AREA zero,CODE,READONLY
ENTRY START
MOV R0, #0x400000
MOV R1, #0
MOV R7, #100 LOOP
LDR R2, [R0], #4
CMP R2, #0
BNE NEXT
ADD R1, R1, #1 NEXT
SUBS R7, R7, #1
BNE LOOP
STR R1, [R0]
END
5、用汇编语言编写程序读取存储器0x40003100地址上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。答:
COUNT EQU 0x40003100
;定义一个变量,地址为0x40003100
AREA Example2,CODE,READONLY;声明代码段Example2
ENTRY
;标识程序入口
CODE32
;声明32位ARM指令 START LDR R1,=COUNT
;R1 <= COUNT
MOV R0,#0
;R0 <= 0
STR R0,[R1]
;[R1] <= R0,即设置COUNT为0 LOOP LDR R1,=COUNT
LDR R0,[R1]
;R0 <= [R1]
ADD R0,R0,#1
;R0 <= R0 + 1
CMP R0,#10
;R0与10比较,影响条件码标志
/ 17
MOVHS R0,#0
;若R0大于等于10,则此指令执行,R0 <= 0
STR R0,[R1]
;[R1] <= R0,即保存COUNT
B LOOP
END
7、如何实现128位数的减法,请举例说明。AREA
EXAMPLE2,CODE,READONLY
ENTRY START
SUBS
R5,R5,R9
SBCS
R4,R4,R8
SBCS
R3,R3,R7
SBCS
R2,R2,R6 STOP
B
STOP
END
8、将存储器中起始地址地址0X10处的4个字数据移动到地址0X20处。
AREA
EXAMPLE2,CODE,READONLY
ENTRY LDR
R0,=0X10
;把地址0X10赋给R0 LDR
R5,=0X20
;把地址0X20赋给R5 START LDMIA
R0,{R1-R4}
;把R0为首地址的内存单元中的值依次赋给,;R1到R4,每次赋完一次值,R0自动加1
STMIA
R5,{R1-R4}
;把R1到R4的值依次赋给以R5为首地址的内存单元中,R5每次自动加1 STOP
B
STOP
;死循环 END
9参考CPSR寄存器中各标志位的含义,使处理器处于系统模式。
AREA
EXAMPLE2,CODE,READONLY
ENTRY START MOV
R0,#0X1F
;给R0赋值,2进制为11111 MSR
CPSR_c,R0
;把CPSR的条件位置1 STOP B
STOP
;死循环
END
10用跳转指令实现两段程序间的来回切换。
/ 17
AREA
EXAMPLE5
,CODE,READONLY ENTRY BL X
;跳到a对R0,R1,赋值 START
CMP
R0,R1
;比较R0,R1的值
BNE Y
;不等跳转到b
BEQ STOP
;相等时跳转到STOP X MOV
R0,#3
;对R0,R1赋值
MOV
R1,#2 MOV
R15,R14
;返回 Y ADD
R1,R1,#1
;R1自加1 B
START
;跳转到START STOP
B
STOP
;死循环
END
11字符串拷贝子程序,将r1指向的字符串拷贝到r0指向的地方,字符串以0作结束标志
AREA
SCopy, CODE, READONLY
EXPORT strcopy strcopy
;r0 points to destination string
;r1 points to source string
LDRB
r2, [r1],#1
;load byte and update address
STRB
r2, [r0],#1
;store byte and update address;
CMP
r2, #0
;check for zero terminator
BNE
strcopy
;keep going if not
MOV
pc,lr
;Return
END 12求两个数的最大值,并将最大值放R0寄存器
AREA MAX,CODE,READONLY ENTRY START MOV R1, #0x16 M0V
R2, #0x17 CMP R1, R2
MOVMI R0, R2 MOVPL R0, R1 STOP
B
STOP
END
13循环实现数的递减,即每次减1。最终结果为0时退出循环。
/ 17
AREA MAX,CODE,READONLY ENTRY START
MOV R0, #10 LOOP SUBS R0, R0, #1 BNE LOOP STOP
B
STOP
END
14改下列C程序段代码为ARM汇编程序段代码。void gcd(int a, int b){ while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;}
AREA MAX,CODE,READONLY ENTRY gcd CMP R0, R1 BEQ STOP BLT Less SUB R0, R0, R1 B STOP Less SUB R1, R1, R0 STOP
B
STOP
End
15分别编写一个函数和一个宏,实现字符串的复制。
MACRO
COPY
$P1,$P2
;定义一个宏
$P1 DCB
“HELLO”
;分配一个字节的空间,并初始化为一个字符串 $P2 DCB
“WORLD!”
;同上
LDR
R0,=$P1
;把P1的首地址加载到R0
LDR
R6,=$P2
;把P2的首地址加载到R1
LDRIA
R0,[R1-R5]
;
STRIA
R6,[R1-R5]
;
MEND
AREA
COPY,CODE,READONLY
/ 17
ENTRY START
COPY STR1,STR2
;调用宏
B
START
;死循环
END
/ 17
第二篇:实习总结-嵌入式ARM
实训总结
班级 卓越1301姓名***
通过这段时间的学习使我学到了很多知识,并且了解到ARM的应用以及对开发板的应用,为以后的学习奠定了一定的基础。
嵌入式系统一般定义为以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统这是从技术角度。从系统角度上是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。
广义上讲,凡是带有微处理器的专用软硬件系统都可称为嵌入式系统。如各类单片机和DSP系统。这些系统在完成较为单一的专业功能时具有简洁高效的特点。但由于他们没有操作系统,管理系统硬件核软件的能力有限,在实现复杂多任务功能时,往往困难重重,甚至无法实现。从狭义上讲,我们更加强调那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的嵌入式系统。
嵌入式的应用也比较广泛涉及军事国防、工业控制、消费电子和网络。在家用方面更是数字电视、信息家电、智能玩具、手持通讯、存储设备的核心。
在ARM指令集中了解到ARM的寻址方式以及它的的特性,具有高效、快速的特点,还有Thumb指令集具有灵活、小巧的特点。
在这次实训中做了两个项目,一个是LED灯,实现LED灯的点亮是比较简单的,通过查找手册可以很快的了解到要使用的寄存器和方法,另一个项目是DS18B20这个比较复杂,除了要掌握对寄存器的使用,还要对了解对串口的初始化,读写字节等等。
感谢这次实训,通过这次的实训项目,使我大体了解制作项目的步骤,了解了嵌入式技术的掌握是需要一个过程的。实事求是的说,嵌入式技术的全面掌握是有相当难度的,通过积累和动手总会有收获的,从实验中也明白了一个大的项目并不是一个人可以完成的,团队协作很重要。
姓名:***
年级:卓越1301
2014-7-5
第三篇:ARM实训总结
《嵌入式系统工程训练》实验报告
一、实验目的1、巩固嵌入式系统硬件结构的基本应用
2、巩固嵌入式系统程序编制的基本方法
3、了解嵌入式系统的工程设计要点
4、了解嵌入式系统的开发平台要点
5、学习μC/OS-II在ARM7上的移植
6、学习μC/OS-II嵌入式实时操作的基本原理与应用
7、运用所学内容完成一个基于操作系统的小课题
二、实训内容
1、熟练掌握LPC2210开发板的使用
2、基本了解嵌入式系统的工程设计一般方法
3、学习μC/OS-II在ARM7上的移植
4、学习μC/OS-II嵌入式实时操作基本概念、基本运用
5、结合课程内容与μC/OS-II运用完成一个小课题
三、实训条件(环境)
1、LPC2210开发板
2、PC机
3、ADS1.2集成开发环境
4、μC/OS-II实时操作系统
四、学习内容
1、LPC2210硬件内容
2、μC/OS-II嵌入式实时操作内容
3、嵌入式系统的工程设计内容
五、小课题:μC/OS-II在IIC上的应用
六、实训总结
这两周我们在原本ARM的学习基础上以μC/OS-II嵌入式实时操作系统展开了实训。主要内容是如何将嵌入式实时操作系统μC/OS-II移植到ARM7体系结构上,并将一直代码应用到具体的基于ARM7核的微控制器上。
对于这些天的所学到的内容,我稍稍的写了点心得,都是一些很基本的东西。首先把实验书上系统的例程序先跑了一遍,稍微了解一下板子的功能,熟悉下实验流程。先移例子,按照要求把source文件夹放在了softwareucos-II文件夹下,在这个文件夹下,存放得是系统移植的例子,其中有三个文件夹arm_pc,source,lpc2100是和系统移植相关的。当一个任务一旦建立,系统为这个任务配备了任务控制块且在任务就绪表中进行了就绪登记,这个任务就进入就绪态准备运行。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态,进入睡眠态的任务它的的任务控制块被剥夺,调用OSStart()可以启动多任务。OSStrart()函数运行进入就绪态的优先级最高的任务。
下载到目标板上的固态存储器指定地址当中,比如flash,EEPROM, ROM等等在程序执行之前,根据某些
描述文件,将需要读写数据的部分读出放入动态存储器比如RAM当中,然后程序从ROM开始执行或者有时为了提高程序的运行速度,也可以将所有的程序(有一些root的部分除外,以后会提及)通过一个描述文件放入指定的RAM当中,然后程序从RAM开始执行,但是这样会耗费大量的动态存储器,所以大部分程序会取折中的方法,将需要快速运行的部分和要读写的部分放入RAM中(一般读固态存储器的过程和动态存储器的过程是一样的,但是写就不同了,所以读写的部分一定要放到RAM中),而只读的部分和对速度要求不是那么高的部分放入固态存储器同时ARM结构的异常向量表规定放在地址为0x00000000开始的地址空间上,而一般的CPU为了提高异常相应速度,会将这个向量段remap到其他的RAM当中,所以在描述文件当中必须精确指定异常向量跳转程序的地址到remap的地方在application程序执行前,还需要由一些文件描述application程序执行的环境比如系统工作时钟,总线频率现在一般嵌入式编程语言为C,C 等 主程序中首先进行了操作系统初始化,然后创建了一个任务,最后启动了多任务运行环境。太简单了。再往下看创建的任务子函数TaskStart(),在这个函数中又创建了。了解到在启动多任务环境前需要至少创建一个任务,我想TaskStart()任务就应该是这个原因放在了 OSStart()之前。
中断级任务调度,和任务级调度。我的理解是当发生中断时,操作系统内核判断此时是否有更高优先级的就绪任务,有的话进行任务调度。任务级调度就是当前任务在执行过程中主动执行任务调度,将权力交给内核。
但是这个中断是怎么产生的呢,我又看到了时钟节拍的概念,时钟节拍(clock tick):P67页中说道时钟节拍是特定的周期性中断。有两种作用:这种周期性的定时中断一来为内核提供一个时间标准,例如某个任务要延时多长时间,可以通过纪录这种中断来完成(中断的时间是已知的,但应当是可更改的),二 为任务切换提供了时间片,任务之间的调度是按时完成的,就是在一个时钟节拍后来进行P68-P69中的图形说明了这一点。以前不明白每个任务是一个死循环,在每个程序中都有一个OSTimeDly(),这个函数是将任务挂起,将控制权交给内核,内核进行任务调度,从就续的任务中找到优先级最高的任务执行,这是一种调度。那么当一个低优先级任务在执行时,如果在等待一个信号,可能要等很长时间,那么内核不能一直在这里等待这个信号的到来,别的高优先级任务可能已经就绪,那么就需要进行任务调度,何时调度呢?这时就应该是时钟节拍所起到的作用,每一个时钟节拍到达后进入中断处理函数,进行任务调度。
所以总的理解应当是内核在每个时钟节拍到来时进行一次任务调度,这是大前提,使每个任务都有相同的权利执行相同的时间。有时个别任务在一个时钟节拍内早已完成,这时需要向内核提前交权,让内核进行任务调度。
第四篇:ARM学习心得
ARM linux学习心得(zt)
2008-08-13 13:55
由于很多人总问这个问题,所以这里做一个总结文档供大家参考。
这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的人就是远比WinCE多。在和很多工作的人交流时我了解到,他们公司从没考虑使用WinCE,因为成本高,都是使用linux进行开发。我读研究生的的实验室中也没有使用WinCE的,大都研究linux,也有少部分项目使用vxwork,但是就没有听说过使用WinCE的,原因就是开源!当然现在WinCE6.0听说也开源,不过在成本和资源上linux已经有了无人能挡的优势。与此相对应的是,越来越多的电子厂商已经开始使用linux开发产品。举个例子,Google近期开发的智能手机操作系统Android其实就是使用linux-2.6.23内核进行改进得到的。
第一,学习基本的裸机编程。
对于学硬件的人而言,必须先对硬件的基本使用方法有感性的认识,更必须深刻认识该硬件的控制方式,如果一开始就学linux系统、学移植那么只会马上就陷入一个很深的漩涡。我在刚刚开始学ARM的时候是选择ARM7(主意是当时ARM9还很贵),学ARM7的时候还是保持着学51单片机的思维,使用ADS去编程,第一个实验就是控制led。学过一段时间ARM的人都会笑这样很笨,实际上也不是,我倒是觉得有这个过程会好很多,因为无论做多复杂的系统最终都会落实到这些最底层的硬件控制,因此对这些硬件的控制有了感性的认识就好很多了
学习裸机的编程的同时要好好理解这个硬件的构架、控制原理,这些我称他为理解硬件。所谓的理解硬件就是说,理解这个硬件是怎么组织这么多资源的,这些资源又是怎么由cpu、由编程进行控制的。比如说,s3c2410中有AD转换器,有GPIO(通用IO口),还有nandflash控制器,这些东西都有一些寄存器来控制,这些寄存器都有一个地址,那么这些地址是什么意思?又怎么通过寄存器来控制这些外围设备的运转?还有,norflash内部的每一个单元在这个芯片的内存中都有一个相应的地址单元,那么这些地址与刚刚说的寄存器地址又有什么关系?他们是一样的吗?而与norflash相对应的nandflash内部的储存单元并不是线性排放的,那么s3c2410怎么将nandflash的地址映射在内存空间上进行使用?或者简单地说应该怎么用nandflash?再有,使用ADS进对ARM9行编程时都需要使用到一个初始化的汇编文件,这个文件究竟有什么用?他里面的代码是什么意思?不要这个可以吗?
诸如此类都是对硬件的理解,理解了这些东西就对硬件有很深的理解了,这对以后更深一步的学习将有很大的帮助,如果跳过这一步,我相信越往后学越会
觉得迷茫,越觉得这写东西深不可测。因为,你的根基没打好。
不过先声明一下,本人并没有使用ADS对ARM9进行编程,我是学完ARM7后直接就使用ARM9学linux系统的,因此涉及使用ADS对ARM9进行编程的问题我很难回答^_^,自己去研究研究吧。
对于这部分不久将提供一份教程,这个教程中的例程并不是我为我们所代理的板子写的,是我在我们学院实验室拿的,英培特为他们自己的实验箱写的,不过很有借鉴意义,可以作为一份有价值的参考。
第二,使用linux系统进行一些基本的实验。
在买一套板子的时候一般会提供一些linux的试验例程,好好做一段时间这个吧,这个过程也是很有意义的,也是为进一步的学习积累感性认识,你能想象一个从没有使用过linux系统的人能学好linux的编程吗?好好按照手册上的例程做一做里面的实验,虽然有点娃娃学走路,有点弱智,但是我想很多高手都会经历这个过程。
在这方面我们深蓝科技目前没有计划提供相应的例程,主要是开发板的提供商会提供很丰富的例程,我们不做重复工作,只提供他们没有的、最有价值的东西给大家。
第三,研究完整的linux系统的的运行过程。
所谓完整的linux系统包括哪些部分呢?
三部分:bootloader、linux kernel(linux内核)、rootfile(根文件系统)。那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基。介绍这方面的资料网上可以挖掘到几吨,自己好好研究吧。第四,开始做系统移植。
上面说到完整的linux有3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的便是自己动手学会制作这些东西。
当然我不可能叫你编写这些代码,这不实现。事实上这个3者都能在网下载到相应的源代码,但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行在你的板子上,这个修改的过程就叫移植。在进行移植的过程中你要学的东西很多,要懂的相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。
在这个过程中如果你很有研究精神的话你必然会想到看源代码。很多书介绍你
怎么阅读linux源代码,我不提倡无目的地去看linux源代码,用许三多的话说,这没有意义。等你在做移植的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C语言编程水平再去看。
至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会告诉你怎么解决,这时就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保证能解决你的问题,因为我未必遇到过你的问题,不过我相信能给你一点建议,也许有助你解决问题。
这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包,然后进行修改,最终运行在板子上。
盗用阿基米德的一句话:“给我一根网线,我能将linux搞定”。
第五,研究linux驱动程序的编写。
移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开发。
Linux的驱动程序可以说是五花八门,linux2.4和linux2.6的编写有相当大的区别,就是同为linux2.6但是不同版本间的驱动程序也有区别,因此编写linux的驱动程序变都不是那么容易的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。
这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。第六,研究应用程序的编写。
做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的还是qt/e函数库。我一直就使用这个函数库来开发自己的应用程序,不过我希望你能使用国产的MiniGUI函数库。盗用周杰伦的广告词就是“支持国产,支持MiniGUI”。MiniGUI的编程比较相似Windows下的VC编程,比较容易上手,效果应该说是相当不错的,我曾使用过来开发ARM7的程序。不过MiniGUI最大的不好就是没有像qtopia这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是MiniGUI的版权拥有者)合作使用MiniGUI函数库开发像qtopia这样的图形操作平台,不过由于水平有限这只能是幻想了,呵呵。
完成这一步你基本就学完了嵌入式linux的全部内容了。
还有一个小小的经验想和大家分享。我在学习嵌入式linux的过程中很少问人,客观原因是身边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问题。这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解决问题,这样,个人的解决问题能力就显得非常关键了。因此我的建议就是一般的问题到网上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人帮你解决问题。
记住,问题是学习的最好机会。
第五篇:arm心得.
心得体会(许晶)
本次实习时间是一周,我们组所选的题目是直流电动机转速控制设计,其要求有:硬件部分要求在LPC2100系列ARM的最小系统的基础上,设计通过按键控制直流电动机速度的驱动电路,要求通过LPC2100内置的PWM发生器控制直流电动机;并将电动机速度通过串口送至PC机。软件部分要求设计以上功能的脱机运行程序,并在试验室调试通过。我负责的是硬件部分。首先我将系统分为两部分。一是电动机控制驱动电路;二是ARM最小系统。在电动机驱动中,直流电机控制使用了H桥驱动电路,控制口线为P0.21、P0.22。在ARM最小系统中,分为5部分:电源电路、复位电路、JTAG接口电路、RS232串口电路、时钟电路。
在制作原理图中,我查阅了实验指导书和课本。我所选用的是2114板子。因为LPC2114是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-STM CPU的微控制器,并带有128/256 k字节(kB)嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
在这个过程中,我注意到了许多问题。通过最小系统的制图,我对一些问题逐渐了解,不像刚开始学习一样,感觉什么也不懂,硬装知识。我画了5部分,这几个部分让我对书上的内容更加深了学习。如:时钟电路中,我就把时钟系统和晶体振荡两节课程,重新学习。
而在软件设计中,在我的搭档编程完之后,我也对程序进行了研究。在主程序中,我们用的是i、j表示速度与方向,正转为“+”、反转为“—”;最小速度为1,最大速度为4。先让电机正向慢慢的加速,加到正传的最大速后,在按下就变成反转,然后在依次加速,往返循环,直至没有按键按下。所运用的是,调节PWM的占空比就能达到电机的速度调节。
我们组在硬件中遇到的问题并不多,主要是在画各部分原理图时找器件很不熟练,不能很快的找到。这说明我不经常用软件。其实这个软件制图很方便,各种器件几乎都能找到,找不到时也可以在上面画图。
软件中,程序在编译正确后,下载方面出现了许多问题,如连接不上;不能生成hex文件等。其实这些问题,都是因为我们对软件不熟悉所造成的。在我们多次调试、链接之后,终于完成。
经过一周实习,是我对ARM系统有了更深刻的认识。因为前期大家都找工作的原因,我并没有特别认真的学习,而这次的实习,可以让我重新再次拿起课本,认真学习。并且使我感触最深的是,由于嵌入系统的广泛应用,我应该更好的去学习它、掌握它。像掌握办公自动化一样,成为必不可少的技术。