1 ARM7TDMI
谈及ARM7TDMI就有必要先了解一下有关于它的其它知识:
ARM(Advanced RISC Machines)是微处理器行业的一家企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。
ARM公司是苹果、Acorn、VLSI、Technology等公司的合资企业。ARM将其技术授权给世界上许多的半导体、软件和OEM厂商,每个厂商得到的ARM公司(6张)都是一套的ARM相关技术及服务。利用这种合伙关系,ARM很快成为许多性RISC标准的。
目前,采用 ARM技术知识产权( IP )核的微处理器,即我们通常所说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75 %以上的市场份额, ARM 技术正在逐步渗入到我们生活的各个方面。
ARM7系列处理器是英国ARM公司设计的主流嵌入式处理器,内核是0.9MIPS/MHz的三级流水线和冯·诺伊曼结构;ARM7TDMI是一款经典的通用32位微处理器,采用精简指令系统(RISC)和流水线结构。典型应用如GPS、PDA、双向寻呼机、移动电话、板卡间高速通信等。
ARM7TDMI定义有7种工作模式,本文涉及到的有:用户模式,程序正常运行时的模式;快中断模式,处理器响应快中断而进入的模式;中断模式,处理响应常规中断而进入的模式;监督模式,操作系统的保护模式。处理器响应软件中断时即进入监督模式。下面重点介绍ARM7TDMI的中断特性。主要特性如表1所列。
表1 中断特性表
向量地址 | 中断类型 | 工作模式 | 优先级 | 返回地址 |
0x8 | 软件中断 | SWI模式 | 6 | pc-4 |
0x18 | 常规则中断 | IRQ模式 | 4 | pc-8 |
0x1C | 快中断 | FIQ模式 | 3 | pc-8 |
ARM7TDMI具有常规中断(IRQ)、快中断(FIQ)和软件中断(SoftWare Interrupt)三种中方式。常规中断和快中断都是硬件中断。
快中断
快中断是为支持数据传输或快速数据通道而设计的,为快速处理快中断。
①快中断被设为中断优先级;
②在快中断模式增设了7个私有工作寄存器,从而避免了由于主工作寄存器数据的保存和恢复而带来了额外开销;
③快中断处理程序处于异常向量表的位置,因此可紧接异常向量表书写快中断处理程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。
软件中断
编程异常通常叫做软中断,软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式,中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能,软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
①软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
②软中断是由程序调用发生的,而硬中断是由外设引发的
③硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间
2 响应中断和中断返回
(1)当中断产生时,ARM7TDMI将执行的操作
①把当前程序状态寄存器(CPSR)的内容拷贝到相应的备份程序状态寄存器(SPSR)。当前工作模式、中断屏蔽位和状态标志被保存下来。
②转入相应的模式,并关闭常规中断。如响应快中断,则同时关闭快中断。
③把程序计数器(pc)的值减4后,存入相应的连接寄存器(1r)。
④将程序计数器指向相应的中断向量。
(2)由中断返回时,ARM7TDMI将完成的操作
①将备份程序状态寄存器的内容拷贝到当前程序状态寄存器,恢复中断前的状态。
②清除相应禁止中断位(如果已设置的话)。
③把连接寄存器的值拷贝到程序计数器,继续运行原程序。
(3)返回地址的计算
ARM7TDMI采用流水线结构:当一条指令被执行时,下一条指令正被译码,而第三条指令被从内存中取出。当程序计数器未更新的,pc指向从内存中取出的指令,(pc-4)指向当前指令的一条指令。处理器响应软件中断时,由于软件中断由指令自身产生,程序计数器还没有更新,(pc-4)正好指向当前指令的下一条指令。因此,只要在中断处理程序加入MOVS pc,lr把连接寄存器的值赋给程序计数器即可。ARM7TDMI总是在一条指令执行完毕后,才去检查是否有硬件中断信号和中断屏蔽状态。此时,程序计数器已经更新,(pc-4)指向当前指令的下两条指令。因此要先把连接寄存器的内容减去4(指向pc-8)后,再赋给程序计数器。要添加的代码是SUBS pc,lr #4
3 中断处理程序的编写
(1)软件中断处理程序的编写
软件中断指令的格式如图1所示。低24位立即数为软件中断号。在中断处理程序中,必须首先得到软件中断号,然后根据中断号执行不同代码。以下的中断处理程序,在软件中断号为1时,将端口A的0号引脚置“1”。
STMFD sp!,{r0-r12,lr} //保存各工作寄存器
LDR r0,{lr,#-4} //得到该软件中断指令
BIC r0,r0,#0xff000000 //从中取出中断号
ADR r2,SWIJumpTable //r2指向代码入口表
LDR pc,[r2,r0,LSL #2] //把r0中的值乘4后加到r2。将//程序计数器指向中断号对应的代码入口地址
SWIJumpTable //代码入口表
DCD SWInum0
DCD SWInum1
……
SWInum0 //中断号为0时的处理代码(略)
SWInum1 //中断号为1时的处理代码
MOV r0,#0x80000000 //r0指向端口A
STRB r0,#0x01 //A口0脚置“1”
B EndofSWI //跳转
EndofSWI
LDMFD sp! {r0-r12,pc} //恢复各寄存器,返回原程序
(2)常规中断处理程序的编写
为快速执行,常规中断处理程序一般用汇编指令编写。在编写可重入常规中断处理程序(运行时仍可响应常规中断)时,必须先把链接寄存器和程序用到的工作寄存器入栈,然后才能开放中断;各寄存器出栈前,必须先关闭中断。这样可防止因寄存器崩溃而无法返回的情况发生。下文介绍了一个与中控制器相配置的可重入的常规中断处理程序。当若干中断源同时有效时,中断控制器(基址为IntBase)把16个中断源中优先级的一个存入中断寄存器(偏移地址为IntLevel)中,并发出硬件中断信号。
SUB lr,lr,#4 //得至并保存返回地址
STMFD sp!,{lr}
MRS r14,SPSR //把SPSR和sl2入栈
STMFD sp!,{r12,r14}
MOV r12,#IntBase
LDR r12,[r12,#IntLevel] //将优先级号存入r12
MRS r14,CPSR. //开中断
BIC r14,r14,#0x80
MSR CPSR_c,r14
LDR PC,[PC,r12,LSL #2] //将pc指向该优先级号对应的处理代码入口
NOP //补位
DCD Priority0Handler //代码入口表
DCD Priority 1 Handler
DCD Priority 2 Handler
……
Priority0Handler //0优先级中断处理代码
STMFD sp!,{r0-r11} //保存工作寄存器
……(略) //具体代码
LDMFD sp!,{r0-r11} //恢复工作寄存器
MRS r12,CPSR //关中断
ORR r12,r12,#0x80
MSR CPSR_c,r12
LDMFD sp!,{r12,r14} //恢复r12
MSR SPSR_csxf,r14 //恢复备用程序状态寄存器(SPSR)
LDMFD sp!,{pc}^ //返回原程序
Priority 1 Handler //优先级中断处理代码(略)
(3)快中断处理程序的编写
为保证高速处理,快中断处理程序必须要用汇编语言编写,而且必须是非重入的。一般快中断处理程序主要是些数据存取指令,就不具体介绍了。
结束语
中断技术是处理器和系统芯片开发的重要技术。快速、高效的中断处理程序是实时多任务系统设计成功的关键。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。