历史上的今天
返回首页

历史上的今天

今天是:2025年02月21日(星期五)

正在发生

2018年02月21日 | ARM中断处理的研究

2018-02-21 来源:eefocus

      在嵌入式系统中常用的RISC处理器是ARM核,它具有体积小、功耗低、成本低、性价比高的特点。然而,不管是哪种型号的ARM处理器,也无论该嵌入式系统中是否有操作系统,中断处理,特别是IRQ中断,始终是必须的,而中断处理的核心问题是上下文的保存。能否安全而又高效地保存上下文,将影响一个嵌入式系统的性能与稳定。笔者对ARM处理器的普通中断处理、任务切换中断处理、可重人中断处理和基于优先级的可重人性中断处理的上下文保存技术进行分析与总结。为保证理论的正确性,核心的程序代码都经过了实验的检测。

 

  1 系统中断处理简介

  ARM处理器的中断主要有两种:IRQ普通中断和FIQ快速中断。快速中断本质上与普通中断没有太大的差别,它们在处理机制上有许多相同的地方。IRQ中断是最频繁的也是最为影响系统性能的,所以对它的研究与处理也就最有价值。
 

  下面简要地介绍一下IRQ异常发生时ARM处理器的工作过程。在IRQ中断发生时,ARM处理器的硬件会自动执行以下工作:

  ①将被中断任务模式的CPSR值保存到IRQ模式中的SPSR寄存器中;

  ②将被中断任务模式的PC值保存到IRQ模式中的LR寄存器中;

  ③将模式自动切换到IRQ模式,并将CPSR中的bit7位置1禁止后继IRQ中断的发生;

  ④PC被赋予0xl8的地址值,程序将从0xl8片开始执行。结合图1,可以更好地理解ARM中断处理机制的工作过程。

  

IRQ中断处理寄存器保存示意图

 

  2 普通中断处理

  有些ARM嵌入式系统可能对中断的要求比较低,即发生中断后首先查询相应的中断源,然后进行中断服务,最后从中断服务程序中返回到被中断处继续运行程序。如何在这种简单应用中保证安全又高效地处理中断呢?“安全”就意味着中断发生时上下文被完好保存不被破坏,“高效”就是说保存尽可能少的寄存器(当然是建立在安全的基础上的)。由图1可知,在普通中断处理中,中断服务就可以在IRQ模式中运行。根据ATPCS的调用规则,在子程序调用中ARM编译器保存了R4~R11寄存器,因此就没有必要再次保存。那么剩下的寄存器就必须予以保存,防止从中断服务程序返回后被破坏。可以用汇编语言和C语言书写处理代码。

  首先假设初始化代码中已正确建立了IRQ堆栈。

  

程序

 

  <所有已使能中断的查询与服务>

  ;将同时发生的中断全部服务,以提高效率

  LDMFD SP!,{R0-R3,R12,R14} ;恢复上下文

  在上述保存上下文中没有必要保存SPSR。因在非嵌套的中断处理程序中,它不会被任何顺序的中断所破坏。

  如果用C语言来书写该处理程序,可以使用关键字一IRQ来说明,以告诉编译器实现如下的操作:

  ①保存.ATPCS规定的被破坏的寄存器;

  ②保存其他中断处理程序中用到的寄存器;

  ③同时将(LR-4)赋予程序计数器PC,实现中断程序的返回并且恢复CPSR寄存器的内容。

  普通中断处理的C语言程序可以按如下格式编写:

  

程序

 

  可见,无论是用C语言还是汇编语言来编写,它们的工作原理都是一样的。图2给出了普通中断处理过程中,ARM寄存器的保存示意图(虚线是压栈保存,实线是弹栈恢复)。图中与程序处理的步骤相对应,可以帮助理解处理器上下文的保存过程。

  

普通中断处理过程

3 任务切换


 

  有操作系统的嵌入式系统中,中断的发生要求保存全部寄存器的内容到任务的栈中,它不是基于安全的考虑是因为可能中断会导致任务的切换。任务切换发生时所有任务的寄存器的值都要保存到该任务的栈中。下个任务的上下文将从该任务栈中得以恢复到处理器的寄存器中。下面就本问题作出分析并给出实现的程序代码。从图1中断处理寄存器的保存可知,中断发生后任务的CPSR和PC两寄存器的值在IRQ模式的SPSR和LR中,所以不能简单地切换到任务运行的模式中,否则被中断任务返回时的CPSR和PC将不可见(因为它们保存在IRQ模式的专用寄存器中,在其他模式中无法操作)。此时,可以考虑设置一些变量区作为媒介,将其予以转存到任务运行模式的栈中去。

 

  下面假设任务切换是在SVC模式中运行的。结合上面的分析,可以有图3所示的保存任务切换的示意图(虚线是压栈保存,实线是弹栈恢复;LR_Frame和SPSR_Frame是变量区)。

  

保存任务切换的示意图

 

  结合图3任务切换中断处理中的步骤,可以用汇编语言写出相对应的中断处理程序:

  

程序

 

  

程序

 

  4 可重入性中断

  如果希望在处理中断时仍能响应其他中断请求以此来缩短中断延时,就必须设计可重人性中断。可重入性中断是处理多个中断的一种方法,但它也同时带来新的问题。在IRQ中断模式中,如果直接重新允许了IRQ中断,此时因为执行一条BL指令而将子程序返回的地址保存在LR_irq中,而在此间中断发生了。新来的中断会将其返回地址装入LR_irq中,此时旧中断子程序的返回地址必将被覆盖从而导致系统紊乱。此种情形是无法通过将LR_irq压栈来解决的,如程序语句:

  

程序

 

  但是仍不能排除在保存LR之前中断发生的可能性。要解决上述LR_irq被破坏的问题,就必须切换处理器的模式,常见的是切换到SVC处理模式。在SVC模式中,通过BL调用子程序时会将返回地址保存在LR_SVC之中。此时新中断发生(因为它会将返回地址保存到LR_irq而不是LR_SVC),不会破坏旧中断中子程序返回地址了。有了基于上述的原理分析再来编写可重入性中断的代码就思路清晰了。但是为了保证处理的高效性,尽可能地及早允许中断以缩短延时,在保存完LR_irq和SPSR_irq后,就马上切换到SVC模式中并重新允许中断,如图4所示(虚线是压栈保存,实线是弹栈恢复)。

  

可重入中断处理上下文保存示意图

 

  结合图4中的处理步骤,可以比较清晰地写出可重入中断处理的汇编语言程序:

  

程序


推荐阅读

史海拾趣

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子自成立以来,始终坚持以技术创新为核心竞争力。公司拥有一支高素质的研发团队,致力于石英晶体元器件的研发与生产。通过不断的技术创新和产品升级,晨晶电子在行业内逐渐树立了技术领先的地位。其产品广泛应用于通信、计算机、消费电子等领域,赢得了众多客户的信赖和好评。

Gould Fiber Optics公司的发展小趣事
根据实验需求选择合适的电源电路类型,如线性电源、开关电源等。线性电源输出稳定但效率低,适用于对纹波要求高的场合;开关电源效率高但纹波较大,适用于对效率要求高的场合。
Advanced Pressure Technology公司的发展小趣事

随着销售量的持续增长,APT公司很快便超出了其初始设施的产能。为了满足市场需求,公司于1992年迁至加利福尼亚州纳帕市的一座占地36,000平方英尺的工厂,并配备了2,000平方英尺的100级洁净室。新工厂的启用为APT公司提供了更大的发展空间,也进一步提升了其产品质量和产能。同时,APT公司始终致力于技术创新,不断推出适应市场需求的新产品,进一步巩固了其在气体输送领域的领先地位。

诚润电子(CHEVRON)公司的发展小趣事

诚润电子(CHEVRON)自创立之初,就以技术为核心竞争力。公司在2010年正式成立,由一群热衷于电子保护元件研发的工程师创立。他们深知,在这个日新月异的电子行业中,只有不断创新,才能在竞争中立于不败之地。因此,诚润电子从一开始就专注于电子保护元件的研发和生产,通过不断的技术创新,逐渐在市场中树立起了自己的品牌。

Epitex Inc公司的发展小趣事

随着全球环保意识的不断提高,Epitex也积极响应环保号召,将环保理念融入到公司的生产经营中。他们采用环保材料和生产工艺,减少对环境的影响。同时,Epitex还积极参与环保公益活动,推动电子行业的绿色发展。

在可持续发展方面,Epitex也做出了积极努力。他们通过技术创新和产业升级,不断提高资源利用效率和产品附加值。同时,Epitex还注重与供应商和客户的合作,共同推动产业链的可持续发展。

ApexTool Group公司的发展小趣事

Apex Tool Group一直将产品质量视为企业的生命线。在电子行业中,Apex Tool Group的产品以其卓越的品质和稳定的性能赢得了客户的广泛信赖。有一次,一家知名电子企业因为生产线上的电动工具出现故障,导致生产效率大幅下降。在紧急关头,Apex Tool Group迅速提供了替代方案,并派出技术人员现场解决问题。最终,Apex Tool Group的产品成功帮助该企业恢复了正常生产,赢得了客户的赞誉和信赖。

问答坊 | AI 解惑

哪位朋友有基于单片机测坡度(倾角)传感器的资料

RT 小弟要设计个车载测动态坡度的。基于51单片机系统的好:$ …

查看全部问答>

Freescale 的 VPU 视频解码后怎么显示到指定的窗口控件上

我用Freescale Mx27 中的VPU进行 视频的编解码 ,解码后如何将视频帧显示到指定的窗口控件中呢,          …

查看全部问答>

s3c2410的nand flash在烧写后,启动出错,求救

s3c2410上烧wince的bootloader,烧写过程没错,但重启后出错 超级终端启动后,屏幕出现如下信息: WinCE NAND Boot v1.00 Mar 22 2007 00:02:34 Picture Boot WinCE NAND Boot v1.00 Mar 22 2007 12:25:45 dwEntry is 0x00000001 ECC ERROR ...…

查看全部问答>

黄文中wince视频教程文件为什么不完整

msdn webcasts 黄文中 老师讲的 《Windows Embedded从入门到精通系列课程(3):Windows CE 内存泄漏的检测和防止 (Level 300) 》 视频文件为什么不完整,谁有完整的啊? http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh ...…

查看全部问答>

keil全局变量初始化值改变的问题

正在用keil for arm学习LPC2312,用proteus联调 我在main.c中定义了一个全局变量led_flag和led_taber[16]的数组, 我主要是要完成用LPC2312的p0.0-p0.6这7个口作为输出来控制7段数码管显示0 1 2 …E F十六个数字 用p0.7,p0.9作为外部中断输入, ...…

查看全部问答>

我设计的测试的电路图,,哪个可以帮我分析下有没有问题??

我已经给了一定的解释,,哪个朋友可以帮我分析下电路可以应用不??这个电路肯定要改进的…

查看全部问答>

新人来学习

我是菜鸟,我进来和大家一起学习…

查看全部问答>

实在搞不懂TI的ARM怎么和ST竞争?

价格贵,bug多,真是后悔选了LM3S。…

查看全部问答>

Launchpad和俄罗斯方块的故事~

视频: $(\'swf_X6o\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XNDE5Nzc2M ...…

查看全部问答>

有没有贴片的2SK30场管

请教诸位:像2SK30,2SK241这样的小功率场管有没有贴片封装的?…

查看全部问答>