基于Keil for ARM开发环境的可重入中断实现

时间:2022-04-07 12:16:53

【前言】基于Keil for ARM开发环境的可重入中断实现由文秘帮小编整理而成,但愿对你的学习工作带来帮助。(Fujian Electric Power Technical College, Quanzhou 362000, China) Abstract: The article analyzes the ARM7TDMI processor vector IRQ interrupt handling process inμVision4 development environment, design a reentrant interrupt system, and gives the pro...

基于Keil for ARM开发环境的可重入中断实现

摘要:文章分析ARM7TDMI处理器的向量IRQ中断处理过程,在Vision4开发环境下,设计一个可重入的中断系统,并给出程序代码予以实现,所采取的策略对于嵌入式系统的实时性具有实用价值。

关键词:ARM;可重入中断;Keil;向量中断控制器

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)12-2756-03

Reentrant Interrupt Realized Based on the Keil for ARM Development Environment

LIU Jin-ping

(Fujian Electric Power Technical College, Quanzhou 362000, China)

Abstract: The article analyzes the ARM7TDMI processor vector IRQ interrupt handling process inμVision4 development environment, design a reentrant interrupt system, and gives the program code to be realized, the strategy adopted for real-time embedded systems has practical value.

Key words: ARM; Reentrant interrupt; Keil; VIC

ARM是ARM公司设计开发的通用32位RISC微处理器体系结构,因其支持实时多任务、提供专用通道外部中断及功能强大且功耗低,而在各类工业控制系统中得到广泛应用。

ARM7TDMI结构的Keil开发套件采用最新设计的超豪华μVision4集成环境,内嵌C编译器、汇编器、工程管理器及调试器等功能模块,是一种高效可靠的开发工具,适用于不同层次的用户,完全满足从专业的应用开发工程师到初学者的所有使用要求。

该文以一款基于ARM7TDMI-S内核的嵌入式控制芯片LPC2138为硬件平台,分析中断异常的基本原理,并对在μVision4环境下的可重入中断提出设计方案。

如图1所示,C语言程序实现IRQ中断一般过程是,先通过VICIntSelcet选择IRQ中断,然后设置VICVectCntlx为向量中断并分配中断优先级,再设置VICIntEnable使能中断,以及向量中断对应的地址VICVecAddrx。

在IRQ中断发生时,ARM处理器的硬件会自动执行以下工作:

1)将被中断任务模式的CPSR值保存到SPSR_irq中;

2)将被中断任务模式的PC值(返回地址)保存到LR_irq中;

3)模式自动切换到IRQ模式,并将CPSR中的I位置一;

4)PC被赋予0x18的地址值,程序将从0x18处开始执行。对于IRQ,一般在中断向量表的0x00000018处设置指令LDR PC,[PC,#

图1 LPC2000系列ARM中断系统

ARM处理器从向量中断返回时,要执行两个工作:

①SPSR_irq值复制到CPSR,恢复被中断任务模式;

②LR_irq值复制到PC,恢复用户程序运行。

中断处理函数一般格式为:

void __irq函数名(void){

中断处理功能;

清除中断标志;

VICVectAddr=0;

}

其中关键字“__irq”是用来声明某个函数是IRQ中断处理程序,并自动在该函数内部的开头增加寄存器的保护、在结尾处插入恢复寄存器与中断返回代码。

在缺省情况下,ARM的IRQ向量中断是不可重入的。因为IRQ中断发生时,硬件自动切换到IRQ模式的同时,将CPSR中的I位置一,禁止后续的IRQ中断发生。这样,哪怕是更高优先级的中断也不行,所以必须重新设计中断系统机制。

在IRQ中断模式中,是不是只要将CPSR中的I位清零,就可以实现可重入中断?答案是否定的!原因是:LR_irq用来保存被中断任务程序的返回地址,若允许中断,新来的中断会将其返回地址装入LR_irq中,那么旧的中断子程序的返回地址就会被覆盖,从而导致系统紊乱[3]。那如何解决LR_irq不被破坏又能实现可重入中断?笔者采用的方法是,先切换到系统模式,在系统模式中,任何子程序被调用时,会将返回地址保存在LR_sys中,这时若发生新中断,就不会破坏旧的中断子程序的返回地址;然后将LR_sys及一些通用寄存器保护到SP_sys所指示的堆栈中;再开向量IRQ中断。

具体方法是采用C语言与汇编语言混合编程来实现,即每一个中断处理程序都按以下步骤编写:1)保护VICIntEnable寄存器的状态;

2)利用中断使能清零寄存器VICIntEnClr来禁止对应通道的中断源产生中断;

3)寄存器VICVectAddr写0,以便能接受另一个中断;

4)调用汇编程序IENABLE;该程序的功能是切换到系统模式、保护通用寄存器及LR_sys值到SP_sys所指的堆栈中、开中断。5)编写中断处理功能及清除中断标志;

6)调用汇编程序IDISABLE;该程序的功能是从SP_sys所指的堆栈恢复LR_sys及通用寄存器值、切换到IRQ中断模式、关中断。7)恢复VICIntEnable寄存器的状态;

8)寄存器VICVectAddr写0,能接受下一个中断。

IENABLE和IDISABLE源代码如下:

AREA Test1, CODE, READONLY

ARM

PRESERVE8

export IENABLE IENABLE

4基于优先级的可重入中断

在上面的可重入中断中,因为高优先级中断在执行中断处理程序时,可能会被另一低优先级中断所打断,这样高优先级中断处理程序的延迟将增大。为了提高高优先级中断的实时性,必须引入基于优先级的可重入中断。实现方法较为简单,只要在高优先级的中断处理子程序中,除了利用中断使能清零寄存器VICIntEnClr禁止对应通道的中断源产生中断外,还要加上禁止低优先级中断所对应的向量通道就可以了。例如,设Eint0优先级(分配通道14)比Eint1优先级(分配通道15)高,则在Eint0中断处理程序中改为,VICIntEnClr=(1

5结束语

可重入中断处理程序的设计很重要,关系到嵌入式系统实时等方面的性能。以前虽有人在已经被淘汰的ADS1.2开发环境下实践过,但笔者在keil for arm开发环境下,不对启动代码作任何修改,结合ARM中断系统简图和程序代码,给出了可重入中断处理程序设计的方法。文中涉及的程序源代码经过μVision4开发环境的调试,生成的可执行文件在仿真软件Proteus平台上和LPC2138开发板上测试过,证明此中断处理程序设计是可行的、有效的。

参考文献:

[1]周立功.ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2008.

[2]李宁.ARM开发工具RealView MDK使用入门[M].北京:北京航空航天大学出版社,2008.

[3]沈建华.ARM嵌入式系统开发-软件设计与优化[M].北京:北京航空航天大学出版社,2005.

[4]李无言.一步步写嵌入式操作系统-ARM编程方法与实践[M].北京:电子工业出版社,2011.

[5]周润景.Proteus在MCS-51&ARM7系统中的应用百例[M].北京:电子工业出版社,2006.

上一篇:加强网银信息安全研究有效防范网银风险 下一篇:网络虚拟化技术中的虚拟网映射问题及其研究现...