收藏 分享(赏)

ARM异常中断机制.doc

上传人:精品资料 文档编号:10246322 上传时间:2019-10-24 格式:DOC 页数:4 大小:69KB
下载 相关 举报
ARM异常中断机制.doc_第1页
第1页 / 共4页
ARM异常中断机制.doc_第2页
第2页 / 共4页
ARM异常中断机制.doc_第3页
第3页 / 共4页
ARM异常中断机制.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、ARM9(以 S3C2410 为例)中断机制一、ARM 异常机制介绍ARM9 处理器有 7 种工作模式。分别是用户模式(usr) : ARM 处理器正常的程序执行状态。快速中断模式(fiq):用于高速数据传输或通道处理。外部中断模式(irq):用于通用的中断处理。管理模式(svc):操作系统使用的保护模式。数据访问终止模式(abt):当数据或指令预取终止时进入该模式。系统模式(sys):运行具有特权的操作系统任务。未定义指令中止模式(und):当未定义的指令执行时进入该模式。每种模式通过 5 位二进制编码进行标示:用户模式 10000快速中断模式 10001外部中断模式 10010管理模式 1

2、0011数据访问终止模式 10111未定义指令中止模式 11011系统模式 11111模式编码存放在 CPSR(程序当前状态寄存器)中的4:0。快速中断模式、外部中断模式、数据访问终止模式、未定义指令中止模式、管理模式称为异常模式。异常类型 具体含义复位 当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。未定义指令 遇到不能处理的指令时,产生未定义指令异常。软件中断 该异常由执行 SWI 指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,

3、但当预取的指令被执行时,才会产生指令预取中止异常。数据中止 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且 CPSR 中的 I 位为 0 时,产生 IRQ 异常。系统的外设可通过该异常请求中断服务。FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且 CPSR 中的 F 位为 0 时,产生 FIQ异常。当多个异常发生时,处理器根据优先级进行处理。优先级 1(最高) 复位2 数据中止3 FIQ4 IRQ5 预取指令中止6(最低) 未定义指令、SWI异常中断发生时,处理器执行完当前的指令,需要保存当前执

4、行现场,切换到相应的异常模式,并跳转到相应的异常中断处理程序。中断处理完成后,处理器返回现场执行下条指令。异常处理一般过程如下:(1)把当前工作模式中的下一条即将运行的指令地址保存到 R14 中;(2)保存当前 CPSR 到 SPSR(保存程序状态寄存器) ;(3)改写 CPSR 中的工作模式为当前产生异常的工作模式;(4)禁止 IRQ(如果进入 FIQ 则禁止 FIQ) ;(5)跳转到相应异常向量表入口;如果是复位异常处理会禁止所有中断,另外由于不用返回,因此不需要作(1) (2)步。以上的异常处理操作都是由处理器自动完成的。二、异常向量表Linux 内核启动时,向量表的创建过程为:init

5、/main.c-start_kernel()-trap_init()。trap_init 函数位于 /arch/$(ARCH)/kernel/traps.c 中。trap_init 函数中向量表创建的相关代码如下:unsigned long vectors = CONFIG_VECTORS_BASE;memcpy(void *)vectors, _vectors_start, _vectors_end - _vectors_start);memcpy(void *)vectors + 0x200, _stubs_start, _stubs_end - _stubs_start);其中 CONF

6、IG_VECTORS_BASE 是向量表的基地址。在 ARM V4 及 V4T 以后的大部分处理器中,向量表可以有两个位置:一个是 0,另一个是 0xffff0000。通过 CP15 协处理器 c1 寄存器中 V 位(bit13)控制。V 和异常向量表的对应关系如下:V=0 0x000000000x0000001CV=1 0xffff00000xffff001CCONFIG_VECTORS_BASE 的值在内核的相关配置文件中定义。比如在/arch/arm/configs/s3c2410_defconfig 中 CONFIG_VECTORS_BASE=0xffff0000。异常向量表存放在_v

7、ectors_start 至_vectors_end 定义的空间内。异常向量表的逻辑结构(8*4 个字节)为:异常类型 工作模式 地址复位 管理模式 0x00000000未定义指令 未定义指令中止模式 0x00000004软件中断 管理模式 0x00000008中止(预取指令) 数据访问终止模式 0x0000000C中止(数据) 数据访问终止模式 0x00000010保留 0x00000014IRQ 外部中断模式 0x00000018FIQ 快速中断模式 0x0000001C异常向量表的物理结构位于 arch/arm/kernel/entry-armv.S 中,如下所示:.globl _vec

8、tors_start_vectors_start:swi SYS_ERROR0:b vector_und + stubs_offset /复位异常:ldr pc, .LCvswi + stubs_offset /未定义指令异常 :b vector_pabt + stubs_offset /软件中断异常:b vector_dabt + stubs_offset /数据异常(预取指令中止、数据中止):b vector_addrexcptn + stubs_offset /保留:b vector_irq + stubs_offset /普通中断异常:b vector_fiq + stubs_offs

9、et /快速中断异常:.globl _vectors_end:_vectors_end:异常向量表中各种异常对应位置上放置了一条跳转指令,用于指向相应异常的处理程序。_stubs_start 至_stubs_end 之间是异常处理程序的位置。stubs_offset 的值为:.equ stubs_offset, _vectors_start + 0x200 - _stubs_start三、中断处理中断发生后,处理器执行向量表中的 b vector_irq + stubs_offset 指令。接着根据进入中断前的具体工作模式,执行 irq_handler 处理过程。irq_handler 处理过

10、程位于/arch/arm/kernel/entry-armv.S 中,如下所示:.macro irq_handler1: get_irqnr_and_base r0, r6, r5, lr 判断中断号,通过 R0 返回 bne asm_do_IRQ 进入中断处理。 .endm中断号的值是在和平台相关的文件中决定的。比如 IRQ_EINT0 在 include/asm/arch-s3c2410/irqs.h 中定义。这说明中断号的具体值和硬件中断挂起寄存器中的中断号是不等的。asm_do_IRQ 位于 arch/arm/kernel/irq.c,如下所示:asmlinkage void _exc

11、eption asm_do_IRQ(unsigned int irq, struct pt_regs *regs)struct pt_regs *old_regs = set_irq_regs(regs);struct irq_desc *desc = irq_desc + irq; /根据中断号找到对应的 irq_desc。irq_desc 是外部中断描述符表,用于存储中断的相关信息desc_handle_irq(irq, desc);/ 根据中断号和 desc 进入中断处理 irq_finish(irq);irq_exit();set_irq_regs(old_regs);static i

12、nline void desc_handle_irq(unsigned int irq, struct irq_desc *desc)desc-handle_irq(irq, desc); /中断处理 在 include/linux/interrupt.h 中定义了 irqaction 结构体,如下所示:struct irqaction irq_handler_t handler; /中断处理函数,注册时提供unsigned long flags; /中断标志,注册时提供cpumask_t mask; /中断掩码const char *name; /中断名称void *dev_id; /设备

13、id,本文后面部分介绍中断共享时会详细说明这个参数的作用struct irqaction *next; /如果有中断共享,则继续执行,int irq; /中断号,注册时提供struct proc_dir_entry *dir; /指向 IRQn 相关的/proc/irq/n 目录的描述符;在注册中断号为 irq 的中断服务程序时,系统会根据注册参数封装相应的 irqaction 结构体。并把中断号为 irq 的 irqaction 结构体写入 irq_desc irq-action。这样就把设备的中断请求号与该设备的中断服务例程 irqaction 联系在一起了。当 CPU 接收到中断请求后,就可以根据中断号通过 irq_desc 找到该设备的中断服务程序。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报