传统ARM中IRQ是作为一种系统异常出现的。对于ARM核来说,有且仅有一个称为IRQ的系统异常。而ARM对于IRQ的处理一般通过异常向量找到IRQ的中断处理程序。当进入IRQ中断处理程序之后,ARM自动屏蔽IRQ,也就是说在中断响应过程中是忽略之后到来的中断请求的。即使使用了VIC,VIC也仅仅是悬起后来的中断请求。也就是说,传统ARM的中断是不可嵌套、不可抢占的。
不过,ARM给了我们一种权利,那就是在中断处理程序中可以手动打开IRQ,这样在前一个IRQ响应的过程中,就可以被后来的中断所打断。就给我们提供了一种用软件解决中断嵌套的途径。
中断的过程我们都十分清楚:保护现场à响应中断à恢复现场。ARM对于每一种异常都有相应的堆栈寄存器,且会自动切换,互不影响。所以自然而然地,在嵌套中,我们可以用SP_irq来保护现场和恢复现场。流程如下所示:
1. 2. 3. 4. 5. 6. 7. 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10通过LR_irq跳转回到7
7.11ARM自动从SPSR_irq恢复CPSR
8. 9. 10. 11.
这样就实现了嵌套,而且只要堆栈够大,可以嵌套很多层。不考虑优先级,或者把优先级教给中断控制器管理,这样已经不错了吧,虽然不愿意这么说,但是问题还是来了。
在上面的流程中,有一步是根据中断号进行中断服务。对于不同的中断源,我们一般都会用不同函数来写中断服务,这样不仅清晰,也利于将不同功能的模块分割开。这样我们就需要将这步变为:根据中断号进入服务子程序。这步中,我们会牵涉到函数调用。在函数调用过程中,一般都会先将PC保存在LR_irq中,在返回时,再将LR_irq恢复到PC。这也正是LR的作用所在。
正是这个事实,导致了问题的发生。想象这种情况:当我们进入服务子程序后,此时LR_irq正是我们程序的返回地址。这时,第二个中断到来了,回忆一下中断发生时ARM自动做了什么,ARM将PC保存到了LR_irq中!就这样,LR_irq被篡改了,因为我们无法预料到中断什么时候到来,我们也就根本无法保存这个被篡改的LR_irq。程序响应好第二个中断后,一路返回到这个LR_irq,毫无意外的,就跑飞了。
很扫兴吧,不过我们自然有办法解决这个问题。办法就是在进入服务子程序之前,先将系统转换到SVC状态,这样,子程序被调用时返回地址就会被保存在LR_svc中,也就不会再被第二个中断所篡改。流程如下,和第一次不同的地方都用红色标注。
1. 2. 3. 4. 5. 6. 7. 8. 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10关闭IRQ使能位
9.11从SP_svc所指示的堆栈中恢复R0-R3,LR_svc
9.12更改系统状态为IRQ
9.13从SP_irq堆栈中恢复通用寄存器、LR_irq、SPSR_irq
9.14通过LR_irq跳转回到9
9.15ARM自动从SPSR_irq恢复CPSR
10. 11. 12. 13. 14. 15.
这样我们既可以用中断服务子程序,也不怕LR被篡改了。我们再来看一下嵌套过程中的堆栈使用情况。在进入SVC状态之前,使用IRQ的堆栈,保存嵌套所需的通用寄存器、LR_irq和SPSR_irq。进入SVC状态之后,使用SVC堆栈,需要保存调用函数规定的R0-R3,LR_svc。当然在中断服务例程中,也是使用SVC堆栈。可见两个状态的堆栈都被使用了。当然,因为中断服务例程使用SVC堆栈,我们也可以考虑将嵌套所需的堆栈也放到SVC中,这样就不需要IRQ堆栈了。流程上和前面这种方法很相似,只不过要将保存LR_irq和SPSR_irq的时间放到进入SVC态之后,方法可以是通过通用寄存器拷贝。最后也不必再返回IRQ态,可以直接通过SPSR_svc和LR_svc来推出中断处理程序。
程序贴在下面,用的是堆栈分开的方法,只是示例。
- __asm void IRQ_Handler(void){
- PRESERVE8
- IMPORT handler1
-
- // STORE LR_irq & SPSR_irq
- SUB LR, LR, #4
- MRS R0, SPSR
- STMFD SP!, {R0, LR}
-
- // INTO SVC MODE
- MRS R0, CPSR
- BIC R0, #0x1f
- ORR R0, #0x13
- MSR CPSR_C, R0
-
- // STORE REGISTORS OF SVC MODE
- STMFD SP!, {R0-R3,LR}
-
- // ENABLE IRQ
- MRS R0, CPSR
- BIC R0, #0x80
- MSR CPSR_C, R0
-
- // GO TO HANDLER
- BL handler1
-
- // RESTORE REGISTORS OF SVC MODE
- LDMFD SP!, {R0-R3,LR}
-
- // DISABLE IRQ
- MRS R0, CPSR
- ORR R0, #0x80
- MSR CPSR_C, R0
-
- // INTO IRQ MODE
- MRS R0, CPSR
- BIC R0, #0x1f
- ORR R0, #0x12
- MSR CPSR_C, R0
-
- // RESTORE LR_irq & SPSR_irq
- LDMFD SP!, {R0, LR}
- MSR SPSR_CFX, R0
-
- // EXIT IRQ
- MOVS PC, LR
- }
关键字:ARM 可嵌套 IRQ程序
引用地址:
传统ARM中可嵌套的IRQ程序
推荐阅读最新更新时间:2024-03-16 14:58
基于ARM和以太网供电的网络摄像机设计
引言 本文提出了一种基于ARM和POE的嵌入式系统的网络摄像机设计方案。该方案以AT91RM9200处理器及其外围模块作为硬件平台,以嵌入式Linux作为操作系统,构成整个系统。该系统应用以太网供电,实现网络摄像机的功能,不必提供专门供电线路,这种设计实现的网络摄像机是一个创新。同时,随着网络技术的高速发展,该设计将具有极好的市场应用前景。 1 系统的结构 整个系统由AT91RM9200处理器、CMOS传感器、音频采集系统、以太网供电系统和以太网数据通信等几部分组成。首先,通过CMOS传感器镜头采集图像,同时还可以进行音频采集,经过AT91RM9200处理器处理,整个过程通过网络进行数据传输,通过网络进行供电,从而实现
[单片机]
微软有一个移动的梦想,Windows 10和英特尔成关键?
微软剥离诺基亚的举动表明它在移动设备领域制定了新的战略;
剥离诺基亚本身不是一个好消息,但移动新战略这个消息不错;
新战略是尽可能快地将现有的Windows PC生态系统转换为移动设备生态系统;
对微软而言,这一步走对了。
对微软剥离诺基亚的行为,媒体反应不一,有持欣赏态度的也有猛烈批评的,这些反应中,既缺乏对微软移动新战略的理解,也没考虑现下的微软对鲍尔默时代的颠覆。微软当前的战略是“移动化”,创造将微软现有的约15亿Windows PC用户纳入到移动设备生态内的典范。这项战略在短期内和长期内都会带来深远的影响,本文中笔者将会一一剖析。
反应褒贬不一
对微软剥离诺基亚
[嵌入式]
从TCS23,看Arm TCS的设计理念
随着Arm TCS23(Total Compute Solutions 2023)的推出,Arm 终端事业部产品管理高级总监 Kinjal Dave在Arm官方博客上发表了一篇题为《TCS23 为移动计算提供完整平台》的博文。日前,Kinjal Dave面对中国媒体,详细介绍了TCS23性能的提升,以及为终端带来体验的提升。 自2019年决定开始使用TCS的方法进行产品定义和开发之后,Arm以解决方案的角度进行技术产品的开发已经持续了几年,目前TCS23是第三代TCS。 TCS是将CPU、GPU、系统级 IP 元素融合,力求通过平台化、方案化的方式满足不同客户共同的需求。每年产品的迭代升级,使得开发变得更加困难,同时成本也
[手机便携]
ARM指令集 LDR指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 (1)LDR r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄存器. *如果name是立即数的话:LDR R0,=0X123; //将0X123存入R0 *如果name是个标识符:LDR R0,=NAME; //将NAME的地址存入R0 相当于: LDR R0,LABEL; LABEL DCB NAME;//分配内存并用NAME初始化(LABEL为内存的起始地址?) (2)LDR R1, ;如果没有等号,LDR 指令用于从内存中读取数据放入寄存器中.该指令是 将R0 地址处的数据读
[单片机]
基于ARM7的单片机实现32位系统
随着全球化工业生产的发展与深入,终端产品功能的多样化,8位或8051的工程师在设计工业控制器和模块时,越来越需要复杂的以RISC(精简指令系统)为基础的微处理器。由于有机能源的短缺和全球气候变暖,对电子设备能耗的要求越来越高。意法半导体的STR7系列单片机内置闪存存储器,寄存器以一种很简单的方式排列。STR7可以很方便地连接各种外部设备。ST提供丰富的应用笔记和例行程序,有效地降低了应用和学习的入门门槛。目前意法半导体提供三种评估板,STR710、STR720和STR730。 图1. 评估板 有效地用好用熟一款单片机,最大限度地发挥硬件的效能是每一个工程师的目标;首次接触ARM的系统,要想达到上述目标,对于一个用惯8位或1
[单片机]
软银旗下ARM子公司推出针对自动驾驶传感器的芯片
继推出针对自动驾驶汽车设计的安全强化处理器Cortex-A76AE后,软银旗下英国芯片设计公司ARM近日推出用于处理传感器数据流的芯片。 12月19日消息,据外媒报道,本周二,ARM公司推出了一款新的自动驾驶汽车芯片——Cortex-A65AE,预计将于2020年上市。 这款软件的设计理念是近乎实时地处理自动驾驶汽车传感器的数据流,并具备新的安全功能,旨在使芯片更适合汽车。此外,它还拥有与图形处理器快速连接的通道,为这些处理器提供辅助作用。 而今年九月推出的安全强化处理器Cortex-A76AE则可以让芯片制造商设计出拥有安全功能的芯片,这让自动驾驶汽车能够满足最严格的安全要求,包括自动防撞等功能。 ARM汽车业务副总裁拉克希米
[机器人]
ARM-Linux 内核移植--基于FL2440开发板(修改为Linux单系统)
硬件平台:FL2440开发板 内核版本:2.6.28 主机:ubuntu 11.04 内核版本:2.6.39 本来以为fl2440的nand flash大小为128M,问了客服才知道,现在FL2440使用的是现代的flash,现在都换成256M的了,只是飞凌的bootloader没有相应的修改,它使用的既不是u-boot,也不是vivi,而是自己的bootloader。现在修改bootloader源码中的nand.c 修改如下: //可更改删除分区,分区名字不可改 static struct Partition NandPart = { {0, 0x00020000, boot },
[单片机]
基于嵌入式ARM的LCD图像显示系统设计
0 引 言 随着嵌入式技术迅猛发展和Linux在信息行业中广泛应用,利用嵌入式Linux系统实现图像采集处理已有可能。实时获得图像数据是实现这些应用的重要环节。本文使用的系统硬件平台采用Samsung公司的处理器S3C2410,并以此为基础,在基于嵌入式Linux系统平台上设计了建立图像视频的一种方法。 1 系统硬件电路设计 S3C2410芯片处理器内部集成了ARM公司ARM920T处理器核的32位微控制器,资源丰富,带独立的16 kB的指令Cache和16 kB数据Cache、LCD(液晶显示器)控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的定时器、并行I/O口、8路10位ADC、Tou
[嵌入式]