精华内容
下载资源
问答
  • 什么是中断向量?中断向量表的地址范围? 答:中断就是CPU在执行当前程序时由于内外部事件引起CPU暂时停止当前正在执行的程序而转向执行请求CPU暂时停止的内外部事件的服务程序,该程序处理完后又返回继续执行被停止...

    什么是中断?什么是中断向量?中断向量表的地址范围?
    答:中断就是CPU在执行当前程序时由于内外部事件引起CPU暂时停止当前正在执行的程序而转向执行请求CPU暂时停止的内外部事件的服务程序,该程序处理完后又返回继续执行被停止的程序;中断向量是中断处理子程序的入口地址;地址范围是00000H-003FFH。

    中断向量表的功能是什么?若中断向量号分别为1AH和20H,则它们的中断向量在中断向量表的什么位置上?
    答:中断向量表的功能是当中断源发出中断请求时,即可查找该表,找出其中断向量,就可转入相应的中断服务子程序。1AH在中断向量表的位置是1AH*4=68H在中断向量表0000:0068处;20H在中断向量表的位置是80H在中断向量表0000:0080处。

    展开全文
  • 中断向量

    千次阅读 2019-06-26 11:11:56
    中断向量是什么

    1. 目标

    1)中断向量概念
    2)中断向量的加载
    3)中断硬件准备
    3) 中断处理服务vector_irq的定义
    4) 中断处理服务 vector_irq的处理流程
    5) 如果进入中断前是svc模式处理场景
    6)如果进入中断钱是usr模式处理场景
    内核版本:4.4.17

    2. 中断向量表

    中断向量表中保存所有中断向量的入口,__vectors_start是一个中断向量表,其中的一项:W(b) vector_irq,就是放的一个跳转指令,跳转到vector_irq。

    在arch/arm/kernel/entry-armv.S中的__vectors_start的定义如下:

    1209 __vectors_start:                                                                
    1210         W(b)    vector_rst                                                      
    1211         W(b)    vector_und                                                      
    1212         W(ldr)  pc, __vectors_start + 0x1000                                    
    1213         W(b)    vector_pabt                                                     
    1214         W(b)    vector_dabt                                                     
    1215         W(b)    vector_addrexcptn                                               
    1216         W(b)    vector_irq                    //b是跳转指令                       
    1217         W(b)    vector_fiq                                                      
    1218                                                                                 
    1219         .data    
    
    地址异常种类
    0xffff 0000复位
    0xffff 0004未定义指令
    0xffff 0008软中断(SWI)
    0xffff 000cprefetch abort
    0xffff 0010data abort
    0xffff 0014address exception
    0xffff 0018irq
    0xffff 001cfiq

    3. 中断向量加载

    arch/arm/kernel/traps.c中,early_trap_init函数中:

    802 void __init early_trap_init(void *vectors_base)                                 
    803 {                                                                               
    804 #ifndef CONFIG_CPU_V7M                                                          
    805         unsigned long vectors = (unsigned long)vectors_base;                                                                                                  
    806         extern char __stubs_start[], __stubs_end[];                             
    807         extern char __vectors_start[], __vectors_end[];                         
    808         unsigned i;                                                             
    809                                                                                 
    810         vectors_page = vectors_base;                                            
    811                                                                                 
    812         /*                                                                      
    813          * Poison the vectors page with an undefined instruction.  This         
    814          * instruction is chosen to be undefined for both ARM and Thumb         
    815          * ISAs.  The Thumb version is an undefined instruction with a          
    816          * branch back to the undefined instruction.                            
    817          */                                                                     
    818         for (i = 0; i < PAGE_SIZE / sizeof(u32); i++)                           
    819                 ((u32 *)vectors_base)[i] = 0xe7fddef1;                          
    820                                                                                 
    821         /*                                                                      
    822          * Copy the vectors, stubs and kuser helpers (in entry-armv.S)          
    823          * into the vector page, mapped at 0xffff0000, and ensure these         
    824          * are visible to the instruction stream.                               
    825          */                                                                     
    826         memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
    827         memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);
    828         printk(KERN_ERR "tom __vectors_start=%x __vectors_end=%x\n",__vectors_start,__vectors_end);
    printk(KERN_ERR "tom %x %x %x %x\n",*((char *)vectors+24),*((char *)vectors+25),*((char *)vectors+26),*((char *)vectors+27));
    838         kuser_init(vectors_base);                                               
    839                                                                                 
    840         flush_icache_range(vectors, vectors + PAGE_SIZE * 2);                   
    841 #else /* ifndef CONFIG_CPU_V7M */                                               
    842         /*                                                                      
    843          * on V7-M there is no need to copy the vector table to a dedicated     
    844          * memory area. The address is configurable and so a table in the kernel
    845          * image can be used.                                                   
    846          */                                                                     
    847 #endif                                                                          
    848 }  
    

    打印信息是:

    tom __vectors_start=80630000 __vectors_end=80630020
    tom 0 4 0 ea
    

    在System.map中有__vectors_start的符号是0x80630000 ,__vectors_end是 0x80630020和打印信息一致。
    1
    W(b) vector_irq在内存的内容分别是: 0x00 0x04 0x00 0xea,这些是机器码,转换为整数是:0xea000400,0xea是跳转b的机器码,0x400是偏移量,怎么算出偏移量呢?
    在objdump -d vmlinux中输出信息中:
    123

    1. 场景是:程序中执行到0x18: b vector_irq,跳转到0x1020中的vector_irq中的偏移量怎么算?
      偏移量公式: (目标地址 - 指令地址 - 8)/ 4 = 偏移
      则: (0x1020-0x18-8)/4=0x400
      2)静态分析vmlinux中b vector_irq的机器码就是0xea00400,和内存运行时的内容一样的。

    3 vector_irq定义

    vector_stub的定义如下:

    1027         .macro  vector_stub, name, mode, correction=0   //定义vector_stub有3个参数name,mode和correction                        
    1028         .align  5   
    
    1030 vector_\name:                                                                   
    1031         .if \correction                                                         
    1032         sub     lr, lr, #\correction                                            
    1033         .endif                                                                  
    1034                                                                                 
    1035         @                                                                       
    1036         @ Save r0, lr_<exception> (parent PC) and spsr_<exception>              
    1037         @ (parent CPSR)                                                         
    1038         @                                                                       
    1039         stmia   sp, {r0, lr}            @ save r0, lr                           
    1040         mrs     lr, spsr                                                        
    1041         str     lr, [sp, #8]            @ save spsr                             
    1042                                                                                 
    1043         @                                                                       
    1044         @ Prepare for SVC32 mode.  IRQs remain disabled.                        
    1045         @                                                                       
    1046         mrs     r0, cpsr                                                        
    1047         eor     r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)                     
    1048         msr     spsr_cxsf, r0                                                   
    1049                                                                                 
    1050         @                                                                       
    1051         @ the branch table must immediately follow this code                    
    1052         @                                                                       
    1053         and     lr, lr, #0x0f                                                   
    1054  THUMB( adr     r0, 1f                  )                                       
    1055  THUMB( ldr     lr, [r0, lr, lsl #2]    )                                       
    1056         mov     r0, sp                                                          
    1057  ARM(   ldr     lr, [pc, lr, lsl #2]    )                                       
    1058         movs    pc, lr                  @ branch to handler in SVC mode         
    1059 ENDPROC(vector_\name)
    

    vector_irq的定义如下:

    1080         vector_stub     irq, IRQ_MODE, 4                                        
    1081                                                                                 
    1082         .long   __irq_usr                       @  0  (USR_26 / USR_32)         
    1083         .long   __irq_invalid                   @  1  (FIQ_26 / FIQ_32)         
    1084         .long   __irq_invalid                   @  2  (IRQ_26 / IRQ_32)         
    1085         .long   __irq_svc                       @  3  (SVC_26 / SVC_32)         
    1086         .long   __irq_invalid                   @  4                            
    1087         .long   __irq_invalid                   @  5                            
    1088         .long   __irq_invalid                   @  6                            
    1089         .long   __irq_invalid                   @  7                            
    1090         .long   __irq_invalid                   @  8                            
    1091         .long   __irq_invalid                   @  9                            
    1092         .long   __irq_invalid                   @  a                            
    1093         .long   __irq_invalid                   @  b                            
    1094         .long   __irq_invalid                   @  c                            
    1095         .long   __irq_invalid                   @  d                            
    1096         .long   __irq_invalid                   @  e                            
    1097         .long   __irq_invalid                   @  f                            
    1098                                                       
    

    中断硬件准备

    当一切准备好之后,一旦打开处理器的全局中断就可以处理来自外设的各种中断事件了。

    当外设(SOC内部或者外部都可以)检测到了中断事件,就会通过interrupt requestion line上的电平或者边沿(上升沿或者下降沿或者both)通知到该外设连接到的那个中断控制器,而中断控制器就会在多个处理器中选择一个,并把该中断通过IRQ(或者FIQ,本文不讨论FIQ的情况)分发给该processor。ARM处理器感知到了中断事件后,会进行下面一系列的动作:

    1. 修改CPSR(Current Program Status Register)寄存器中的M[4:0]。改变CPSR中M[4:0],把模式切换成IRQ MODE模式。
      2)保存发生中断那一点的CPSR值(step 1之前的状态)和PC值。(比如在用户空间,就保存用户空间的CPSR和PC;在内核空间,就保存内核空间的CPSR和PC)
      2.1 中断那一刻的CPSR,保存到IRQ MODE的SPSR中
      2.3 中断那一一刻的PC,保存到LR_IRQ中
      对于thumb state,lr_irq = PC
      对于ARM state,lr_irq = PC - 4
      3、mask IRQ exception。也就是设定CPSR.I = 1
      4、设定PC值为IRQ exception vector。
      系统现在从发生中断之前的模式(比如用户或者内核模式)切换成IRQ模式。

    struct stack {
    u32 irq[3];
    u32 abt[3];
    u32 und[3];
    } ____cacheline_aligned;

    static struct stack stacks[NR_CPUS];

    4. vector_irq的处理流程

    跳转到vector_irq模式,这个模式下 lr_irq保存发生中断时刻的PC 指针,IRQ_SPSR保存发生中断时刻的CPSR。
    1)lr_irq= PC -4 (中断时刻PC寄存器) IRQ_SPSR= CPSR(中断时刻的CPSR)
    2)在cpu_init中SP_IRQ指向stacks->irq地址,通过stmia sp, {r0, lr} 指令,stacks->irq[0]=r0(中断前的r0),stacks->irq[1]=LR_IRQ=PC-8(中断时刻下一条要执行的命令),通过 mrs lr, spsr和str lr, [sp, #8],stacks->irq[2]=LR_SPSR=CPSR(中断时刻的CPSR)
    3)把SP_IRQ,存放到r0中。
    4)PC设置为根据发生中断时刻的状态的处理函数地址,并且把IRQ模式切换为SVC模式。

    1030 vector_\name:                                                                   
    1031         .if  4                                                         
    1032         sub     lr, lr, 4    //     /*计算返回地址(在arm流水线中,lr=pc+8,但是pc+4只译码没有执行,所以lr=lr-4) */                           
    1033         .endif                                                                  
    1034                                                                                 
    1035         @                                                                       
    1036         @ Save r0, lr_<exception> (parent PC) and spsr_<exception>              
    1037         @ (parent CPSR)                                                         
    1038         @                                                                       
    1039         stmia   sp, {r0, lr}            @ save r0, lr           //把r0和lr寄存器的内容保存到sp寄存器保存的地址中                
    1040         mrs     lr, spsr                                      //把状态寄存器spsr的内容保存到lr寄存器器中                  
    1041         str     lr, [sp, #8]            @ save spsr    
              //  将lr的内容保存到SP指向的地址加上8个字节后的地址中,就是栈指针SP+8保存的内容是spsr。
    1042                                                                                 
    1043         @                                                                       
    1044         @ Prepare for SVC32 mode.  IRQs remain disabled.                        
    1045         @                                                                       
    1046         mrs     r0, cpsr                            
           //将cpsr的寄存器的值保存到r0寄存器中                            
    1047         eor     r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)          
         //mode=IRQ_MODE=0x00000012  SVC_MODE=0x13  PSR_ISETSTATE=0x20
         // #(\mode ^ SVC_MODE | PSR_ISETSTATE) =0x12^0x13|0x20=0x1|0x20=0x21
         //eor是异或,r0和0x21异或后,保存到r0中,就是反转bit0和bit5,也就是把CPSR寄存器中的bit0和bit5反转后,保存到r0寄存器中。
         
         
    1048         msr     spsr_cxsf, r0         
    //把r0寄存器中的内容给SPSR,也就是把寄存器CPSR的bit0和bit5反转后,保存到SPSR寄存器。
    //之前是THUMB模式转换为ARM模式,IRQ模式转换为SVC模式                                    
    1049                                                                                 
    1050         @                                                                       
    1051         @ the branch table must immediately follow this code                    
    1052         @                                                                       
    1053         and     lr, lr, #0x0f           
    //       把lr寄存器中的内容保留bit3-bit0。 就是把spsr的模式位保存下来      就是在进入中断模式前,CPSR就是进中断的模式存到CPSR中。 
    1054  THUMB( adr     r0, 1f                  )          //THUMB是在THUMB模式下才执行的命令                             
    1055  THUMB( ldr     lr, [r0, lr, lsl #2]    )                                 
    1056         mov     r0, sp                                //把sp占地保存到r0中。                              
    1057  ARM(   ldr     lr, [pc, lr, lsl #2]    )          /如果进入中断前是usr,则lr=0   如果是SVC,则lr=3                    
    1058         movs    pc, lr                  @ branch to handler in SVC mode     //此时已经切换成SVC模式    
    1059 ENDPROC(vector_\name)
    

    问题1:
    THUMB或者ARM宏在哪种模式下执行?

    THUMB宏在THUMB模式下执行。
    ARM宏在 ARM模式下执行。

    问题2:

    在这里插入图片描述

    1054  THUMB( adr     r0, 1f                  )          //THUMB是在THUMB模式下才执行的命令                             
    1055  THUMB( ldr     lr, [r0, lr, lsl #2]    )       
    

    如果lr=0,则ldr lr,[r0,lr,lsl #2]后,lr=r0+lr*4=r0,因为lr是标签1的地址,但是1:的 入口地址为什么是.long __irq_usr?
    因为1:和__irq_usr之间的代码不占空间。

    其他

    1.1 SWI异常

    在__vectors_start中W(ldr) pc, __vectors_start + 0x1000 ,指的软中断SWI。
    如下图中所示,在System.map中查看,可以看到 __vectors_start + 0x1000,也就是 __stubs_start。
    stubs_start
    查看__stubs_start的定义如下,可以看到__stubs_start指向vector_swi标签。

    1067 __stubs_start:                                                                  
    1068         @ This must be the first word                                           
    1069         .word   vector_swi 
    

    1.2 CPSR寄存器

    M[4:0]模式
    0b10000用户
    0b10001FIQ
    0b10010IRQ
    0b10011管理模式
    0b10111中止
    0b11011未定义
    0b11011系统
    bit5工作状态
    1Thumb
    0ARM

    注:
    所有处理器模式下都可访问当前程序状态寄存器CPSR。CPSR中包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。在每种异常模式下都有一个对用的程序状态寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。

    c - control field mask byte(xPSR[7:0])
    x - extension field mask byte(xPSR[15:8])
    s - status field mask byte(xPSR[23:16)
    f - flags field mask byte(xPSR[31:24]).
    老式声明方式:cpsr_flg,cpsr_all在ADS中已经不在支持
    cpsr_flg对应cpsr_f
    cpsr_all对应cpsr_cxsf
    

    参考

    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction
    ARM中断表与响应流程
    Linux系统调用过程中user栈的保存与恢复
    linux中断中(异常向量详解)

    展开全文
  • ARM 中断向量介绍

    2020-12-21 14:44:40
    验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。然后阐明关键字“-irq”的作用,设计出中断处理函数。...异常主要是从处理器被动接受的角度出发的一种描述,意外操作引起的异常。而中断则带...

    验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。然后阐明关键字“-irq”的作用,设计出中断处理函数。最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。实践证明程序运行稳定可靠。

    引言

    计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。

    1.异常中断响应和返回

    系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作:

    1)  将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。

    2)  将CPSR复制到相应的SPSR中。

    3)  根据异常类型,强制设置CPSR的运行模式位。

    4)   强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

    这些工作是由ARM 内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:

    1)  将连接寄存器LR的值减去相应的偏移量后送到PC中。

    2)   将SPSR复制回CPSR中。

    3)   若在进入异常处理时设置了中断禁止位,要在此清除。

    这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。

    2.异常处理程序设计

    2.1   异常响应流程

    由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。

    三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:

    HandlerXXX

    sub    sp,sp,#4   ;减少sp,保存跳转地址

    stmfd  sp!,{r0}    ;将工作寄存器压入堆栈

    ldr   r0,=HandleXXX ;将HandleXXX地址放入r0

    ldr     r0,[r0]   ;将中断程序入口地址放入r0

    str   r0,[sp,#4]  ;将中断程序入口地址压入堆栈

    ldmfd   sp!,{r0,pc}  ;将工作寄存器和中断程序入口地址弹出到r0和PC

    图1异常处理调用

    并且在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:

    AREA RamData, DATA, READWRITE

    ^   _ISR_STARTADDRESS

    HandleReset                 #   4

    HandleUndef               #   4

    HandleSWI                #   4

    HandlePabort           #   4

    HandleDabort           #   4

    HandleReserved         #   4

    HandleIRQ                #   4

    HandleFIQ                #   4

    通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:b  HandlerIRQ

    在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。

    2.2   异常分支

    系统可能存在多个 IRQ/FIQ的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在ARM的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。

    当响应外设的一个中断请求时,首先触发ARM核的中断,进人中断程序,再通过中断控制器识别中断源,使PC能够自动获得中断处理程序的地址。有的芯片支持特殊的硬件分支功能,依据中断源自动跳转到向量表的相应地址,多数情况下是用软件来处理异常分支。

    在S3C2410体系中,中断的调用可以看成是经历了2次“中断向量表”的查询。2410init.s中的以下代码完成功能就是查询中断偏移寄存器INTOFFSET,得到当前中断的中断号,并根据中断号再调用相关的中断服务程序。

    IsrIRQ

    sub    sp,sp,#4

    stmfd         sp!,{r8-r9}

    ldr     r9,=INTOFFSET

    ldr     r9,[r9]

    ldr     r8,=HandleEINT0

    add    r8,r8,r9,lsl #2

    ldr     r8,[r8]

    str     r8,[sp,#8]

    ldmfd         sp!,{r8-r9,pc}

    为了方便C程序使用中断,将IsrIRQ设为IRQ的中断服务程序。

    ldr     r0,=HandleIRQ

    ldr     r1,=IsrIRQ

    str     r1,[r0]

    其中HandleEINT0是用户自己开辟的一块存储空间的起始地址,后面按次序存放中断异常处理程序的地址,也可以理解为二级中断向量表。IsrIRQ从中断控制器处获取中断源信息,然后再从二级中断向量表中的对应地址单元得到异常中断处理程序的入口地址,完成异常响应的跳转。二级中断向量表一般位于 HandleFIQ的后面,也就是以_ISR_STARTADDRESS+0x20为起始地址,这里定义了S3C2410处理器所有中断源的相关中断处理处理程序入口。这种方法的好处是用户程序在运行过程中能够动态改变异常向量。

    2.3   中断函数设计

    为了方便高级语言设计中断处理函数,标准的ARM指令编译器提供了一个用来声明中断处理函数的关键字-irq,使用此关键字声明的函数可以被编译器识别为中断处理函数。编译后的代码在处理异常事件前保存现场信息,处理异常事件后对现场信息进行恢复。中断函数设计如下:

    static void __irq Eint3Int(void){

    ClearPending(BIT_EINT3);

    Uart_Printf("EINT3 interrupt is occurred.\n");

    num_int=3;设置标志位

    }

    定义中断处理程序入口地址:#define pISR_EINT3     (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

    在初始化程序,引用代码pISR_EINT3=(U32)Eint3Int,即可定义地址_ISR_STARTADDRESS+0x2c内容是Eint3Int的地址,外部中断3产生请求时即可调用中断处理函数Eint3Int。

    3.外中断初始化程序设计

    S3C2410X 的中断控制寄存器能接收来自56个中断源的请求。内部的外围模块和外部管脚产生的多个中断请求通过中断控制器冲裁后,向ARM920T核发出FIQ或者 IRQ中断。ARM内核只有2个外部中断输入信号nIRQ和nFIQ,在具体嵌入式系统中,需要用中断控制器管理多个外部中断源,选择其中一个中断,通过 nIRQ或nFIQ向ARM内核发出中断请求,如图2所示。

    图2 FIQ/IRQ中断处理过程

    ARM920T内核可以识别正常中断请求和快速中断请求两种类型的外部中断,中断的行为模式由中断控制器来设置。S3C2410X的中断控制器包括6类寄存器:中断源状态寄存器、中断模式寄存器、中断屏蔽寄存器、优先级寄存器、中断状态寄存器,以及中断偏移寄存器。

    在初始化程序中,需要选择相应管脚的功能,在此定义GPF3为EINT3模式,通过外部中断控制寄存器EXTINT0设定EINT3是下降沿触发方式,通过设置中断源悬挂寄存器SRCPND、中断悬挂寄存器INTPND和中断屏蔽寄存器INTMSK开启EINT3。中断模式寄存器和中断优先级寄存器采用系统默认方式。具体代码实现如下:

    void Eint_Init(void){

    rGPFCON = (rGPFCON & 0x3f0c)|(1<<7);

    rEXTINT0 = (rEXTINT0 & ~(0x7<<12)) | 0x2<<12;

    pISR_EINT3=(U32)Eint3Int;

    图3 主程序流程图

    rSRCPND = BIT_EINT3;

    rINTPND = BIT_EINT3;

    rINTMSK=~( BIT_EINT3);

    }

    如果采用EINT4~EINT23之间的中断源,还需要设置外部中断悬挂寄存器EINTPEND和外部中断掩码寄存器EINTMASK的相关位。

    在C语言的Main()程序中调用Eint_Init()函数,即可完成中断处理的初始化操作。操作流程如图3所示。

    若外部下降沿信号接到GPF3管脚,就可以调用Eint3Int中断处理函数。

    5.结论

    本文作者创新点在于采用的异常处理程序设计方式灵活可靠,可以在系统运行期间动态修改中断向量表,利用C语言也可实现中断处理函数的动态配置。在所设计的键盘处理程序中采用该方法,取得了很好地效果,该方法具有很强的通用性。

    来源:[http://www.jdzj.com]机电之家·机电行业电子商务平台!

    展开全文
  • 中断向量 每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表...

    中断向量

    每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。

    中断地址

    中断向量表或中断向量跳转表中每个表项所在的内存地址或表项的索引值,称为向量地址或中断类型号。

    向量中断

    是指一种识别中断源的技术或方式。识别中断源的目的就是要找到中断源对应的中断服务程序的入口地址的地址,即获得向量地址。

     

     

    展开全文
  • 问:What is interrupt? 百度百科:中断是在计算机执行程序的过程中,...在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。 中断向量地址:内存中存放中断服务程序入口地址的地址 ...
  • 中断向量就是该类型中断的中断服务例行程序的入口地址和处理器状态字。 每个中断向量包含两个字: 1、中断服务例行程序的入口地址 2、服务例行程序所用的处理机状态字。 转载于:...
  • 中断向量与向量地址 中断号——中段的编号 什么是中断向量?我们可以把它理解成中断服务程序的入口地址。 比如说在 x86 系列当中,我们可以把中断向量理解成中断服务程序的段地址和偏移量组成的一个向量。 有的时候...
  • 所谓中断是CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU...中断向量:中断的地址的变量; 中断向量表:中断类型号与相应中断源的中断处理程序入口地址之间的连接表; 中断服...
  • 中断:所谓中断CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序...
  • 51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为:void INT0()interrupt 0 using...
  • 中断向量,中断向量表 ,中断服务函数

    千次阅读 多人点赞 2019-07-29 12:31:52
    所谓中断是CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时...中断向量:中断的地址的变量; 中断向量表:中断类型号与相应中断源的中断处理程序入口地址之间的连接表; ...
  • 51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为:  void INT0()interrupt 0 ...
  • IC基础知识(十)中断向量地址

    千次阅读 2020-12-24 09:15:42
    中断向量地址
  • 本文档的主要内容详细介绍的是51单片机内核的中断及中断向量的详细资料说明。51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM...
  • 1、中断和事件区别 从外部激励信号来看,中断和事件没有区别。从处理来看,中断会向CPU残剩请求,需要CPU响应中断程序。事件则是对其他模块发出的脉冲信号,具体其他设备如何响应,就由这个模块决定。 2、配置 1、...
  • 说到中断号和中断向量,也许你并不陌生,这两个概念也可以将中断原理解释个大概了。但是当你深究下去的时候你会碰到另一个东西——IRQ,之后自然而然的对从硬件级开始到中断向量表的整个中断过程产生好奇,然后继续...
  • 向量中断 非向量中断向量中断与非向量中断的区别 推荐向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了再判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简单 ...
  • 计算机组成原理中的向量中断

    千次阅读 2019-01-07 18:34:33
    向量中断即中断源的识别标志,可用来存放中断服务程序的入口地址或跳转到中断服务程序的入口地址。...是一种中断方式,注意与中断向量相区别。 向量中断地址:内存中存放中断服务程序入口地址的地址...
  • 向量中断和非向量中断的区别

    千次阅读 2018-04-22 21:01:55
    为什么会有两种IRQ中断...44B0X的厂家三星为了加快IRQ中断的响应速度,在此基础上添加了另外一种方法,其实也就是单片机中都采用的固定中断向量地址的办法,很明显这种方法减少了中断响应的时间。 向量中断就...
  • 中断向量: 中断服务程序的入口地址 中断嵌套 是中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,...
  • 20-8086处理器的中断机制

    千次阅读 2019-04-03 17:47:26
    中断就是打断处理器当前的执行流程,去执行另外一些和当前工作不相干的指令,执行完以后,还可以返回到原来的程序流程继续执行。在现实生活中我们也会经常遇到类似中断这样的事情,例如你正在用手机听歌,突然你的...
  •  (1)存放中断服务程序的入口地址  在PC/AT机中,中断向量中断服务程序的入口地址,每个中断向量分配4个连续的字节单元,两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的段内偏移...
  • 仿照着写个bootloader(四) 中断向量

    千次阅读 2014-12-22 22:51:34
    这是x86 bootloader的第四篇,实模式的最后一篇,后面就要开启A20线-分页... 8086 CPU在进入实模式前,中断表跟8051长的有点神似,从0x0000开始每4B为一个中断向量,4B空间肯定不够处理中断事件,于是,这4B空间被安排
  •  向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了在判断中断标志来识别具体是哪个中断。... 向量者,矢量也,即方向,门路。  向量中断——由硬件提供中断服务程序入口地址

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,106
精华内容 6,842
关键字:

中断向量指的是