介绍ARM7内核的中断屏蔽方法

发布者:painter最新更新时间:2021-02-02 来源: eefocus关键字:ARM7内核  中断  屏蔽方法 手机看文章 扫描二维码
随时随地手机看文章

0 引言

CPU在执行程序的过程中,由于外部的某种原因,有必要尽快地中止当前程序的执行,而去执行相应的处理程序,待处理结束后再回来继续执行被中止了的原程序,这种情况称为“中断”。从事嵌入式开发的工程师对中断的概念都很熟悉,在x86系列CPU体系中,软件设计人员会调用enable()函数和disable()函数来允许或屏蔽中断。enable()和disable()是两个库函数,函数disable()的作用是屏蔽中断,它唯一允许执行的中断是NMI(不可屏蔽中断);函数enable()的作用与函数disable()相反,是将被屏蔽的中断打开,允许中断。这两个函数的原型都是在头文件DOS.H中定义的,DOS.H定义的都是一些DOS接口函数。DOS的全称为“Disk Operating System”,即“磁盘操作系统”,是一种在x86系列的微型计算机上运行的操作系统。


x86和ARM是两种不同体系的微处理器,ARM不支持DOS接口函数,在ARM公司提供的集成开发环境ADS1.2的头文件中没有DOS.H文件,DO-S.H中定义的所有函数在arm的编译器中都不支持,所以需要重新设计两个函数替代上述函数,以实现相同的功能。


1 arm7处理器简介

ARM是Advanced RISC Machines的缩写,ARM公司开发了很多系列的ARM处理器内核,ARM7处理器就是其中的一个系列,其中包括ARM7TD-MI、ARM7TDMI-S、带有高速缓存处理器宏单元的ARM720T和扩充了Jazelle的arm7EJ-S。该系列处理器提供Thumb 16位压缩指令集和Embeded-ICE软件调试方式,多应用于多媒体和嵌入式设备,包括Internet设备、移动电话、PDA等。


2 arm7中断工作模式

arm7处理器具有2个中断输入,分别为IRQ中断和FIQ中断,如图1所示。其对应的中断操作模式为向量中断IRQ模式(用于通用中断处理)和快速中断FIQ模式(支持数据传输或通道处理)。




向量中断请求(IRQ)是一个由nIRQ输入端的低电平所产生的正常中断。IRQ的优先级低于FIQ,对于FIQ序列它是被屏蔽的。任何时候在一个特权模式下,都可通过置位当前程序状态寄存器(CPSR)中的I位来禁止IRQ。


快速中断请求(FIQ)支持数据转移或通道处理,在ARM状态中,FIQ模式有8个专用的寄存器可用来满足寄存器保护的需要,这是上下文切换的最小开销。将nFIQ信号拉低可实现外部产生FIQ。在一个特权模式中,可通过置位当前程序状态寄存器(CPSR)中的F标志来禁止FIQ异常。当F标志清零时,arm7处理器在每条指令结束时检测FIQ同步器输出端的低电平。


3 arm7中断屏蔽程序实现

arm7内核包含1个当前程序状态寄存器(CPSR),该寄存器中包含条件代码标志位、控制中断的使能和禁止位,以及设置处理器操作模式位。当前程序状态寄存器如图2所示。

当前程序状态寄存器的控制位中包含2个中断禁止位——I和F位:当I位置位时,禁止IRQ中断,清零时允许IRQ中断;当F位置位时,禁止FIQ中断,清零时允许FIQ中断。


在ARM7系列的处理器中,只有“MRS”和“MSR”两条指令可以直接读取和设置当前程序状态寄存器(CPSR)或保存程序状态寄存器SPSR)。在ARM公司提供的C编译器中并没用提供特殊的语法格式,用于指定生成这两条指令,所以如要想将IRQ中断和FIQ中断都屏蔽,就必须使用汇编语言来编写函数。对于IRQ中断,arm还有另外一种管理模式,即通过向量中断控制器(VIC)负责管理芯片的中断源,如果是只屏蔽或打开向量中断IRQ,也可以使用C语言来设计这两个函数。


3.1 C语言程序实现

本例选用的CPtJ是NXP公司的LPC2290,内核为arm7TDMI-S。在其向量中断控制器VIC中有两个寄存器控制向量中断使能或禁止:中断使能寄存器(VICIntEnable)和中断使能清零寄存器(VICIntEnClear)。中断使能寄存器相应位置“1”,则允许相应的中断;置“0”则不允许中断。


程序如下:


函数Disable首先将中断使能寄存器的当前值备份到全局变量(IntEnBak)中,然后通过给中断使能清零寄存器置“1”,来清零中断使能寄存器,从而屏蔽IRQ中断。函数Enable首先将中断使能寄存器清零,然后将全局变量(IntEnBak)备份的数据赋值给中断使能寄存器,从而恢复允许中断。


设计软件需要注意的一点是,中断使能寄存器虽然是读/写寄存器,但只能向其写入“1”,不能写“0”,写“0”无效,只能通过向中断使能清零寄存器中相应的位写“1”,来清除中断使能寄存器中相应的位。所以写软件时,如想将中断使能寄存器的第4位清零,应注意不能使用下面语句:

VICIntEnable&=~(1《0x04);

该语句的语法没有错误,编译也能通过,本意是将中断使能寄存器的第4位清零,但实际上此功能是无法完成的,语句执行后中断使能寄存器的值没有任何变化。要实现上述功能可用下面语句来代替:

VICIntEnClear|=1《0x04;

中断使能清零寄存器中为“1”的位清零中断使能寄存器的相应位,为“0”的位则不影响中断使能寄存器中的相应位。


3.2 汇编语言程序实现

C语言程序只能实现对向量中断IRQ的屏蔽,具有局限性,如想实现对全部中断的屏蔽就只能使用汇编语言来实现。程序如下:





在读/写CPSR时,可以指定传送的区域,指定一种或多种(字母必须为小写)格式:

◆_c为控制域屏蔽字节(CPSR[7…0]);

◆_x为扩展域屏蔽字节(CPSR[15…8]);

◆_s为状态域屏蔽字节(CPSR[23…16]);

◆_f为标志域屏蔽字节(CPSR[31…24])。

在Disable()函数中,通过直接将当前程序状态寄存器的I、F置位来屏蔽I、F中断。ARM7内核在响应中断后将置位中断禁止标志,中断处理结束后再清零中断禁止标志,这样可避免出现不受控制的中断嵌套,即ARM7内核本质上是不支持同级中断嵌套的。所以在Enable()函数中,当ARM7内核在处于不同的工作模式时,应采取不同的模式来分别处理。用户或系统模式下,函数直接清零I、F位,允许向量和快速中断;向量中断模式下只清零F位,允许快速中断;快速中断模式下处理较为复杂,首先要判断在进入快速中断模式之前arm7内核的工作模式,通过读取存储程序状态寄存器来判断。若之前处于向量中断工作模式,则函数不作任何处理,直接结束;若不是处于向量中断工作模式,则只清零I位,允许向量中断。


4 小结

本文介绍一种arm7内核的中断屏蔽方法,并给出基于该方法的C语言源代码和汇编语言源代码。该段代码已经在笔者参与研制的火灾报警控制器中得到成功应用,可以完全替代x86体系下DOS.H中定义的库函数enable()和disable()的功能。

关键字:ARM7内核  中断  屏蔽方法 引用地址:介绍ARM7内核的中断屏蔽方法

上一篇:ARM的学习和开发都需要学习哪些软件
下一篇:基于ARM嵌入式系统的SPI驱动程序设计

推荐阅读最新更新时间:2024-11-20 19:19

编程点滴:16位AVR定时器比较匹配中断测试程序
程序实现以Timer1比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。 文件组成:测试程序 main.c ,定时器配置程序 timer_16bit_test.c 和头文件 timer_16bit_test.h 。 main.c /* ********************************************* * File name: main.c * Function: 16位定时器比较匹配中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author & Date: Joshua Chan, 2012/03/26 * ******************
[单片机]
89C51单片机之外部中断0、1控制LED
1.proteus仿真图 2.keli代码 #include reg51.h sbit led1=P0^0; sbit led2=P1^0; //外部中断0控制程序 void INT0test() interrupt 0 { led1=~led1; } //外部中断1控制程序 void INT1test() interrupt 2 { led2=~led2; } int main() { EA=1; //全局中断使能 EX0=1; //外部中断0使能 EX1=1; //外部中断1使能 IT0=0; //外部中断0触发方式为低电平有效 IT1=1; //外部中断1触发方式为电平下降沿有
[单片机]
89C51单片机之外部<font color='red'>中断</font>0、1控制LED
AVR单片机捕获中断实现红外线解码
摘要:AVR单片机是Atmel公司推出的一个单片机系列。由于该系列单片机的集成度高,因此,其软/硬件设计都变得更加简洁。文中介绍通过AVR单片机的捕获中断来实现红外线通讯解码的一种方法。 关键词:AVR;红外线解码;输入捕获中断 1 红外线编码 红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。家电遥控中常用的红外线编码电路有μPD6121G型HT622型和7461型等。本文就以这些电路的编码格式来讨论怎样使用AVR单片机的捕获中断功能来实现其解码。 红外线通讯的发送部分主要是把待发送的数据转换成一定格式的脉冲,然后驱动红外发光管向外发送数据。接收部分则是完成红外线的接收、放大、解调,
[单片机]
STM32外部中断(EXTI)分析和应用
学过51单片机的外部中断的话入门会很快; 本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容; 代码基于ST官网提供的3.5.0标准库 如有不足之处,还望前辈多多指教; 一些需要了解的基础知识 1. STM32每个GPIO口都可以作为外部中断输入口使用 2. 每个中断都设有状态位 3. 每个中断/事件都有独立的触发和屏蔽设置。 4. STM32103有19个外部中断(但是供GPIO口使用的中断只有16个) 分别是: 0~15:对应外部中断IO的输入中断 16 : 连接到PVD输出 17 :连接到RTC闹钟时间 18 :连接到USB唤醒事件 这里会容易出现一个问题说:STM32F103ZET6的GPIO管
[单片机]
51单片机实现在串口接收中断里即时解析数据头的特殊程序框架
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200712 ---- @ModifiedTime: 20200712 ----
[单片机]
51单片机实现在串口接收<font color='red'>中断</font>里即时解析数据头的特殊程序框架
如何配置stm32中断的优先级
写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置; 此文思路:“中断优先级”思维导图--》关键要点---》结合图和要点相关程序应用例程讲解; 我们先来看ST公司的一张图: 我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0》NVIC_PriorityGroup_1》NVIC_PriorityGroup_2》NVIC_PriorityGrou
[单片机]
如何配置stm32<font color='red'>中断</font>的优先级
MSP430F149——中断及案例
中断 MSP430F149内部有三种类型中断:系统复位中断,不可屏蔽中断,可屏蔽中断 中断过程 ①完成当前正在执行的指令﹔ ②把PC寄存器内容入栈; ③把SR寄存器内容入栈; ④如果同时有多个中断,则选择优先级最高的中断; ⑤如果中断是单源中断,则中断标志位自动复位;如果中断是多源中断,则需要中断服务程序复位; ⑥SR清零,结束低功耗模式。由于GIE被清除,其他的中断被屏蔽。因此,中断不能被嵌套; 7.中断向量被装入PC寄存器,并从该地址开始执行中断服务程序。 中断向量表 系统复位中断 POR PUC 不可屏蔽中断 外部管脚NMI的触发(也就是所说的复位模式) 标志位:OFIFG Flash非法访问 标志位:ACC
[单片机]
MSP430F149——<font color='red'>中断</font>及案例
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved