首页 > 技术文章 > ARM > ARM处理器中断处理的编程实现

ARM处理器中断处理的编程实现

52RD.com 2006年3月7日 电子产品世界/作者:庞继勇,唐婷            评论:5条 查看 我来说两句
  

       ARM编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解ARM内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。

       ARM处理器异常中断处理概述

       当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作:

       1)保存处理器当前状态、中断屏蔽位以及各条件标志位;
       2)设置当前程序状态寄存器CPSR中相应的位;
       3)将寄存器lr_mode设置成返回地址;
       4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。  
      
       在接收到中断请求以后, ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。从异常中断处理程序中返回包括下面两个基本操作:

       1)恢复被屏蔽的程序的处理器状态;
       2)返回到发生异常中断的指令的下一条指令处继续执行。

       当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。例外的是,复位异常中断处理程序不需要返回,因为整个应用系统是从复位异常中断处理程序开始执行的。

       支持中断跳转的解析程序

       解析程序的概念和作用                                                                                                                                                           


       如前所述,ARM处理器响应中断的时候,总是从固定的地址开始的,而在高级语言环境下开发中断服务程序时,无法控制固定地址开始的跳转流程。为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接。这样的服务程序常被称作中断解析程序。

       每个异常中断对应一个4字节的空间,正好放置一条跳转指令或者向PC寄存器赋值的数据访问指令。理论上可以通过这两种指令直接使得程序跳转到对应的中断处理程序中去。但实际上由于函数地址值为未知和其它一些问题,并不这么做。这里给出一种常用的中断跳转流程:


图1 

        中断跳转流程图 

       这个流程中的关键部分是中断向量表,为了让解析程序能找到向量表,应该将向量表的地址固定化(编程者自定义)。这样,整个跳转流程的所有程序地址都是固定的,当中断触发后,就可以自动运行。其中,只有向量表的内容是可变的,编程者只要在向量表中填入正确的目标地址值就可以了。这使得上层中断处理程序和底层硬件跳转有机地联系起来。

        解析过程示例
                                                                                                                                                                                                         

        以一次IRQ跳转为例,假定中断向量表定义在0x00400000开始的外部RAM空间:


                                                                            图2 
       中断解析示例流程
       

       图2中实线表示的流程都用ARM汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。填写向量表的操作可以在上层应用程序中方便地实现,比如在C语言中: *( int *(0x00400018)) = (int) ISR_IRQ;这样就将IRQ中断的服务程序入口地址(0x00300260)填写到中断向量表中的固定地址0x00400018开始的4字节空间了。

       如此一来,就可避免在应用程序中计算中断的跳转地址,并且可以很方便的选择不同的函数作为指定中断的服务程序。当然,在程序开发时要合理开辟好向量表,避免对向量表地址空间不必要的写操作。

       解析程序的扩展

       众所周知,在ARM处理器中会包含很多中断源,通常会在ARM内核外面扩展一个中断控制器来管理各种原因产生的中断。比如,三星公司的S3C4510B处理器中的IRQ/FIQ类型的中断源可以有21个,S3C44B0X有26个。这时候中断处理的原理还是一样的,无非是向量表更长,并且当一个中断触发以后,需要在解析程序里查询中断控制器的状态来确定具体的中断源,再根据中断源来读取向量表中的对应地址内容。其处理流程可用图3表示。

                                                                             图3  
       中断解析的扩展    

       相比图2,图3中多了一级的跳转,也就是在第一次解析跳转到IRQ/FIQ服务程序中后,再进行第二次的解析_中断源的识别。

       向量中断的处理

       一些处理器在设计外扩的中断控制器时提供了一种叫做“向量中断”的中断跳转机制。这与前文叙述的扩展解析跳转流程有所不同,它不需要软件来识别具体的中断源,也就是不需要添加图3中的IRQ/FIQ服务程序,而完全由硬件自动跳转到对应的中断地址。其它跳转流程的原理都是一样的。这相当于扩展了ARM内核的硬件中断向量表,减小了中断响应延时。以S3C44B0X处理器的外部中断0为例,需要在其对应的硬件固定跳转地址0x00000020处添加指令:ldr pc,=HandlerEINT,使得程序跳转到其服务程序HandlerEINT0处执行。

                                                              图4  向量中断解析流程示例 
       结语

       本文介绍的中断处理机制是嵌入式编程中常常采用的方法,其原理是通用的。当然,在实际开发中,需要根据系统处理器ARM内核的中断特征和处理器自身的中断控制器特点具体细化流程图中的各个步骤和改写参考代码。

       参考文献:1. 杜春雷. ARM体系结构与编程. 清华大学出版社,2003
                          2. 三星公司S3C4510B、S3C44B0X处理器数据手册

(52RD.com)
读取...
相关报道
评 论
5楼 waxife2008 发表于 2009-8-4 16:25 回复
虽然网上到处有,但能在这里看到。真的不错。
4楼 jinfan(游客) 61.87.*.* 发表于 2007-10-22 23:26 回复
有实际意义吗?
3楼 52RD网友 221.219.*.* 发表于 2006-8-15 16:49 回复
什么都是互相抄 有什么意思
2楼 sunxq(游客) 210.21.*.* 发表于 2006-4-17 13:50 回复

天下文章一大抄
1楼 zxs0564(游客) 219.134.*.* 发表于 2006-3-10 13:42 回复
有意思
共有评论5篇 查看所有评论
文章导航 Navigation
精彩评论 Commentmore...
赞助商链接 Support
特别推荐 Recommend
彩票开奖查询 甘肃11选5-首页 500万彩票网 500万彩票网 500万彩票网 500w彩票 500万彩票网 500万彩票网 500w彩票 500w彩票 <免费小说下载网>| <男多女少共妻小说>| <免费小说阅读网全本>| <重生小说排行榜>| <天天小说网>| <小说阅读网青春校园版>| <斗牛棋牌>| <有声小说免费下载mp3>| <59燃文小说阅读网>| <小说网txt免费下载>| <斗牛棋牌>| <小说阅读网青春校园版>| <波克棋牌>| <小说完美盛宴sodu>| <有声小说>| <完美世界小说人物月禅>| <斗牛棋牌>| <棋牌游戏>| <天天棋牌>| <穿越之神医王妃>| <免费完结言情小说>| <男多女少共妻小说>|