加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

ARM内核的中断技术

时间:2013-11-23  来源:123485.com  作者:9stone

摘要:以ARM7TDMI处理器为例,详细介绍ARM内核的三种中断:常规中断、快中断和软件中断;结合应用,给出优化的中断处理程序的ARM指令代码,对电子设计人员有效大的参考价值。

    关键词:ARM 中断 快速 精简指令系统

1 ARM7TDMI简介

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个私有工作寄存器,从而避免了由于主工作寄存器数据的保存和恢复而带来了额外开销;③快中断处理程序处于异常向量表的最后位置,因此可紧接异常向量表书写快中断处理程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。

软件中断是一种由用户设置的同步中断,由程序指令产生,不像硬件中断那样由外部事件触发。软件中断允许运行在用户模式的程序进入监督模式,并运行监督态下的函数。在 ARM7TDMI的硬件调试系统中,应用程序可利用软件中断来申请半自主(semihosting)式操作,例如,打开主机中的一个文件、向调试通道发送一个字符等等(这些操作必须依赖主机中C程序库才能运行,因此被称为半自主式的)。利用软件中断机制,可以直观和高效地仿真调试应用程序。另外,软件中断也可用于一般性的程序控制。

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)快中断处理程序的编写

为保证高速处理,快中断处理程序必须要用汇编语言编写,而且必须是非重入的。一般快中断处理程序主要是些数据存取指令,就不具体介绍了。

结束语

中断技术是处理器和系统芯片开发的重要技术。快速、高效的中断处理程序是实时多任务系统设计成功的关键。


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门