ARM中的中断要点
ARM7(sc44b0)外部中断笔记
ARM7(sc44b0)外部中断笔记对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。
而对于外部中断4 \5\6\7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。
下面就具体来说说使用外部中断的一些必要的配置。
一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG(端口G配置寄存器)的配置来选用Port G的外部中断的功能。
其配置表如下所以应该将其配置为11(设置为中断功能状态);二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。
可以通过对中断模式寄存器rINTMOD配置获得。
如表下三,是否允许中断,即中断使能位。
通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,可以看出只要让intcon的【1】位置零即可使中断使能。
四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222;将所有的外部中断都设置为下降沿触发。
五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下中断挂起寄存器:当中断产生后,是将INTPND的【21】位置一的;所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。
arm中断嵌套的原理
arm中断嵌套的原理摘要:1.引言2.arm 中断嵌套的原理2.1 arm 的中断向量表2.2 中断嵌套的实现2.3 中断嵌套的优点和应用3.arm 中断嵌套的实现3.1 硬件方面的支持3.2 软件方面的支持4.arm 中断嵌套的注意事项4.1 中断处理时间的考虑4.2 中断优先级的处理5.总结正文:在嵌入式系统中,中断处理是一个常见的功能。
ARM 处理器提供了丰富的中断处理功能,使得开发者可以灵活地处理各种中断事件。
中断嵌套是ARM 中断处理的一个重要特性,可以提高系统的响应速度和处理效率。
本文将详细介绍ARM 中断嵌套的原理、实现以及注意事项。
首先,我们需要了解ARM 中断嵌套的原理。
ARM 的中断向量表是一个关键概念。
中断向量表是一个存储中断向量地址的数组,用于快速定位和处理各种中断事件。
当有中断请求时,处理器会根据中断类型号在中断向量表中查找对应的中断向量地址,然后跳转到该地址执行中断处理程序。
中断嵌套的实现主要依赖于中断向量表的布局和中断处理程序的设计。
在一个系统中,可能会有多个中断源,它们的中断向量地址可能会相互重叠。
为了实现中断嵌套,我们需要保证中断向量表中的下一个中断向量地址在当前中断处理程序执行完毕之前可以被访问到。
这样,当一个中断请求到来时,处理器可以在当前中断处理程序执行完毕后,快速跳转到下一个中断向量地址,执行下一个中断处理程序。
中断嵌套的优点主要体现在可以提高系统的响应速度和处理效率。
例如,当一个外部中断请求到来时,处理器可以在执行当前中断处理程序的同时,响应外部中断请求,这样可以减少中断处理的时间。
此外,中断嵌套还可以实现中断优先级的功能,使得高优先级的中断请求能够更快地被处理。
要实现ARM 中断嵌套,需要硬件和软件两方面的支持。
在硬件方面,处理器需要支持中断嵌套,这通常需要处理器具有中断控制器,可以实现中断请求的排队和嵌套处理。
在软件方面,需要编写适当的中断处理程序,确保在当前中断处理程序执行完毕之前可以跳转到下一个中断向量地址。
Linux内核中ARM中断实现详解request_irq()、free_irq()
Linux内核中ARM中断实现详解request_irq()、free_irq()Request_irq()调用的定义:int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);irq 是要申请的硬件中断号。
具体应是何值参见博文blog.csdn/songqqnew/article/details/6791602。
handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id 参数将被传递给它。
即是中断服务子程序,用staticirqreturn_tadc_interrupt(intirq,void*dev_id);定义或声明。
Irqflags 是中断处理的一些属性。
若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon 已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。
(这几个flag 是可以通过或的方式同时使用的)devname 设置中断名称,在cat /proc/interrupts 中可以看到此名称。
为注册的驱动程序的设备名。
dev_id 在中断共享时会用到。
一般设置为这个设备的device 结构本身或者NULL。
中断处理程序可以用dev_id 找到相应的控制这个中断的设备,或者用irq2dev_map 找到中断对应的设备。
ARM体系中异常中断种类及处理办法
ARM 体系中异常中断种类及处理办法在ARM 体系中,通常有以下3 种方式控制程序的执行流程:
•在正常程序执行过程中,每执行一条ARM 指令,程序计数器寄存器(PC)的值加4 个字节;每执行一条Thumb 指令,程序计数器寄存器(PC)的值加2 个字节。
整个过程是顺序执行。
•通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。
其中,B 指令用于执行跳转操作;BL 指令在执行跳转操作的同时,保存子程序的返回地址;BX 指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb 状态;BLX 指令执行3 个操作:跳转到目标地址处执行,保存了子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb 状态。
•当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。
在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
ARM的异常处理学习笔记转贴
ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
ARM自举程序的中断管理机制
自举 程序是 操作 系统 内核或 用户 应用程 序运 行
之前, 首先 必须 运行 的汇 编语 言 编 写 的 一段 程 序 代
码 I , 2பைடு நூலகம்主要 包 括 C U 内部 各 个关 键 的寄 存 器 、 P 配 置外 围硬件 电路 相关 寄存器 、 系统 存储 器 、 栈 和 中 堆 断 向量表 等初始 化 , 准备 好 高 级语 言编 写 的 软 件 并 的运 行环境 , 然后 跳 转 到一 般 由高 级语 言 编 写 的 主 函数 的应用 程序代 码 去 执行 , 成 系统 设 计 所要 求 完
广泛。
的 7种异 常 向量地 址 OO 0 l 。S C 4 O x0~ xC 3 4 B X还 规 定 了 EN O到 IT AD IT N _ C等 2 6个 中断源 的中断 向量
地址 0 2 0 c , 且 这 2 x0~ x0 而 6个 中断 向量 仅 在 I Q R 向量模式 下 有 效 。 向量 表 中 的 向量 地 址 是 不 连 续 的, 未列 出 的向量地 址保 留待后 用 。 在 中断 或 异 常 发 生 时 ,3 4 B X 硬 件 逻 辑 将 S C4 O
0 引 言
采 用 中断方式克 服 了 C U查 询 等待 的缺 点 , P 提
() 1 硬件 固有 的 中断 向量 表 A MTM R 7 D I内核 规 定 了 复位 、 定 义 指 令 、 未 软 件 中断 、 预取 中止 、 数据 中止 、R I Q中 断 和 FQ 中断 I
高 了 C U 的 效 率 , 此 在 嵌 人 式 系 统 中 应 用 很 P 因
摘
要:给 出了 于 SC 4 O 基 3 4 B X开发板启动代码 中的中断管理机制 ,给 出了构造硬件 固有 中断
学习小结--ARM7中断原理
2
3 向量地址寄存器 0-15(VICVectAddr0-15 - 0xFFFFF100-13C,读/写)
一般(以 Slot0 为例):VICVectAddr0 = (uint32)IRQ_TIME0 ;
4 向量地址寄存器(VICVectAddr - 0xFFFFF030,读/写) VICVectAddr = 0x00; // 通知 VIC 中断处理结束
二 ,VIC 寄存器 1,中断选择寄存器(VICIntSelect - 0xFFFFF00C,读/写)
该寄存器将 32 个中断请求分别分配为 FIQ 或 IRQ。
一般选 IRQ 时:VICIntSelect = 0x00;
1
2,向量控制寄存器 0-15(VICVectCnt l0-15 - 0xFFFFF200-23C,读/写)
PINSEL0 = 0x00000000; // 设置管脚连接 GPIO IO1DIR = LED1|LED2; // 设置 I/O 为输出 IO1SET = LED1|LED2; Time1Init(); // 初始化定时器及使能中断 Time0Init(); VICIntSelect = 0x00; // 所有中断通道设置为 IRQ 中断 VICDefVectAddr = (uint32)nIRQ_TIME; VICIntEnable = time0|time1; while(1); // 等待定时器中断或定时器匹配输出 return(0); }
}
} /**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器,定时时间为 S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time1Init(void) {
arm中断嵌套的原理
arm中断嵌套的原理【实用版】目录1.ARM 中断嵌套的原理概述2.中断嵌套的实现机制3.中断嵌套的优缺点分析4.总结正文【1.ARM 中断嵌套的原理概述】ARM(Advanced RISC Machine)是一种高级精简指令集计算机(RISC)架构,广泛应用于嵌入式系统和移动设备等领域。
在 ARM 系统中,中断嵌套是一种重要的技术,用于实现多个中断之间的协同处理。
当一个中断处理程序(Interrupt Handler,IH)在执行过程中,可能会触发另一个中断处理程序,这就形成了中断嵌套。
【2.中断嵌套的实现机制】中断嵌套的实现主要依赖于 ARM 处理器的中断处理机制。
具体来说,当一个中断发生时,处理器会立即保存当前程序的状态,包括程序计数器、寄存器等,然后跳转到对应的中断处理程序入口。
在这个过程中,处理器会启用中断优先级控制,根据中断优先级确定处理程序的执行顺序。
在执行中断处理程序时,如果遇到另一个更高优先级的中断,处理器会再次保存当前程序的状态,并跳转到新的中断处理程序入口。
这样就形成了嵌套的层次结构。
在嵌套的过程中,处理器会按照优先级顺序逐个处理中断,直到所有中断处理完毕,恢复执行最初被中断的程序。
【3.中断嵌套的优缺点分析】中断嵌套技术具有以下优点:1.提高系统响应速度:当外部事件发生时,系统可以快速响应并进行处理,提高系统的实时性能。
2.资源利用率高:中断嵌套允许多个中断处理程序并发执行,充分利用系统资源。
然而,中断嵌套也存在以下缺点:1.代码复杂度增加:由于中断嵌套导致程序流程分支较多,可能会增加代码的复杂度,影响程序的可维护性。
2.系统稳定性降低:中断嵌套可能导致系统在处理多个中断时出现死锁、竞态等问题,影响系统的稳定性。
【4.总结】总之,ARM 中断嵌套技术在提高系统响应速度和资源利用率方面具有显著优势,但同时也带来了代码复杂度和系统稳定性方面的挑战。
ARM的异常和中断
指令预取中止 0x0000000c 数据访问中止 0x00000010 外部中断 快速中断 0x00000018 0x0000001c
ARM技术及应用
第二章 ARM技术概述
2.7.3 ARM的异常中断向量表 异常中断向量表的大小为32字节; 每个异常中断向量占4个字节,存放一个跳转指令 或向PC寄存器中赋值的数据访问指令; 异常中断响应时,程序计数器PC会指向相应的异常 中断向量,执行跳转指令跳转至相应的异常中断服务 程序中继续执行。
Uboot:免费开源的BootLoader,支持多种处理器 本例Uboot版本: 1.3.2 本例代码:/uboot-1.3.2/cpu/arm920t目录下的start.S ,是系统在Uboot引导下执行的第一段代 Uboot 码。
ARM技术及应用
第二章 ARM技术概述
代码片段分析:
.globl _start _start: b start_code ldr pc, _undefined_instruction ……………….. ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction ……………………….. __irq: .word irq _fiq: .word fiq
ARM技术及应用
第二章 ARM技术概述
2.7.4 ARM的异常中断响应过程
图2.7.3 异常中断响应过程
ARM技术及应用
第二章 ARM技术概述
2.7.5 ARM的异常中断的返回 复位异常处理程序执行完毕后,不用返回。
图2.7.4 异常中断的返回
ARM技术及应用
arm cortex-m中断处理流程
ARM Cortex—M处理器家族是一组为嵌入式系统制造的32位处理器。
这些处理器被用在很多诸如IOT设备,设备,汽车等等的东西中。
Cortex—M处理器的一个酷点是它们能处理中断,这意味着它们能对事件迅速作出反应。
在文章中,我们将讨论Cortex—M处理器如何
处理中断,我们将专注于所涉及的步骤和概念。
当一个Cortex—M处理器中断时,就像在电子游戏上按下暂停按钮。
处理器很快地将它所做的一切保存在堆栈上,类似于在游戏中保存你
的进度。
它记得它在哪里,它在做什么,和所有重要的环境。
是时候找出真正造成中断的原因了。
处理器检查其特殊的内存图称为
中断矢量表,这就像一个导致不同中断服务常规(ISR)的藏宝图。
这就像在游戏中寻找正确的路径来解决特定的挑战。
一旦处理器知道哪一个ISR去,就像跳进游戏的新关卡。
它开始执行
中断处理器代码,这就像用一套新的指令处理一个新的任务。
就像在
游戏中,处理器可以永远回到它留下的地方,继续冒险!
在ARM Cortex—M的微妙舞蹈中,中断处理是一种优雅的芭蕾舞,
它拯救了现在的时刻,从迷人的矢量台上寻找ISR的悄悄位置区域,
并跳入ISR的等待怀里,执行中断处理者的卡住密码。
这种受试过程
使处理器能够以优雅和高效的空气来响应外部事件的呼唤,将Cortex—M处理器铸成实时嵌入系统的发光星。
ARM异常中断以及对ARM异常返回地址的分析
返回地址:SUBS PC,R14,#8 返回地址分析: 当进入异常时,R14_abt = address of the aborted instruction + 8
所以要返回到有问题的指令处重新执行,所以返回的地址为 R14-8 IRQ 中断异常:
产生原因: 当处理器的外部中断请求引脚有效,且 CPSR 寄存器的 I 控制位被清除 时,处理器产生外部中断 IRQ 异常。
是因为当前指令即引起软件异常中断的指令执行后所引起的,说明当前指令已近执行,当从
中断返回时,执行的指令应该是当前指令的下一条指令,即待执行指令的地址应该是 0x3004, 而 R14 中存放的即为 0x3004,所以返回时使用将 R14 的值直接赋给 PC 即可。
指令预期中止异常: 发生原因:若在指令预取阶段遇到无效指令时,系统存储器将该预取的指令标记为无
效指令,当处理器试图去执行这一条被标记为预取无效的指令时,将产生指令预取中止异常, 注意若处理器没有执行无效指令时将不会产生异常中断(在流水线中存在一条分支指令,导 致该非法指令没有执行,将不会产生该异常)。
处理器动作: R14_abt = address of the aborted instruction + 4 SPSR_abt = CPSR ….. …..
2、各异常分析
举个小例子,下面是一段 ARM 汇编代码: (后面的返回地址分析中将会用到此图)
B53-2.4.2.ARM7中断与异常
LDR
PC, =ResetInit
LDR
PC, =Undef_Handler
LDR
PC, =SWI_Handler
LDR
PC, =Prefetch_Handler
LDR
PC, =DataAbort_Handler
DCD
0xb9205f80
LDR
PC, =IRQ_Handler
LDR
PC, =FIRQ_Handler
管理
未定义
管理 中止 中止 保留 中断 快中断
禁止
I 禁止 I I — 禁止 禁止
禁止
F
F F F — F 禁止
注:表中的I和F, 表示该位不受影响,保留原来的状态
(4) 其他异常源返见回地址计算汇总表
异常或入口 (中断源)
返回指令
BL
MOV PC,R14
SWI
MOVS PC,R14_svc
未定义的指令 MOVS PC,R14_und
▪将下一条指令的地址存入 IRQ模式的LR寄存器
▪将跳转地址存入PC,实现 跳转
LR LR_sys
BLacRk_Airdqdr
寄 存
PC
JumpAddr
N Z C V . . . I F T MOD
器 CPSR ? ? ? ? . . . 01 ? 10 ISRYQS
组
SPSR
? ?S?P?.S. R.0?_1iSrqYS
SUBS PC,R14_irq,#4
(3)异常进入退出CPSR状态
地址
异常类型
进入时的模式 进入时I的状态 进入时F的状态
0x0000 0000 复位
0x0000 0004 未定义指令
ARM处理器中断处理的编程实现
ARM处理器中断处理的编程实现中断是指外部事件打断正在执行的程序,并暂时转去执行与该事件有关的处理程序。
在ARM处理器上,中断处理是通过中断向量表和中断服务程序来实现的。
下面是ARM处理器中断处理的编程实现的主要内容。
1.中断向量表的设置在ARM处理器中,中断向量表是一个保存中断服务程序地址的表。
每个中断号对应一个中断服务程序的地址,当发生中断时,处理器会跳转到相应中断号对应的中断服务程序。
中断向量表必须存储在内存中,并且要先设置好才能使得中断处理正常工作。
为了设置中断向量表,需要将每个中断号对应的中断服务程序的地址写入到相应的中断向量表项中。
具体的实现方式根据不同的ARM架构有所不同。
以ARM Cortex-M系列处理器为例,中断向量表的每个向量表项占用4个字节,存储中断服务程序的地址。
下面是使用C语言设置中断向量表的示例代码:```c//声明中断向量表typedef void (*interrupt_handler_t)(void);//中断服务程序声明void interrupt_handler1(void);void interrupt_handler2(void);...//中断向量表__attribute__ ((section(".isr_vector")))const interrupt_handler_t interrupt_vector_table[] =interrupt_handler1, // 中断号0对应的中断服务程序interrupt_handler2, // 中断号1对应的中断服务程序...```2.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
ARM Linux对中断的处理
void (*bus_lock)(unsigned int irq);
void (*bus_sync_unlock)(unsigned int irq);
/* Currently used only by UML, might disappear one day.*/
kstat_irqs: irq stats per cpu
irq_2_iommu: iommu with this irq
handle_irq:高层的irq时间处理程序(如果为NULL,则默认调用__do_IRQ())
chip:底层的中断硬件访问,指向PIC对象(irq_chip结构),它服务于IRQ线,Linux中断管理系统使用该成员来进行中断控制器的访问。
struct proc_dir_entry *dir;
#endif
const char *name;
}____cacheline_internodealigned_in_smp;
irq_desc结构体(中断描述符)中各个字段说明:
irq:中断描述符的中断号
timer_rand_state: pointer to timer rand state struct
#endif
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
struct msi_desc *msi_desc;
void *handler_data;
void *chip_data;
struct irqaction *action; /* IRQ action list */
arm IRQ中断之向量中断非向量中断
arm中断向量表中,只有一个IRQ向量地址,占4字节(另外还有一个FIQ向量地址),可是arm支持多个外部中断源,一个中断发生后,arm如何根据这一个向量地址找到相应的中断服务程序?这里要区分中断是向量中断还是非向量中断。
一个中断源对应一个中断号,对于不同的外部中断源根据处理方式不同分为向量中断和非向量中断。
向量中断:当中断为向量中断时,arm直接跳转到预先提供的中断服务程序执行,这种处理方式响应速度快。
非向量中断:当中断为非向量中断时,无论是什么外部中断源发出的中断,arm将跳到指定的一段程序执行(称为中断解析程序),在解析程序里,通过判断相应的中断状态寄存器找到对应的中断源,跳转到相应的中断执行程序。
有点类似软件中断的处理方式,但是软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。
进入软中断后,系统变为管理模式。
而非向量中断入口是0x0000,0018。
它引导系统进入fiq/irq模式。
这种处理方式简单,但是要通过软件查询来判断具体的中断服务程序,所有延迟时间较长。
如何设置:系统在初始化的时候需要进行中断初始化,设置中断源是向量中断还是非向量中断。
设置方式举例如下:VICIntSelect = 0x00000000; //所有中断都是IRQVICVectCntl0 = 0x20 | 15; //将15号中断EINT1设置为向量中断,并且使用优先级0 VICVectAddr0 = (uint32)EINT1_Exception; //EINT1中断服务程序地址VICDefVectAddr = (uint32)Default_Entry; //其他的非向量中断默认的处理地址,其他非向量中断都会进入Default_Entry进行处理,在Default_Entry中获得具体的中断号再进行具体处理VICIntEnable = 0x00018000; //使能EINT1和EINT2由于在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry。
ARM中断程序的原理和实现
ARM中断程序的原理和实现中断是计算机系统中的一种强制性事件,它能够暂停正在执行的程序,并立即转移到一个特殊的处理程序上去执行。
ARM架构的处理器也支持中断机制,为了正确处理中断,ARM定义了一套中断处理的规范和流程。
本文将介绍ARM中断的原理和实现。
一、ARM中断的原理1. 中断请求(Interrupt Request, IRQ):外部设备或其它条件触发的一种中断请求信号,用于向处理器报告需要进行中断处理的事件。
2. 中断服务例程(Interrupt Service Routine,ISR):是一段特殊的程序代码,用于处理中断事件。
当中断被触发后,处理器会跳转到对应的中断服务例程中执行,完成相应的中断处理逻辑。
3. 中断控制器(Interrupt Controller):负责接收处理器的中断请求,并将其派发给对应的中断服务例程。
1.外设或其它条件触发中断请求,发送中断信号给中断控制器。
2.中断控制器接收到中断请求后,对中断请求进行优先级判断,确定哪个中断请求最先被处理。
3.中断控制器将中断请求发送给处理器,并将处理器的执行流转移到中断服务例程上。
4.处理器执行中断服务例程,处理相应的中断事件。
5.中断服务例程执行完毕后,处理器返回到中断发生前的状态,继续执行原程序。
二、ARM中断的实现1.配置中断控制器ARM架构提供了多种中断控制器,如VIC(Vectored Interrupt Controller)和GIC(Generic Interrupt Controller)等。
具体的中断控制器的选择和配置方式根据具体的处理器和系统架构而定。
配置中断控制器的基本步骤如下:(1)开启中断:通过设置相关的寄存器,使能中断功能。
(2)配置中断优先级:对不同中断请求进行优先级的设置,确保高优先级的中断能够被及时处理。
(3)分配中断服务例程:将不同的中断请求与相应的中断服务例程关联起来,当中断请求触发时,中断服务例程能够被正确执行。
ARM7内核的中断屏蔽方法
置 位 当前 程 序 状 态 寄 存 器 ( P R) 的 I 来 禁 止 I CS 中 位 RQ。 快 速 中断 请 求 ( I 支 持 数 据 转 移 或 通 道 处 理 , F Q) 在
ARM 状 态 中 , I 模 式 有 8个 专 用 的 寄 存 器 可 用 来 满 足 FQ 寄 存 器 保 护 的 需 要 , 是 上 下 文 切 换 的 最 小 开 销 。 将 这 n I 信 号 拉 低 可 实 现 外 部 产 生 F Q。在 一 个 特 权 模 式 FQ I
3 A M7中 断 屏 蔽 程 序 实 现 R
ARM7内核 包 含 1个 当 前 程 序 状 态 寄 存 器 ( P R) C S , 该 寄 存 器 中包 含 条 件 代 码 标 志 位 、 制 中 断 的使 能 和 禁 止 控 位 , 及 设 置 处 理 器 操 作 模 式 位 。 当前 程 序 状 态 寄 存 器 如 以
图 2所 示 。
条件代码标 志
厂— — —]
1 AR M7处 理 器 简 介
AR 是 Ad a cd RI C Ma hn s的 缩 写 , M v n e S c ie ARM 公 司 开 发 了 很 多 系 列 的 ARM 处 理 器 内 核 , ARM7处 理 器 就
是 其 中的 一 个 系列 , 中 包 括 ARM7 其 TDMI ARM7 、 TDMI
; 明代 码 段 En be 声 a lC
} v i a l ( od { odEn be v i)
VI nt CI EnCla = 0x ffff er ffff ;
VI nt CI Ena e— I En k; bl nt Ba
E TR N Y C E2 OD 3
armv8中断处理流程
ARMv8 中断处理流程一、中断请求中断请求是由硬件或软件发起的异常信号,用于打断正在执行的指令序列,将控制权转移到中断处理程序。
在ARMv8 架构中,中断请求由中断控制器(如GIC)产生,并通过中断信号线传递给处理器核。
二、中断响应当处理器核接收到中断请求时,它会根据优先级和其他因素决定是否响应中断。
如果处理器核决定响应中断,它将执行一系列指令来保存当前执行环境的状态,并跳转到中断处理程序的入口点。
在ARMv8 架构中,中断处理程序的入口点由中断向量表(IVT)或异常向量表(EVT)指定。
三、保存上下文在中断响应过程中,处理器核需要保存当前执行环境的状态,以便在中断处理程序执行完毕后能够恢复原来的执行环境。
在ARMv8 架构中,上下文保存的操作包括:1. 保存寄存器状态寄存器(xPSR)的值;2. 保存当前指令指针(PC)的值;3. 保存堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则保存相应的程序计数器(PC)和链接寄存器(LR)的值。
四、执行异常处理程序中断处理程序的入口点通常是指向异常向量表(EVT)或中断向量表(IVT)的一个跳转指令。
当处理器核跳转到这个地址时,它会执行该地址处的指令,即异常处理程序的入口点。
在执行异常处理程序时,处理器核会根据具体的异常类型和上下文信息执行相应的操作,如执行设备驱动程序或系统调用等。
五、恢复上下文在异常处理程序执行完毕后,处理器核需要恢复原来的执行环境。
在ARMv8 架构中,上下文恢复的操作包括:1. 恢复寄存器状态寄存器(xPSR)的值;2. 恢复当前指令指针(PC)的值;3. 恢复堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则恢复相应的程序计数器(PC)和链接寄存器(LR)的值。
六、中断返回在恢复上下文后,处理器核会执行一条返回指令,将控制权从异常处理程序返回给原来的执行环境。
ARM之Cortex-M内核中断异常系统详解
ARM之Cortex-M内核中断异常系统详解问题最近在使用STM32F3芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理?在调试时,发现有中断有挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下!简介 中断(也称为“异常”)是微控制器一个很常见的特性。
中断一般是由硬件(例如外设、外部引脚)产生,当中断产生以后 CPU 就会中断当前的程序执行流程转而去处理中断服务中指定的操作。
所有的Cortex-M 内核都会系统一个用于中断处理的组件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)。
它处理处理中断,还处理其他需要服务的事件(例如 SVC 指令),通常称为“异常”。
按照 ARM 的说法,中断也是一种异常。
Cortex-M3和 Cotex-M4 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1个 Systick(滴答定时器)定时器中断和多个系统异常。
而 Cortex-M0 最多支持32个IRQ、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。
IRQ:多数由定时器、IO端口、通信接口等外设产生NMI:通常由看门狗定时器或者掉电检测器等外设产生其他:主要来自系统内核注意,本文所说的 Cortex-M 主要指定是 Cotex-M3和 Cotex-M4。
Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。
与Cotex-M3和 Cotex-M4相比,他们的指令集较小。
而且,Cortex-M1 是专门为FPGA应用设计的,没有独立MCU。
异常类型 Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16及以上的则为中断输入。
arm中断向量表的作用及工作原理
arm中断向量表的作用及工作原理
作用:
中断向量表在嵌入式系统和计算机体系结构中扮演着关键角色,其主要作用是存储了各个中断源对应的中断服务程序的入口地址。
当CPU接收到外部或内部产生的中断请求时,它会根据中断控制器传递过来的中断号,从预先定义好的中断向量表中查找到与该中断号对应的那个条目,这个条目中存放的就是ISR的地址。
工作原理:
1.中断触发:当一个中断事件发生时,硬件设备或内部逻辑会发出中断请求信号给中断控制器。
2.中断识别与优先级处理:中断控制器接收请求后,会按照优先级进行仲裁,确定最高优先级的中断并将其中断号发送给CPU。
3.中断响应:CPU停止当前执行的任务,保存现场,然后读取中断向量表中的相应位置。
4.跳转至ISR:根据中断号在中断向量表中找到对应的地址,并执行该地址处的指令,通常这个地址包含的是跳转指令,使得CPU 跳转到相应的中断服务程序的起始地址开始执行。
5.中断服务:ISR负责处理中断请求,执行相应的错误处理、数据交换或者任务调度等操作。
6.中断返回:当ISR执行完毕后,通过特定的指令序列恢复现场,清除中断标志位,并通过中断返回指令回到被中断的正常程序流程继续执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、S5PV210中中断的特点1、特点• Supports 93 vectored IRQ interrupts• Fixed hardware interrupts priority levels• Programmable interrupt priority levels• Supports Hardware interrupt priority level masking• Programmable interrupt priority level masking• Generates IRQ and FIQ• Generates Software interrupt2、FIQ与IRQ的区别1)FIQ和IRQ并不是中断源,而是中断的类型,我们可以将一个中断源设置成FIQ也可以设置成IRQ。
2)FIQ是快速中断,IRQ是一般中断,FIQ的响应时间比IRQ短。
3)FIQ的优先级高于IRQ。
4)FIQ的分组寄存器(R8~R14)比IRQ(R13~R14)多。
当在FIQ产生的时候,R8~R14不需要保存,响应的速度会快。
3、S5PV210的中断源二、原理图分析三、如何以中断的方式来检测按键:GPH2_2(EINT18) 、GPH2_3(EINT19) 按键的检测:轮询:将GPIO配置成输入…….中断:将GPIO配置成外部中断…….1、GPIO的配置,将一个GPIO配置成外部中断2、外部中断的触发方式(高电平、低电平、上升沿、下降沿)3、外部中断的开关寄存器0 = Enables Interrupt 打开中断1 = Masked 关闭中断4、外部中断判断寄存器0 = Not occur 外部中断没有发生1 = Occur interrupt 触发了中断该寄存器的作用:1)读该寄存器,可以知道对应的中断源是否触发。
2)写该寄存器,可以实现清除中断,如果一个中断不清除,CPU就会认为该中断还是存在的,就会再次触发该中断,形成循环。
所以我们在中断处理程序中,需要清除中断。
清中断的方法:如果一个中断已经触发,该寄存器的相应位会自动置1,我们需要向该位写个“1”,就可以将该位清0,写“0”无效。
这是PEND寄存器的特点例如:清EINT18EXT_INT_2_PEND |= (1<<2);5、IRQ的状态寄存器通过该寄存器,可以得到某个IRQ类型中断源是否发生的状态。
6、中断类型设置寄存器7、打开中断的寄存器例:打开EINT18和EINT19VIC0INTENABLE |= (1<<16);EXT_INT_2_MASK &= ~(0x3<<2);8、关闭中断的寄存器例:关闭EINT18和EINT19VIC0INTENCLEAR |= (1<<16);EXT_INT_2_MASK |= (0x3<<2);9、VIC向量地址寄存器ISR ----- Interrupt Service Routine 中断处理程序该寄存器的内容是当前正在响应的中断服务程序的入口地址,我们可以通过该地址去调用中断服务程序。
向该寄存器写任何值,都可以清除中断,一般情况下,中断的清除都是在ISR的结束位置。
10、每个中断源的向量地址寄存器注意:该每个VIC(共有4个)有32个这样的寄存器,当我们在做中断初始化的时候,需要安装中断,安装中断的时候,要将中断服务程序的入口地址,写到对应的向量地址寄存器中。
例:void eint18_19_isr(void){//点灯//清中断}如何实现中断向量的安装???VIC0VECTADDR16 = (unsigned int)eint18_19_isr;EINT16~EINT31的向量地址寄存器= 中断服务程序的入口地址四、中断的响应过程。
以外部中断EINT18为例,分析中断的响应过程。
1、start.S_start:ldr sp, =0x40000000 //初始化管理模式的stack,stack在DDR2中mov r0, #0x53msr CPSR, r0 //对CPSR[7:0] = 010 10011,管理模式,arm状态、关闭FIQ、IRQ打开b main //进入C环境2、当一个IRQ中断发生的时候,首先进入IRQ中断的入口地址:PC = 0x00000018, 分析0x18地址上是什么内容???0x18地址是s5pv210内容iROM中的BL0,samsung固化。
3、在iRom的0x18地址有一个跳转指令,跳转到iRAM中异常中断向量表中。
PC = 0xD0037418 ???4、异常中断向量的安装int_init(void) //中断初始化的时候调用{//vector table of exception initializepExceptionUNDEF = (unsigned long)exceptionundef;//undefinepExceptionSWI = (unsigned long)exceptionswi;//software interruptpExceptionPABORT = (unsigned long)exceptionpabort;//pabortpExceptionDABORT = (unsigned long)exceptiondabort;//data abort pExceptionIRQ = (unsigned long)IRQ_handle;//IRQpExceptionFIQ = (unsigned long)FIQ_handle;//FIQ………………………………………….}分析异常中断向量表的安装:1)pExceptionIRQ#define pExceptionIRQ ( *((volatile unsigned long *)(_Exception_Vector + 0x18)) )#define _Exception_Vector 0xD0037400总结:pExceptionIRQ是0xD0037418地址下的内容,该地址是IRQ异常中断映射后的入口地址2)(unsigned long)IRQ_handle;IRQ_handle: @CPSR会由硬件自动保存到SPSR_irqldr sp, =0xD0037F80 //初始化IRQ模式的stacksub lr, lr, #4 //返回地址的修正,原因:IRQ中断的返回地址是LR-4,与流水线相关stmfd sp!, {r0-r12, lr} //将R0~R12及LR入栈保存,相当于保护现场bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSRLR的值为什么要修正:总结:IRQ_handle子程序的入口地址PC = IRQ_handle5、执行IRQ_handle子程序IRQ_handle: @CPSR会由硬件自动保存到SPSR_irqldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, {r0-r12, lr}bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSR6、现场保护后,执行Irq_Isrvoid Irq_Isr(void){int i;//VIC的向量地址寄存器unsigned long vicaddr[4] = {VIC0ADDRESS,VIC1ADDRESS,VIC2ADDRESS,VIC3ADDRESS};void (*isr)(void) = (void *)0; //定义一个函数指针,指向0地址for(i=0; i<4; i++){if(intc_getvicirqstatus(i) != 0){isr = (void (*)(void)) vicaddr[i]; //i = 0; isr=((void)(*)(void)) VIC0ADDRESSbreak;}}(*isr)(); //调用前面定义的函数}//查看中断的状态,当某个中断发生,VICIRQSTA TUS的相应的位就会为1,例:EINT18有效:VIC0IRQSTA TUS[16] =1unsigned long intc_getvicirqstatus(unsigned long ucontroller){if(ucontroller == 0)return VIC0IRQSTA TUS;else if(ucontroller == 1)return VIC1IRQSTA TUS;else if(ucontroller == 2)return VIC2IRQSTA TUS;else if(ucontroller == 3)return VIC3IRQSTA TUS;else{}return 0;}分析:isr=((void)(*)(void)) VIC0ADDRESS1)isr 函数指针2)((void)(*)(void)) VIC0ADDRESS当EINT18有效的时候,EINT18对应向量地址寄存器(VIC0VECTADDR16)中的内容会由硬件自动的拷贝到VIC0ADDRESS寄存器中。
总结:isr函数指令,是指向VIC0ADDRESS的内容,在这个位置又是一个isr函数的调用。
PC=VIC0ADDRESS= VIC0VECTADDR16,CPU就开始执行VIC0ADDRESS下的内容。
7、ARM开始执行VIC0VECTADDR16地址下的函数在中断初始化的时候://initialize vector interrupt address with num of init and isr.//中断的安装NUM_EINT16_31---中断号:16// EINT16_31_ISR---中断处理程序//将EINT16_31_ISR的入口地址写入到VEC0VECTADDR16intc_setvectaddr(NUM_EINT16_31, EINT16_31_ISR);分析://the address resigster of vector interrupt initialize//num of int, isr of int//intc_setvectaddr(NUM_EINT16_31, EINT16_31_ISR);该函数的作用:将一个中断服务程序的入口地址,写到该中断对应的向量地址寄存器中。
void intc_setvectaddr(unsigned long intnum, void (*handler)(void)){//VIC0if(intnum<32){//*( (volatile unsigned long *)(0xF2000000+0x100+0x40)=(unsigned int)EINT16_31_ISR得到EINT16_31_ISR的入口地址//VIC0VECTADDR16=EINT16_31_ISR的入口地址*( (volatile unsigned long *)(VIC0VECTADDR + 4*intnum) ) = (unsigned)handler;}//VIC1else if(intnum<64){*( (volatile unsigned long *)(VIC1VECTADDR + 4*(intnum-32)) ) = (unsigned)handler;}//VIC2else if(intnum<96){*( (volatile unsigned long *)(VIC2VECTADDR + 4*(intnum-64)) ) = (unsigned)handler;}//VIC3else{*( (volatile unsigned long *)(VIC3VECTADDR + 4*(intnum-96)) ) = (unsigned)handler;}return;}总结:PC= VIC0VECTADDR16 = (unsigned int ) EINT16_31_ISR;8、执行中断服务程序EINT16_31_ISR外部中断EINT16_31的中断服务程序,在该中断服务中,在去判断子中断EINT18、EINT19void EINT16_31_ISR(void) //EINT18/EINT19{if(EXT_INT_2_PEND & (1<<2))//EINT18发生{GPJ2DAT ^= (1<<0); //toggle D1// clear pending bitEXT_INT_2_PEND = 1<<2;// clear VIC0ADDRESS//VIC0ADDRESS = 0;intc_clearvectaddr();}if(EXT_INT_2_PEND & (1<<3))//EINT19反生{GPJ2DAT ^= (1<<1); //toggle D2// clear pending bitEXT_INT_2_PEND = 1<<3;// clear VIC0ADDRESSintc_clearvectaddr();}}9、中断返回IRQ_handle: @CPSR会由硬件自动保存到SPSR_irq ldr sp, =0xD0037F80sub lr, lr, #4stmfd sp!, {r0-r12, lr}bl Irq_Isrldmfd sp!, {r0-r12, pc}^ @将SPSR_irq恢复给CPSRldmfd sp!, {r0-r12, pc}^分析:1)将R0~R12出栈2)将LR出栈给PC,中断的返回3)将SPSR_irq恢复给CPSR。