精华内容
下载资源
问答
  • 其中,外部中断源通过GPIO以复用方式成为内部中断源的一部分。 但是我们清楚,INTMSK是一个32位寄存器,最多只能支持32中断,它是如何对应这么多中断呢? 首先我们先看INTMSK对应位。 INTERRUPT MASK...
    S3c2440支持多达36个内部中断源和24个外部中断源,分别使用内部终端屏蔽寄存器INTMSK和外部中断寄存器MSK进行屏蔽控制。其中,外部中断源通过GPIO以复用的方式成为内部中断源的一部分。

    但是我们清楚,INTMSK是一个32位的寄存器,最多只能支持32中断,它是如何对应这么多中断的呢?

    首先我们先看INTMSK对应的位。
    INTERRUPT MASK (INTMSK) REGISTER (Continued)
    INT_ADC [31] 0 = Service available, 1 = Masked 1
    INT_RTC [30] 0 = Service available, 1 = Masked 1
    INT_SPI1 [29] 0 = Service available, 1 = Masked 1
    INT_UART0 [28] 0 = Service available, 1 = Masked 1
    INT_IIC [27] 0 = Service available, 1 = Masked 1
    INT_USBH [26] 0 = Service available, 1 = Masked 1
    INT_USBD [25] 0 = Service available, 1 = Masked 1
    INT_NFCON [24] 0 = Service available, 1 = Masked 1
    INT_UART1 [23] 0 = Service available, 1 = Masked 1
    INT_SPI0 [22] 0 = Service available, 1 = Masked 1
    INT_SDI [21] 0 = Service available, 1 = Masked 1
    INT_DMA3 [20] 0 = Service available, 1 = Masked 1
    INT_DMA2 [19] 0 = Service available, 1 = Masked 1
    INT_DMA1 [18] 0 = Service available, 1 = Masked 1
    INT_DMA0 [17] 0 = Service available, 1 = Masked 1
    INT_LCD [16] 0 = Service available, 1 = Masked 1
    INT_UART2 [15] 0 = Service available, 1 = Masked 1
    INT_TIMER4 [14] 0 = Service available, 1 = Masked 1
    INT_TIMER3 [13] 0 = Service available, 1 = Masked 1
    INT_TIMER2 [12] 0 = Service available, 1 = Masked 1
    INT_TIMER1 [11] 0 = Service available, 1 = Masked 1
    INT_TIMER0 [10] 0 = Service available, 1 = Masked 1
    INT_WDT_AC97 [9] 0 = Service available, 1 = Masked 1
    INT_TICK [8] 0 = Service available, 1 = Masked 1
    nBATT_FLT [7] 0 = Service available, 1 = Masked 1
    INT_CAM [6] 0 = Service available, 1 = Masked 1
    EINT8_23 [5] 0 = Service available, 1 = Masked 1
    EINT4_7 [4] 0 = Service available, 1 = Masked 1
    EINT3 [3] 0 = Service available, 1 = Masked 1
    EINT2 [2] 0 = Service available, 1 = Masked 1
    EINT1 [1] 0 = Service available, 1 = Masked 1
    EINT0 [0] 0 = Service available, 1 = Masked 1

    我们发现INTMSK的第5,6位对应了EINT4_7, EINT8_23,20个外部中断,也就是所,这20个GPIO引脚只能触发这两个中断。
    但是当中断到来时,我们如果判断是由哪一个GPIO引脚触发的呢?这个时候我们可以通过查询EINTMASK来判断中断源。
    EINTMASK Bit Description
    EINT23 [23] 0 = enable interrupt 1= masked
    EINT22 [22] 0 = enable interrupt 1= masked
    EINT21 [21] 0 = enable interrupt 1= masked
    EINT20 [20] 0 = enable interrupt 1= masked
    EINT19 [19] 0 = enable interrupt 1= masked
    EINT18 [18] 0 = enable interrupt 1= masked
    EINT17 [17] 0 = enable interrupt 1= masked
    EINT16 [16] 0 = enable interrupt 1= masked
    EINT15 [15] 0 = enable interrupt 1= masked
    EINT14 [14] 0 = enable interrupt 1= masked
    EINT13 [13] 0 = enable interrupt 1= masked
    EINT12 [12] 0 = enable interrupt 1= masked
    EINT11 [11] 0 = enable interrupt 1= masked
    EINT10 [10] 0 = enable interrupt 1= masked
    EINT9 [9] 0 = enable interrupt 1= masked
    EINT8 [8] 0 = enable interrupt 1= masked
    EINT7 [7] 0 = enable interrupt 1= masked
    EINT6 [6] 0 = enable interrupt 1= masked
    EINT5 [5] 0 = enable interrupt 1= masked
    EINT4 [4] 0 = enable interrupt 1= masked
    Reserved [3:0] Reserved
    但是还有一个疑问,不是说60个中断源吗?除去24个外部中断源应该还有60-24 -(32-6)=10个内部中断源啊。他们在哪呢?

    其实这里涉及到了子中断源的概念。
    Sub Sources Descriptions Source
    INT_AC97 AC97 interrupt             INT_WDT_AC97
    INT_WDT Watchdoc interrupt       INT_WDT_AC97
    INT_CAM_P P-port capture interrupt in camera interface        INT_CAM
    INT_CAM_C C-port capture interrupt in camera interface       INT_CAM
    INT_ADC_S ADC interrupt                                                      INT_ADC
    INT_TC Touch screen interrupt (pen up/down)                    INT_ADC
    INT_ERR2 UART2 error interrupt                                        INT_UART2
    INT_TXD2 UART2 transmit interrupt                        INT_UART2
    INT_RXD2 UART2 receive interrupt                          INT_UART2
    INT_ERR1 UART1 error interrupt                              INT_UART1
    INT_TXD1 UART1 transmit interrupt I                        NT_UART1
    INT_RXD1 UART1 receive interrupt                           INT_UART1
    INT_ERR0 UART0 error interrupt                              INT_UART0
    INT_TXD0 UART0 transmit interrupt                         INT_UART0
    INT_RXD0 UART0 receive interrupt                          NT_UART0

    转载于:https://www.cnblogs.com/hnrainll/archive/2011/06/29/2093460.html

    展开全文
  • 其中,外部中断源通过GPIO以复用方式成为内部中断源的一部分。 但是我们清楚,INTMSK是一个32位寄存器,最多只能支持32中断,它是如何对应这么多中断呢? 首先我们先看INTMSK对应位。 INTERRUPT MASK...
    S3c2440支持多达40个内部中断源和20个外部中断源,分别使用内部终端屏蔽寄存器INTMSK和外部中断寄存器MSK进行屏蔽控制。其中,外部中断源通过GPIO以复用的方式成为内部中断源的一部分。

    但是我们清楚,INTMSK是一个32位的寄存器,最多只能支持32中断,它是如何对应这么多中断的呢?

    首先我们先看INTMSK对应的位。
    INTERRUPT MASK (INTMSK) REGISTER (Continued)
    INT_ADC [31] 0 = Service available, 1 = Masked 1
    INT_RTC [30] 0 = Service available, 1 = Masked 1
    INT_SPI1 [29] 0 = Service available, 1 = Masked 1
    INT_UART0 [28] 0 = Service available, 1 = Masked 1
    INT_IIC [27] 0 = Service available, 1 = Masked 1
    INT_USBH [26] 0 = Service available, 1 = Masked 1
    INT_USBD [25] 0 = Service available, 1 = Masked 1
    INT_NFCON [24] 0 = Service available, 1 = Masked 1
    INT_UART1 [23] 0 = Service available, 1 = Masked 1
    INT_SPI0 [22] 0 = Service available, 1 = Masked 1
    INT_SDI [21] 0 = Service available, 1 = Masked 1
    INT_DMA3 [20] 0 = Service available, 1 = Masked 1
    INT_DMA2 [19] 0 = Service available, 1 = Masked 1
    INT_DMA1 [18] 0 = Service available, 1 = Masked 1
    INT_DMA0 [17] 0 = Service available, 1 = Masked 1
    INT_LCD [16] 0 = Service available, 1 = Masked 1
    INT_UART2 [15] 0 = Service available, 1 = Masked 1
    INT_TIMER4 [14] 0 = Service available, 1 = Masked 1
    INT_TIMER3 [13] 0 = Service available, 1 = Masked 1
    INT_TIMER2 [12] 0 = Service available, 1 = Masked 1
    INT_TIMER1 [11] 0 = Service available, 1 = Masked 1
    INT_TIMER0 [10] 0 = Service available, 1 = Masked 1
    INT_WDT_AC97 [9] 0 = Service available, 1 = Masked 1
    INT_TICK [8] 0 = Service available, 1 = Masked 1
    nBATT_FLT [7] 0 = Service available, 1 = Masked 1
    INT_CAM [6] 0 = Service available, 1 = Masked 1
    EINT8_23 [5] 0 = Service available, 1 = Masked 1
    EINT4_7 [4] 0 = Service available, 1 = Masked 1
    EINT3 [3] 0 = Service available, 1 = Masked 1
    EINT2 [2] 0 = Service available, 1 = Masked 1
    EINT1 [1] 0 = Service available, 1 = Masked 1
    EINT0 [0] 0 = Service available, 1 = Masked 1

    我们发现INTMSK的第5,6位对应了EINT4_7, EINT8_23,20个外部中断,也就是所,这20个GPIO引脚只能触发这两个中断。
    但是当中断到来时,我们如果判断是由哪一个GPIO引脚触发的呢?这个时候我们可以通过查询EINTMASK来判断中断源。
    EINTMASK Bit Description
    EINT23 [23] 0 = enable interrupt 1= masked
    EINT22 [22] 0 = enable interrupt 1= masked
    EINT21 [21] 0 = enable interrupt 1= masked
    EINT20 [20] 0 = enable interrupt 1= masked
    EINT19 [19] 0 = enable interrupt 1= masked
    EINT18 [18] 0 = enable interrupt 1= masked
    EINT17 [17] 0 = enable interrupt 1= masked
    EINT16 [16] 0 = enable interrupt 1= masked
    EINT15 [15] 0 = enable interrupt 1= masked
    EINT14 [14] 0 = enable interrupt 1= masked
    EINT13 [13] 0 = enable interrupt 1= masked
    EINT12 [12] 0 = enable interrupt 1= masked
    EINT11 [11] 0 = enable interrupt 1= masked
    EINT10 [10] 0 = enable interrupt 1= masked
    EINT9 [9] 0 = enable interrupt 1= masked
    EINT8 [8] 0 = enable interrupt 1= masked
    EINT7 [7] 0 = enable interrupt 1= masked
    EINT6 [6] 0 = enable interrupt 1= masked
    EINT5 [5] 0 = enable interrupt 1= masked
    EINT4 [4] 0 = enable interrupt 1= masked
    Reserved [3:0] Reserved
    但是还有一个疑问,不是说60个中断源吗?除去24个外部中断源应该还有60-24 -(32-6)=10个内部中断源啊。他们在哪呢?

    其实这里涉及到了子中断源的概念。
    Sub Sources Descriptions Source
    INT_AC97 AC97 interrupt             INT_WDT_AC97
    INT_WDT Watchdoc interrupt       INT_WDT_AC97
    INT_CAM_P P-port capture interrupt in camera interface        INT_CAM
    INT_CAM_C C-port capture interrupt in camera interface       INT_CAM
    INT_ADC_S ADC interrupt                                                      INT_ADC
    INT_TC Touch screen interrupt (pen up/down)                    INT_ADC
    INT_ERR2 UART2 error interrupt                                        INT_UART2
    INT_TXD2 UART2 transmit interrupt                        INT_UART2
    INT_RXD2 UART2 receive interrupt                          INT_UART2
    INT_ERR1 UART1 error interrupt                              INT_UART1
    INT_TXD1 UART1 transmit interrupt I                        NT_UART1
    INT_RXD1 UART1 receive interrupt                           INT_UART1
    INT_ERR0 UART0 error interrupt  
    展开全文
  • ARM中断源之定时器中断

    千次阅读 2018-02-02 14:14:07
     实时时钟请求中断。在控制中遇到定时检测和...走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把
    

    实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。


    走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。

     

    在当前的80x86体系结构上,内核显式地与几种时钟和定时器电路打交道,其主要分为了时钟和定时器两大类:

    - 时钟电路同时用于跟踪当前时间和产生精确的时间度量。
    - 定时器电路由内核编程,所以它们以固定的、预先定义的频率发出中断。

     

    1、实时时钟(RTC)

     

    所有的PC都包含一个叫实时时钟(Renl Time Clock RTC)的时钟,它是独立于CPU和所有其他芯片的。即使当PC被切断电源,RTC还继续工作,因为它靠一个小电池或蓄电池供电。CMOS RAM和RTC被集成在一个芯片上。

     

    RTC能在IRQ8上发出周期性的中断,频率在2~8192 Hz之间。我们可以对RTC进行编程以使当RTC到达某个特定的值时激活IRQ8线,也就是作为一个闹钟来工作。

     

    Linux只用RTC来获取时间和日期,不过,通过对/dev/rtc设备文件进行操作,也允许透程对RTC编程。内核通过0x70和Ox71 I/O端口访问RTC。系统管理员通过执行Unix系统时钟程序(直接作用于这两个I/O端口)可以设置时钟。MC146818 RTC芯片(或其他兼容芯片,如DS12887)可以在IRQ8上产生周期性的中断,中断的频率在2HZ~8192HZ之间。与MC146818 RTC对应的设备驱动程序实现在include/linux/rtc.h和drivers/char/rtc.c文件中,对应的设备文件是/dev/rtc(major=10,minor=135,只读字符设备)。因此用户进程可以通过对她进行编程以使得当RTC到达某个特定的时间值时激活IRQ8线,从而将RTC当作一个闹钟来用。

    而Linux内核对RTC的唯一用途就是把RTC用作“离线”或“后台”的时间与日期维护器。当Linux内核启动时,它从RTC中读取时间与日期的基准值。然后再运行期间内核就完全抛开RTC,从而以软件的形式维护系统的当前时间与日期,并在需要时将时间回写到RTC芯片中。所以,RTC时钟只是个为后面我们介绍的那些时钟起一个初始化的作用,仅此而已!

    Linux在include/linux/mc146818rtc.h和include/asm-i386/mc146818rtc.h头文件中分别定义了mc146818 RTC芯片各寄存器的含义以及RTC芯片在i386平台上的I/O端口操作。而通用的RTC接口则声明在include/linux/rtc.h头文件中。

     

    2、时间戳计数器(TSC)

     

    时间戳计数器与实时时钟配合使用,用来将时钟和定时器调整得更精确。所有的80x86微处理器都包含一条CLK输入引线,它接收外部振荡器的时钟信号。从Pentium开始,80x86微处理器就都包含一个计数器,它在每次外部振荡器的时钟信号到来时加1。该计数器是利用64位的时间戳计数器(Time Stamp Counter TSC)寄存器来实现的,可以通过汇编语言指令rdtsc读这个寄存器

     

    为什么要出现一个时间戳计数器呢?Linux利用这个寄存器可获得更精确的时间量,以便计算进程用户态与内核态的运行时间及等待(睡眠)时间。为了做到这点,Linux在初始化系统的时候必须确定时钟信号的频率。事实上,因为编译内核时并不声明这个频率,所以同一内核映像可以运行在产生任何时钟频率的CPU上,即这个频率由CPU决定。

     

    算出CPU实际频率的任务是在系统初始化期间完成的。calibrate_tsc()函数通过计算一个大约在5ms的时间间隔内所产生的时钟信号的个数来算出CPU实际频率。通过适当地设置可编程间隔定时器(PIT)的一个通道来产生这个时间常量。

     

    3、可编程间隔定时器(PIT),重点!

     

    可编程间隔定时器(Programmable Interval Timer PIT)的作用类似于微波炉的闹钟,即让用户意识到烹调的时间间隔已经过了。所不同的是,这个设备不是通过振铃,而是发出一个特殊的中断,叫做时钟中断(timer interrupt)来通知内核又一个时间间隔过去了。每个IBM兼容PC都至少包含一个PIT,PIT通常是使用0x40~0x43 I/O端口的一个8254 CMOS芯片,该芯片作为I/O设备与中断控制器的IRQ0相连,向量号为32。

     

    Linux给PC的PIT进行编程,使它以1000 Hz的频率向IRQ0发出时钟中断,即每1ms产生一次时钟中断。这个时间间隔叫做一个节拍(tick),它的长度以纳秒为单位存放在tick_nsec变量中。在PC上,tick_nsec被初始化为999848ns(产生的时钟信号频率大约为1000.15 Hz),但是如果计算机被外部时钟同步的话,它的值可能被内核自动调整。

     

    时钟中断的频率可以通过编译内核前对一些参数的设定来满足于具体硬件体系结构的要求。较慢的机器,其节拍大约为lOms(每秒产生100次时钟中断),而较快的机器的节拍为大约1ms(每秒产生1000或1024次时钟中断)。

     

    在Linux的代码中,有几个宏产生决定时钟中断频率的常量,对此讨论如下:

    - HZ产生每秒时钟中断的近似个数,也就是时钟中断的频率。在IBM PC上,这个值设置为1000。
    - CLOCK_TICK_RATE产生的值为1193182,这个值是8254芯片的内部振荡器频率。
    - LATCH产生CLOCK_TICK_RATE和HZ的比值再四舍五入后的整数值。这个值用来对PIT编程。

     

    PIT由setup_pit_timer()进行如下初始化:
        spin_lock_irqsave(&i8253_lock, flags);
        outb_p(0x34,0x43);
        udelay(10);
        outb_p(LATCH & 0xff, 0x40);
        udelay(10);
        outb(LATCH >> 8, 0x40);
        spin_unlock_irqrestore(&i8253_lock, flags);

     

    outb()C函数等价于outb汇编语言指令:它把第一个操作数拷贝到由第二个操作数指定的I/O端口。outb_p()函数类似于outb(),不过,它会通过一个空操作而产生一个暂停,以避免硬件难以分辨。udelay()宏函数引入了一个更短的延迟。

     

    第一条outb_p()语句让PIT以新的频率产生中断。接下来的两条outb_p()和outb()语句为设备提供新的中断频率。把16位LATCH常量作为两个连续的字节发送到设备的8位I/O端口0x40。结果,PIT将以(大约)1000Hz的频率产生时钟中断,也就是说,每1ms产生一次时钟中断。

     

    4、其他定时器

     

    除了PIT,80x86体系还有其他几个定时器,这里只简单提一提:
    - CPU本地定时器:CPU本地定时器是一种能够产生单步中断或周期性中断的设备,向量范围是239 (0xef),比PIT更灵活地编程。
    - 高精度事件定时器(HPET):可以通过映射到内存空间的寄存器来对HPET芯片编程的定时器。
    - ACPI电源管理定时器:时钟信号拥有大约为3.58 MHz的固定频率,专门针对ACPI电源的定时器。

     

    本博文,我们重点讨论第三项,即可编程间隔定时器,它是整个Linux内核的心脏,驱动着若干进程的运行。PS,这里只讨论单CPU的计时体系。

    展开全文
  • ARM的中断

    2017-03-13 22:12:12
    Exynos4412采用GIC中断控制器,主要是因为Contex-A9 是多核处理器,GIC(Generic ...1)分配器:设置一个开关,是否接收外部中断源;为该中断源选择CPU接口; 2)CPU接口:设置一个开发,是否接受该中断源请求;

    Exynos4412采用GIC中断控制器,主要是因为Contex-A9 是多核处理器,GIC(Generic Interrupt Controller)通用中断控制器用来选择使用哪个CPU接口,具体主要有两个功能:
    1)分配器:设置一个开关,是否接收外部中断源;为该中断源选择CPU接口;
    2)CPU接口:设置一个开发,是否接受该中断源请求;
    Exynos4412中断控制器包括160(0~159)个中断控制源,这些中断源来自软中断(SGI),私有外部中断(PPI),公共外部中断(SPI)。
    信号流图和模块控制寄存器图:
    这里写图片描述
    图中相关的寄存器:
    node:
    1. xxxxn代表该寄存器由多个内存组成并非一个32为寄存器。
    2. CPUn代表该寄存器控制的是对应的CPUn,而非所有CPU公有.

    ● GIC中断控制器(常用寄存器的的解释):
    ● 1.ICCICR_CPUn:全局允许通过CPU接口发送中断信号给处理器(每个CPU接口都需要被使能)
    ● 2.ICCPMR_CPUn:设置对应CPU优先级屏蔽门限,该寄存器提供中断优先级过滤器。 只有具有比该寄存器中的值高的优先级的中断才能被发送到处理器(每个CPU接口都拥有一个中断门限寄存器)
    ● 3.ICCIARn_CPUn:低10位为只读位,通过此位可以获取对应CPU当前发生中断的中断号
    ● 4.ICCEOIRn_CPUn:低10位为只写位,将处理完的中断ID填写上去通知对应CPU中断已经处理完毕,方可允许下一个中断进入CPU。
    ● 5.ICDISERn_CPUn(小开关):ICDISER为GIC支持的每个中断提供一个置位使能位。 将“1”写入置1使能位允许将相应的中断转发到CPU接口。 读取一个位标识中断是否使能。 这些寄存器在GIC的所有配置中都可用。(ID号是从0-159开始的)(每个CPU都有一组使能寄存器)
    ● 6.ICDDCR:全局使能监视外设中断信号并转发待处理中断到CPU接口。
    ● 7.ICDICPRn_CPUn:清GIC上中断标志位(发生中断之后不会被清零需要手动清零),置一清中断
    ● 8.ICDIPTRn_CPUn:(中断分发):哪一位被置一就代表某个中断源可以被分发给该CPU
    编码步骤:
    初始化:即初始化图1寄存器
    中断服务程序:通过对应寄存器获取中断号,进入服务程序是将外设控制器和GIC的PEND位清标志位(大多数都是将寄存器中对应位写一),服务程序返回前将ICCEOIRn_CPUn对应位置位。

    示例代码(exynos 4412开发板 参照exynos 4412用户手册):

    key_int.h:

    #ifndef __KEY_INT_H_
    #define __KEY_INT_H_
    #include "exynos_4412.h"
    
    extern void key_int_init(void (*key2handle)(void),void (*key3handle)(void));
    
    #endif //!__KEY_H_

    key_int.c:

    #include"ket_int.h"
    static void (*key2_fun)(void) = 0;
    static void (*key3_fun)(void) = 0;
    
    static void delay(int time)
    {
        int i;
        for (;time>0;time--)
            for (i = 0; i < 1000; i++)
        ;
    }
    
    static void key2_function()
    {
        delay(300);
        if(!(GPX1.DAT & (1<<1)))
            return ;
        //需要执行的程序
        if(0 == key2_fun)
            return ;
        else
            key2_fun();
    }
    
    static void key3_function()
    {
        delay(300);
        if(!(GPX1.DAT & (1<<2)))
            return ;
        //需要执行的程序
        if(0 == key3_fun)
            return ;
        else
            key3_fun();
    }
    
    void do_irq()
    {
        unsigned int int_ID =0;
        switch(int_ID = CPU0.ICCIAR & 0b1111111111)
        {
        case 57:
            /*通知外部控制器和GIC控制器中断已经被捕捉可以开始接受下一个中断发生*/
            EXT_INT41_PEND = 1<<1;
            ICDICPR.ICDICPR1 = 1<<25;
            key2_function();
            break;
    
        case 58:
            /*通知外部控制器和GIC控制器中断已经被捕捉可以开始接受下一个中断发生*/
            EXT_INT41_PEND = 1<<2;
            ICDICPR.ICDICPR1 = 1<<26;
            key3_function();
            break;
    
        default:
            break;
        }
        /*当前中断已经处理完毕*/
        CPU0.ICCEOIR = (CPU0.ICCEOIR & (~0b1111111111)) | int_ID;
    }
    
    
    /*function name:key_int_init
     *function:initialize GIC controller and Interrupt handle of key1 and key2
     *argument:Interrupt handle of key1 and key2
     * */
    
    void key_int_init(void (*key2handle)(void),void (*key3handle)(void))
    {
    //第一部分:设置中断源
        GPX1.CON |= 0xf << 4;
        GPX1.CON |= 0xf << 8;
    
        EXT_INT41_CON = ((EXT_INT41_CON) & (~(0b111<<4))) | (0x3<<4);  //EXINT_41_CON [6:4] = 0x2;
        EXT_INT41_CON = ((EXT_INT41_CON) & (~(0b111<<8))) | (0x3<<8);
    
        EXT_INT41_MASK &= ~(1<<1); //使中断源能向GIC传递
        EXT_INT41_MASK &= ~(1<<2);
    
    //第二部分:设置中断控制器
        ICDISER.ICDISER1 |= 1<<25;  //是能中断源进入GIC
        ICDISER.ICDISER1 |= 1<<26;
    
        ICDIPTR.ICDIPTR14 |= ((ICDIPTR.ICDIPTR14) & (~(0xff<<8))) | (0x01<<8); //对中断源进行CPU的分发
        ICDIPTR.ICDIPTR14 |= ((ICDIPTR.ICDIPTR14) & (~(0xff<<16))) | (0x01<<16);
    
        ICDDCR |= 1;//使能全局分发监控
    
        CPU0.ICCICR |= 1;//CPU0接口使能
    
        CPU0.ICCPMR |= 0xff;//CPU0的优先级门槛
    //第三部分:设置两个中断函数的句柄
        key2_fun = key2handle;
        key3_fun = key3handle;
    }
    展开全文
  • 前面的文章介绍了Linux的中断处理机制,而...ARM的中断控制器被称为GIC(Generic Interrupt Controller),最开始的v1版本最多支持8个PE和1020个中断源(interrupt source),用于ARM Cortex-A5,A9等。这里PE代表Proc...
  • 首先能识别触发的中断(对应中断源必须打开,然后查询当前中断状态寄存器),硬件会操控PC跳到中断向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中断类型就会进入),在中断跳转函数里面保存现场(保存R0等等工作寄存器)--...
  • 中断源的状态GIC对一个中断源的处理过程包含Inactive, Pending, Active和Active and Pending四种状态。中断源没有被assert(触发)时候,处于初始"Inactive"状态。如果某个中断源被触发,GIC会将IAR寄存器...
  • ARM的中断处理 [一]中断源的状态GIC对一个中断源的处理过程包含Inactive, Pending, Active和Active and Pending四种状态。中断源没有被assert(触发)的时候,处于初始的"Inactive"状态。如果某个中断源被触发,GIC会...
  • 针对这种情况,为了节省紧张的系统资源,本文提出的实现高效多串口中断源方案,可以利用单一的中断源来管理多个扩展串口,并保证多个串口中断的无漏检测与服务。  总体设计  方案的基本组成如图1所示。RS-232...
  • 前面的文章介绍了Linux的中断处理机制,而...ARM的中断控制器被称为GIC(Generic Interrupt Controller),最开始的v1版本最多支持8个PE和1020个中断源(interrupt source),用于ARM Cortex-A5,A9等。这里PE代表Proc...
  • ARM的中断处理 [一]中断源的状态GIC对一个中断源的处理过程包含Inactive, Pending, Active和Active and Pending四种状态。中断源没有被assert(触发)的时候,处于初始的"Inactive"状态。如果某个中断源被触发,GIC会...
  • 关于 arm的中断系统

    千次阅读 2011-04-11 19:30:00
    原来一直不明白这样一件事,想arm系统的外部中断源只有irq一种,那么它怎么识别很多个中断源那。... 在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。 先不说中断控制器,只说ARM核心。
  • 编辑工程文件,包括自己编写汇编和 C 语言程序,还有工程编译时需要编写链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时程序运行入口启动程序文件。 对后四种文件理解...
  • 1. 子内部中断源的产生以UART0接收数据产生INT_RXD0中断为例,INT_RXD0产生后进入SUBSRCPND子中断源暂存寄存器,设置INT_RXD0对应的中断位,中断信号经过INTSUBMSK子中断屏蔽寄存器,如果INT_RXD0信号对应位没有被...
  • ARM的中断(S3C2440)

    2018-10-01 14:05:26
    中断源 中断控制器 CPU使能中断 中断控制器作用: 汇集各类中断信号并发给CPU。 中断处理过程: 1.中断控制器汇集各类中断信号并发给CPU。 2.CPU保存当前程序运行环境(各个寄存器),调用中断服务程序...
  • 硬件原因引起的中断过程中是不可测的,随机的,软件中断是可以人为控制的断点:一个地址,程序在该处中断,转而取执行中断程序的地址。中断源:引起中断的信号源。异常优先级的概念同时出现两个中断源,就会出现先...
  • 以s3c2440 ARM9核为例:一:s3c2440 ARM处理器特性:1、S3C2440支持60个中断源,含子中断源;2、ARM9采用五级流水线方式;3、支持外部中断和内部中断;二、s3c2440 支持寄存器:2.1 外部中断寄存器24个外部中断占用...
  • 基于ARM2103编写C语言代码,使用外部中断达到流水灯效果。
  • 当把ARM C 初始化汇编代码中所有中断源(包括扩展内外部中断源向量都指向了新向量表,并统一编号,此后编写任何中断服务程序几乎不需要修改汇编代码,C 初始化代码完全可以对C 程序员隐藏起来,并可以像在...
  •  ·中断模式寄存器可以设置2个中断源为IRQ或FIQ方式。  ·中断挂起寄存器,当有中断请求产生时,相应位会被硬件置1,处于挂起状态。当进入中断处理程序时,必须通过软件清除这个标志位,以标志响应中断请求。 ...
  • 本文介绍一种ARM7内核的中断屏蔽方法,并给出基于该方法的C语言代码和汇编语言代码。该段代码已经在笔者参与研制的火灾报警控制器中得到成功应用,可以完全替代x86体系下DOS.H中定义的库函数enable()和disable...
  • ARM的中断

    2015-05-18 20:40:00
    ARM中,事件发生将会触发中断,然而,...其中,中断分为Supports three interrupt types:Private Peripheral Interrupt (PPI)一个中断源对应一个CPUSoftware Generated Interrupt (SGI) CPU对应CPUShared Pe...
  • 上班之余抽点时间出来写写博文,希望对新接触朋友有...详细属于哪类中断模式是对中断源相应寄存器进程配置决定。 *中断源有60个,子中断源有15个。 *什么是子中断? 例1:处置器A线只有4根时,只...
  • 本文感谢郑星 朋友2440支持IRQ(普通中断)和FIQ...没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIQ中断异常;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀!没办法还需要查...
  • 本文介绍一种arm7内核的中断屏蔽方法,并给出基于该方法的C语言代码和汇编语言代码。该段代码已经在笔者参与研制的火灾报警控制器中得到成功应用,可以完全替代x86体系下DOS.H中定义的库函数enable()和disable...
  • ARM920T中断体系结构

    2014-12-15 21:00:32
    (3)进入中断处理函数后首先要分辨中断源,然后进行对应的中断处理 (4)中断处理完,清除中断 (5)返回现场 中断程序的设置流程: (1)建立中断向量表 (2)初始化中断:打开开关、设置优先级
  • ARM9的中断控制器

    2016-12-06 14:58:01
    1.首先能识别触发的中断(对应中断源必须打开,然后查询当前中断状态寄存器),硬件会操控PC跳到中断向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中断类型就会进入),在中断跳转函数里面保存现场(保存R0等等工作...
  • ARM-异常及中断处理中断中断中断源中断/异常优先级异常和中断区别ARM-7种异常类型ARM-异常中断响应流程软中断 汇编测试代码 中断 中断 1) 硬中断 在处理器中,中断是一个过程。即CPU在正常执行程序过程中,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 545
精华内容 218
关键字:

arm的中断源