ARM7TDMI 异常有哪些?41-47
==异常中断的进入与退出,异常有:进入异常、退出异常、复位异常、中断请求异常 IRO、快速中断请求异常
FIQ、未定义的指令异常、中止异常(预取指中止异常、数据中止异常)、SWI 软件中断异常、中断延迟。优先
级从高到低为 复位、数据终止、FIQ、IRQ、预取指终止、未定义指令、软件中断 SWI
ARM 复位时处理器的操作有哪些?42
==强制 M[4:0]变为 b,系统进入管理模式;
将 CPSR 中的控制位 I 和 F 置位,IRQ 与 FIQ 中断禁止;
将 CPSR 中的控制位 T 清零,处理器处于 ARM 状态;
强制 PC 从地址 0x00 开始对吓一跳指令进行取指;
返回到 ARM 状态并恢复执行。|在系统复位后,进入管理模式对系统初始化。复位后,除 PC 和 CPSR 之外的所有
请描述进入内核时异常操作步骤?
寄存器的值都是随机的。
==在 LR 中保存下一条指令地址//在 CPSR 复制到适当的 SPSR//根据异常将 CPSR 模式强制设为某一值//强制 PC 从相
关的异常处取指//异常结束时,异常处理程序必须将 LR 中的值减去便宜响亮后移入 PC//将 SPSR 的值复制回
CPSR//轻灵在入口置位的中断禁止标志
CPSR、存储器映射是什么?
== CPSR:程序状态寄存器(current program status register) cpsr 在用户级编程时用于存储条件码;CPSR 包含条
件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息。
存储器本身不具有地址信息,给存储器分配地址的过程称为存储器映射。
CPSR 的组成
==N 负标志位运算结果的第 31 位值.记录标志设置的结果。
Z 零标志位如果标志设置操作的结果为 0则置位。
C 进位标志位记录无符号加法溢出.减法无错位.循环移位。
V 溢出标志位记录标志设置操作的有符号溢出。
I 中断禁止标志位置位时禁止 IRQ 中断.否则允许 IRQ 中断使能。
F 中断禁止标志位置位时禁止 FIQ 中断.否则允许 FIQ 中断使能。
T 控制位置位时处理器运行在 Thumb 状态下清零时处理器运行在 ARM 状态下。
M0~M4 模式控制位.定义处理器的 7 中模式
B 指令、BL 指令、BX 指令三者之间有什么联系和区别?
==B(分支指令) 指令格式 B{cond} label
BL(带链接的分支指令) BL{cond} label
BX(带状态切换的分支指令) BX{cond} Rm
B 指令跳转到指定的地址去执行程序;
BL 指令先将下一条指令的地址复制到 R14(即 LR)链接寄存器中,然后跳转到指定地址,运行程序。
BX 指令跳转到 Rm 指定的地址去执行程序。若 Rm 的 bit0 为 1,则跳转时自动将 CPSR 中的标志 T 置位,即把目标
地址的代码解释为 Thumb 代码;若 Rm 的 bit0 为 0,则跳转时自动将 CPSR 中标志 T 置位,即把目标地址的代码
解释为 ARM 代码。
实时操作系统有哪些特征?7
==实时操作系统是时间驱动的(event driven),其特点为:异步的事件响应、切换时间和中断延迟时间确定、优
先级中断和调整、抢占式调整、内存锁定、连续文件、同步。 其三大特性为:可剪裁性、实时性、可靠性
ARM 指令集中指令可以分为哪几个大类指令?
==指令格式、条件码、ARM 存储器访问指令、ARM 数据处理指令、乘法指令、ARM 分支指指令、ARM 杂项指令、ARM
伪指令
uC/OS 系统的特点?
==提供源代码//可移植//可固化//可剪裁//可剥夺//多任务//可确定性//任务栈//系统服务//中断管理//稳定性
与可靠性
ARM7TDMI-S 是什么?
==ARM7-TDMIS 是 ARM7TDMI 的可综合版本(软河),对应用工程师来说,除非芯片生产厂商對 ARMTDMIS 进行了剪裁,
否则在逻辑上`s 和 没有太大区别。|ARM7TDMI 是基于 ARM 体系结构 V4 版本低端 ARM 核,从 ARM6 核发展而来,但
7 弥补了 6 的不足,并在短时间增加了 64 位乘法指令(带 M 后缀的)、支持片上调试(带 D 后缀的)、高密度 16
位 Thumb 指令集扩展(T)和 Embedded ICE 硬件防震功能模块(I),形成了 ARM7TDMI
嵌入式处理器?
==嵌入式处理器是嵌入式系统的核心,是控制、辅助系统运行的硬件单元。
嵌入式处理器主要有四类:嵌入式微处理器(MPU)、嵌入式微控制器(MCU)、嵌入式 DSP 处理器(EDSP)和 SoC 片上
系统。
请描述进入内核时异常操作步骤?
==在 LR 中保存下一条指令地址//在 CPSR 复制到适当的 SPSR//根据异常将 CPSR 模式强制设为某一值//强制 PC 从相
关的异常处取指//异常结束时,异常处理程序必须将 LR 中的值减去便宜响亮后移入 PC//将 SPSR 的值复制回
CPSR//轻灵在入口置位的中断禁止标志
请说明 MOV 指令与 LDR 加载指令的区别和用途
==LDR 的操作数既可以来源于寄存器也可以来源于存储器.MOV 的操作数只能来源于寄存器。|||LDR 指令从内存中
读取数据放入寄存器.用于对内存变量和数据的访问、查表、程序的跳转、外围部件的控制操作等.MOV 指令将 8
位立即数或寄存器传送到目标寄存器.Rd 用于移位运算等操作。
存储器重映射是什么?
==为了增加系统的灵活性,系统中有部分存储单元可以重复出现在不同的地址上。
AHB(先进的高性能总线)和 VPB(VLSI 外设总线)外设区域都为 2M 字节,可各分配 128 个外设。每个外设空
间的规格都为 16K 字节,这样就简化了每个外设的地址译码。如果试图访问一个保留区域地址或未分配区域地址,
ARM 处理器将产生预取指中止或数据中止异常。
请说明 MOV 指令与 LDR 加载指令的区别和用途
==LDR 的操作数既可以来源于寄存器也可以来源于存储器.MOV 的操作数只能来源于寄存器。
LDR 指令从内存中读取数据放入寄存器.用于对内存变量和数据的访问、查表、程序的跳转、外围部件的控制操
作等.MOV 指令将 8 位立即数或寄存器传送到目标寄存器.Rd 用于移位运算等操作。
寄存器寻址方式
1.寄存器寻址;
MOV R1,R2 ;将 R2 的值存入 R1
2.立即寻址;SUBS R0,R0,#1 ;R0 减 1,结果放入 R0,并且影响标志位
3.寄存器移位寻址;MOV R0,R2,LSL #3
;R2 的值左移 3 位,结果放入 R0
4.寄存器间接寻址;LDR R1,[R2] ;将 R2 指向的存储单元的数据读出;保存在 R1 中
5.基址寻址;LDR R2,[R3,#0x0C]
;读取 R3+0x0C 地址上的存储单元 ;的内容,放入 R2
6.多寄存器寻址;LDMIA R1!,{R2-R7,R12}
7.堆栈寻址;
8.相对寻址。
PINSEL0 &= 0xFFFFFFFC;(1) 设置引脚连接模块,P0.0 为 GPIO
IO0DIR |= 0x00000001;(2) 设置 P0.0 口方向,设置为输出
IO0SET = 0x00000001;(3) 设置 P0.0 口状态,输出高电平
CMP
R0,R1
ADDHI R0,R0,R5
SUBLS R1,R1,R5
ARM 指令集 非法指令集
==Immed_8r-常数表达式,须对应 8 位位图(Pattern),即常数是由一个 8 位常数循环移位偶数得到的;非法常量:
0x1FE、511、0xFFFF、0x1010、0Xf0000010
接设有一个基于 LPC2114 的系统,所使用的晶振为 11.0592MHz 适应晶振,请计算出最大的系统时钟频率(CCLK)
为多少 M?此时 PLL 的 M 和 P 值各多少?请列出计算公式;并编写设置 PLL 的程序段
==由公式:Fcclk=M*Fosc,要使 Fcclk 最大,Fosc=11.0592MHz,必 M 为最大时满足条件,因 LPC2110 的 Fcclk 最
大值为 60MHz,而 60/11.0592~5.4
Mmax 仅能设置为 5/当前条件下的最大的系统时钟 Fcclk=5*11.0592=55.296MHz,此时 M 值为 5,写入 MSEL 的值
为 4;又因公式:Fcco=Fosc*M*@*P;而 Fcco 在 156-320MHz 内,因此:156/(11.0592*5*2)~1.4
PLLCFG=60/Fosc-1
PLLCFG=(PLLCFG&0x1F)|((320/(11.0952*5*2)-1)<<5)
PLLFEED=0xaa;
PLLFEED=0X55;
锁相环---------------------------
== Fosc = Fcco/(2×p×M)
Fcco = Fosc×(2×p×M)
Fcclk = Fcco/(2×p)
Fcco = Fcclk×(2×p)
最后得出 PLL 的输出频率(当 PLL 激活并连接时)为:
Fcclk = M×Fosc 或 Fcclk = Fcco /(2×P)
CCO 输出频率为:
Fcco = Fcclk×2×P 或 Fcco = Fosc×M×2×PPLL 设置:
系统要求 Fosc=10MHz,Fcclk=60MHz。
根据这些要求:确定 Fcclk=60MHz;选择 Fosc=10MHz;计算 M= Fcclk/Fosc=60MHz/10MHz=6。M-1=5,所以
写入 PLLCFG[4:0]=00101;
计算 P=Fcco/( Fcclk*2),其中 Fcco 为 156~320 MHz。
当 Fcco=156MHz 时,P=156MHz/(2*60MHz)=1.3
当 Fcco=320MHz 时, P=2.67 P 取整数 2,所以写入 PLLCFG[6:5]=01。
uint8 PLLSet(uint32 Fcclk, uint32 Fosc, uint32 Fcco)
{
uint8 i;
uint32 plldat;
i=(Fcco / Fcclk);
switch(i) {
case 2: plldat = ((Fcclk / Fosc) - 1) | (0 << 5); break;
case 4: plldat = ((Fcclk / Fosc) - 1) | (1 << 5); break;
case 8: plldat = ((Fcclk / Fosc) - 1) | (2 << 5); break;
case 16: plldat = ((Fcclk / Fosc) - 1) | (3 << 5); break;
default: return(FALSE); break;
}
PLLCON = 1;
PLLCFG = plldat;PLLFEED = 0xaa;PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0); PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
return(TRUE);
简述 ARM7 三级流水线,说明其对程序设计的影响
==``三级流水线分为取指段、分析段和执行段。对程序设计的影响:提高指令执行的速度,并使处理和存储系统连
续操作。
ARM Thumb
PC PC 取指
PC-4 PC-2 译码
PC-8 PC-4 执行
64 位加减法?
== AREA Example,CODE,READONLY
ENTRY
CODD32
START ADDS R1,R1,R2 //减法 为 SUBS
ADC R3,R3,R4 //减法 为 SBC
END
比较两个值的大小,并进行相应加 1 处理
==CMP RO,R1
ADDHI RO,RO,#1 //若 RO>R1,则 RO=R0+1
ADDLS R1,R1,#1
If((a!=10)&&(b!=20)) a=a+b
==CMP R0,#10
CMPNE R1,#20
CMPNE R0,R0,R1
(1)小端格式:一个字当中最低地址的字节被看作是最低位字节,最高位地址的字节被看作是最高位字节
(2)大端格式:ARM 处理器将最高位字节保存在最低字节,最低字节保存在最高地址。
堆栈指针 R13(SP)
==堆栈操作通常会发生在子程序调用,异常发生或者程序运行过程中寄存器数量不够时。连接寄存器 R14(LR):子
程序的返回地址将自动的保存到 R14 中,分别有 R14_svc,R14_abtR14_und,R14_irq,R14_fiq。程序计数器 R15(PC):
总是指向正在取指的指令
什么是嵌入式系统?
==嵌入式系统是以应用为中心,以计算机技术为基础,软件硬件可剪裁,适应应用系统对功能、可靠性、成本、体
积及功耗严格要求的专用计算机系统,具有完成复杂功能的硬件和软件且紧密耦合在一起的计算机系统。
三个基本特点为 嵌入性、专用性、计算机
I2C 总线:
==I2C 总线是 Philips 推出的串行传输总线,它以 2 根连线实现了完善的全双工同步数据传送,可以极方便地构成
多机系统和外围器件扩展系统。
发送器:本次传送中发送数据(不包括地址和命令)到总线的器件;
接收器:本次传送中从总线接收数据(不包括地址和命令)的器件;
主 机:初始化发送、产生时钟信号和终止发送的器件,它可以是发送器或接收器。主机通常是微控制器。
从 机:被主机寻址的器件,它可以是发送器或接收器。
ARM 体系结构支持多少种处理器模式?
==用户模式、快速中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式
其状态是指 16 位 Thumb 指令集运行的 Thumb 状态和 32 位 ARM 指令集运行的 ARM 状态
ARM->Thumb Thumb->ARM
CODE32 CODE16
LDR R0,Lable+1 LDR R0,Lable
BX R0 BX RO
CODE16 CODE32
Lable MOV R1,#12 Lable MOV R1,#10
GPIO 的操作:设置 P0.0 输出高电平
PINSEL0 &= 0xFFFFFFFC;
1) 设置引脚连接模块,P0.0 为 GPIO
IO0DIR |= 0x00000001;
2) 设置 P0.0 口方向,设置为输出
IO0SET = 0x00000001;
3) 设置 P0.0 口状态,输出高电平读取 P0.0 引脚状态
处理器状态切换方法:
从 ARM 状态切换到 Thumb 状态
DODE32
LDR R0,=LABLE+1
BX R0
CODE16
Lable MOV R1,#12
从 Thumb 状态切换到 ARM 状态
CODE16
LDR R0,=LABLE
BX R0
CODE32
Lable MOV R1#10
G P I O
==设置 I/O 口输出电平状态需要完成三步
PINSEL0&=0Xfffffffc; 先设置引脚连接模块,将 P0.0 设置为 GPIO 功能
IO0DIR |=0x0000001 然后将 P0.0 设置为输出
IO0SET =0x0000001; 设置 P0.0 输出高电平
使用 GIIO 控制蜂鸣器
#include “config.h”
#define BEEPCON 0x0000080 /P0.7 引脚控制 B1,低电平蜂鸣
void DelayNS(uint32 dly) /长软件延时,dly 为延时参数,越大则延时越久
{
Uint32 I;
For(;dly>0;dly--)
For(i=0;i<5000;i++);
}
Int main(void) /控制蜂鸣器蜂鸣
{ PINSEL0=0x00000000; /引脚链接 GPIO
IO0DIR=BEEPCON; /设置 I/O 为输出
While(1)
{IO0SET=BEEPCON; / BEEPCON=1
DelayNS(10); / BEEPCON=0
IO0CLR=BEEPCON;
DelayNS(10);
}
Return(0);
}