精华内容
下载资源
问答
  • 单片机的中断系统 多级中断控制实例

    1.前言

    记录对51单片机中断、定时/计数器的重要知识点以及难点理解,并且举例中断在实际编程中的应用,从而加深对单片机中断、定时/计数器的理解,熟练的使用中断。

    2.什么是中断

    中断就是计算机在执行某一程序的过程中,由计算机系统内部或外部的某种原因而必须终止当前程序的运行先去执行相应的处理程序,然后再返回继续执行原程序

    3.什么是中断系统

    实现中断功能的软、硬件系统统称为中断系统。

    4.中断的流程

    在这里插入图片描述
    即:中断请求中断响应中断处理中断返回

    5.中断的优先级控制

    通常情况下,一个程序中可能会有多个中断,优先级越高的中断优先执行。如果在一个中断的服务过程中,有一个优先级更高的中断插入,则当前中断暂停,前往执行优先级更高的中断。当优先级高的中断执行完毕后再返回继续执行低优先级的中断。

    6.中断源

    MCS-51共有五个中断源

    1. 外部中断INT0INT1
    2. 定时/计数器T0T1的溢出中断
    3. 串行口的发送和接受中断(只占用一个中断源)
    中断源功能
    INT0外部中断0请求,由INT0引脚(P3.2)输入。低电平/负跳变有效,中断请求标志为IE0
    INT1外部中断1请求,由INT1引脚(P3.3)输入。低电平/负跳变有效,中断请求标志为IE1
    T0定时/计数器0溢出中断请求,中断标志位为TF0
    T1定时/计数器1溢出中断请求,中断标志位为TF1
    RXD/TXD串行口中断请求,中断请求标志位TIRI

    外部中断

    从单片机外部引脚INT0INT1输入中断请求信号的中断。
    外部中断的触发方式有两种电平触发IT0 =0跳变触发(边沿)IT0 = 1,可以通过定时/计数器控制寄存器TCON编程选择。

    7.与中断有关的特殊功能寄存器

    与中断有关的特殊功能寄存器一共有4个。

    1. 定时/计数器控制寄存器(TCON)、
    2. 串行口控制寄存器(SCON)、
    3. 中断允许控制寄存器(IE)、
    4. 中断优先级控制寄存器(IP)

    7.1.定时/计数器控制寄存器 TCON

    作用

    1. 控制定时/计数器T0T1的溢出中断
    2. 控制外部中断的触发方式.由IT0IT1控制
    3. 锁存外部中断请求标志位
    位地址位定义功能
    88HIT0选择外部中断0的中断触发方式。由软件控制。IT0=0为电平触发方式IT0=1为下降沿触发方式
    89HIE0选择外部中断1的中断触发方式。功能与IT0相似
    8AH

    7.2.串行口控制寄存器 SCON

    串行口的接收发送数据中断请求标志位(RITI)

    位定义功能
    TI串行口发送中断请求标志位。CPU每发送一帧数据,硬件置位1(TI=1),但是中断被响应时,需要在中断服务程序中通过软件对TI清零
    RI串行口接受中断请求标志位。每接收一帧数据,硬件置位1(TI=1),但是中断被响应时,一样需要在中断服务程序中通过软件对TI清零

    串行口中断不能由硬件自动清除中断请求标志位,需要用户通过软件进行控制清零。

    7.3.中断允许控制寄存器 IE

    IE是控制中断的开关,通过对IE的清0和置1操作来控制中断的屏蔽和开放。

    中断允许控制寄存器IE对中断的开放与屏蔽实现两级控制,存在一个总的中断控制位EA

    位定义功能
    EA总中断允许控制位。当EA=0时,不允许任何中断请求。
    ES串行口中断控制位。当ES=0时,不允许串行口中断;当EA=1ES=1时,允许串行口中断。
    ET1定时/计数器1中断允许控制位。当ET1=0时,屏蔽T1的溢出中断;当EA=1且ET1=1时,允许T1溢出中断
    ET0定时/计数器0中断允许控制位。功能与ET1相同。
    EX1外部中断1的中断允许控制位。当EX1=0时,屏蔽外部中断1的中断请求;当EA=1EX1=1时,允许外部中断1的中断请求
    EX0外部中断0的中断允许控制位。功能与EX1相同

    若某个中断源被允许,出来IE对应位置1外,还需要总中断控制位EA置1。

    实例:若允许片内两个定时/计数器中断,禁止其他中断源的中断请求,尝试编写出设置IE的响应指令

    #include <reg51.h>
    
    EX0 = 0; // 禁止外部中断0
    EX1 = 0; // 禁止外部中断1
    ES = 0;  // 禁止串行口中断
    ET0 = 1; // 允许定时/计数器0中断
    ET1 = 1; // 允许定时/计数器1中断
    EA = 1;  // 总中断控制器打开
    

    7.4.中断优先级控制寄存器 IP

    位定义功能
    PS串行口中断优先级控制位。PS=1,串行口中断为高优先级;PS=0,为低优先级。
    PT1定时/计数器1中断优先级控制位。当PT1=0时,T1溢出中断为低优先级;当PT1=1时,T1溢出中断为高优先级。
    PT0定时/计数器0中断优先级控制位。当PT0=0时,T0溢出中断为低优先级;当PT0=1时,T0溢出中断为高优先级。
    PX1外部中断1的中断优先级控制位。当PX1=0时,外部中断1为低优先级;当PX1=1时,外部中断1为高优先级。
    PX0外部中断0的中断优先级控制位。当PX0=0时,外部中断0为低优先级;当PX0=1时,外部中断0为高优先级。

    同级内第二优先级的次序
    外部中断0 > T0溢出中断 > 外部中断1 > T1溢出中断 > 串行口中断

    8.中断系统在实际编程中的应用

    8.1.实例一:中断的初始化

    #include <reg51.h>
    
    void init() // 中断的初始化函数
    {
        EA = 1; // 总中断控制位
        ES = 1; // 串行口中断允许
        EX0 = 1; // 外部中断0允许
        EX1 = 1; // 外部中断1允许
        ET0 = 1; // 定时/计数器0中断允许
        ET1 = 1; // 定时/计数器1中断允许
        IT0 = 1; // 选择外部中断0的触发方式
        IT1 = 1; // 选择外部中断1的触发方式
    }
    

    例1:假设允许外部中断0和1中断,并设定外部中断0为高级中断,外部中断1为低级中断,外部中断0为下降沿触发方式,外部中断1为电平触发方式。试写出该程序的中断初始化程序。

    #include <reg51.h>
    
    void init() // 
    {
        EA = 1; 打开中断控制
        EX0 = 1; 允许外部中断0
        EX1 = 1; 允许外部中断1
        IT0 = 1; 外部中断1采取边沿触发方式
        IT1 = 0; 外部中断0采取电平触发方式
        PX0 = 1; 外部中断0为高优先级
        PX1 = 0; 外部中断1为低优先级
    }
    
    

    8.2.实例二:利用中断控制LED闪烁形式

    要求

    用80C51单片机控制8个LED灯,在外部中断0输入引脚(P3.2)接一个开关K1。要求将外部中断0设置为下降沿触发,程序启动是8个LED以跑马灯的形式交替闪烁。每按一次开关K1,使引脚接地,产生一个下降沿触发的外部中断请求。在中断服务程序中,8个LED高四位和低四位交替闪烁5次,然后中断返回,8个LED继续以跑马灯形式闪烁。

    采用Protues+Keil仿真

    元器件

    • 单片机:80C51 *1
    • 开关按钮:Button *1
    • 电阻:MINRES470K *1
    • LED:LED-BLUE *8

    仿真图

    在这里插入图片描述
    代码

    #include<reg52.h>
    
    unsigned char code table[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0xff};	// 控制P2端口的状态
    
    unsigned char i,j,k,num;
    
    void delay()			 // 延时函数
    {
    	for(i = 0;i<100;i++)
    	{
    		for(j=0;j<200;j++)
    		;
    	}
    }
    
    void init()		   // 中断的初始化
    {
    	EA = 1;	   // 打开总中断控制
    	EX0 = 1;   // 允许外部中断0
    	IT0 = 1;   // 外部中断为下降沿触发方式
    }
    
    
    void main()	   
    {
    	init();
    	while(1)
    	{
    		for(num =0;num<10;num++)
    		{
    			P2 = table[num];
    			delay();
    		}
    	}
    }
    
    void int0() interrupt 0			   // 中断服务程序
    {
    	for(k = 0;k<5;k++){
    		P2 = 0xf0;
    		delay();
    		P2=0x0f;
    		delay();
    	}
    }
    

    8.3.实例三:多级中断控制LED不形式闪烁

    要求:在例2的基础上,在外部中断1输入引脚(P3.3)接一只按钮开关K2。当按下K1时,外部中断0下降沿触发方式触发,进入外部中断0服务程序,上下4个灯交替闪烁;此时按下K2,外部中断1下降沿触发方式触发,进入外部中断1服务程序,8个灯交替闪烁。当外部中断1响应完毕后,返回继续响应外部中断0,直到外部中断0响应完毕,返回执行主程序。
    首先我们分析一波中断初始化函数

    1. 两个外部中断0和1。外部中断0的服务程序为上下4灯交替闪烁,外部中断1的服务程序为8灯闪烁。即EA = 1; EX0 = 1; EX1 = 1;

    2. 优先级:外部中断1 > 外部中断0 即PX1 = 1; PX0 = 0;

    3. 触发方式:都为下降沿触发。即IT0 = 1; IT1 = 1;

    这样我们的中断初始化程序基本完成

    void init()
    {
        EA = 1;
        EX0 = 1; EX1 = 1;
        PX0 = 0; PX1 = 1;
        IT0 = 1; IT1 = 1;
    }
    
    

    其次我们再捯饬一下主程序

    void main()	   
    {
    	init();
    	while(1)
    	{
    		for(num =0;num<10;num++)
    		{
    			P2 = table[num];
    			delay();
    		}
    	}
    }
    
    

    另外我们再搞一下外部中断0的服务程序

    void int0() interrupt 0
    {
    	for(k = 0;k<5;k++)
        {
    		P2 = 0xf0;
    		delay();
    		P2=0x0f;
    		delay();
    	}
    }
    

    最后我们再他喵的弄一下外部中断1的服务程序

    
    void int1() interrupt 2			  // 外部中断1服务程序
    {
    	for(l = 0;l < 5; l++)
    	{
    		P2 = 0x00;
    		delay();
    		P2 = 0xff;
    		delay();
    	}
    }
    

    完整代码

    #include<reg52.h>
    
    unsigned char code table[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0x00, 0xff};	// 控制P2端口的状态
    
    unsigned char i, j, k, l, num;
    
    void delay()			 // 延时函数
    {
    	for(i = 0; i < 200; i++)
    	{
    		for(j = 0; j < 200; j++)
    		;
    	}
    }
    
    void init()		   // 中断的初始化
    {
    	EA = 1;
        EX0 = 1; EX1 = 1;
        PX0 = 0; PX1 = 1;
        IT0 = 1; IT1 = 1;
    }
    
    void main()	   
    {
    	init();
    	while(1)
    	{
    		for(num = 0; num < 10; num++)
    		{
    			P2 = table[num];
    			delay();
    		}
    	}
    }
    
    void int0() interrupt 0			   // 外部中断0中断服务程序
    {
    	EX0 = 0;
    	for(k = 0; k < 5; k++)
    	{
    		P2 = 0xf0;
    		delay();
    		P2 = 0x0f;
    		delay();
    		EX0 = 1;
    	}
    }
    
    void int1() interrupt 2			  // 外部中断1服务程序
    {
    	for(l = 0;l < 5; l++)
    	{
    		P2 = 0x00;
    		delay();
    		P2 = 0xff;
    		delay();
    	}
    }
    

    仿真图

    在这里插入图片描述
    文章来源:中断系统

    展开全文
  • Linux 中断 —— ARM GIC 中断控制

    千次阅读 2019-05-23 00:14:54
    GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)...

    GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动。

    具体GIC硬件的实现形态有两种,一种是在ARM vensor研发自己的SOC的时候,会向ARM公司购买GIC的IP,这些IP包括的型号有:PL390,GIC-400,GIC-500。其中GIC-500最多支持128个 cpu core,它要求ARM core必须是ARMV8指令集的(例如Cortex-A57),符合GIC architecture specification version 3。另外一种形态是ARM vensor直接购买ARM公司的Cortex A9或者A15的IP,Cortex A9或者A15中会包括了GIC的实现,当然,这些实现也是符合GIC V2的规格。

     

    1. ARM中断控制器

    1.1 ARM支持中断类型ARM GIC-v2支持三种类型的中断:

    SGI:软件触发中断(Software Generated Interrupt),通常用于多核间通讯,最多支持16个SGI中断,硬件中断号从ID0~ID15。SGI通常在Linux内核中被用作 IPI 中断(inter-processor interrupts),并会送达到系统指定的CPU上

    PPI:私有外设中断(Private Peripheral Interrupt),是每个CPU私有的中断。最多支持16个PPI中断,硬件中断号从ID16~ID31。PPI通常会送达到指定的CPU上,应用场景有CPU本地时钟

    SPI:公用外设中断(Shared Peripheral Interrupt),最多可以支持988个外设中断,硬件中断号从ID32~ID1019。

     

    1.2 GIC检测中断流程

    GIC主要由两部分组成,分别是仲裁单元(Distributor)CPU接口(Interface)模块

    从图中可以看出, GIC 可以清晰的划分成两个部分:仲裁( Distributor )和 CPU 接口(CPU Interface)。CPU interface有两种,一种就是和普通processor接口,另外一种是和虚拟机接口的。Virtual CPU interface在本文中不会详细描述。分发器其实应该叫汇聚器,在 IC 的后端设计中, layout 会把各个模块引过来的中断线(就是上面说的三种中断)混接到 GIC 上,然后把混聚合的中断接到 CPU 的 IRQ 和 FIQ 线上,这样 CPU 就有触觉了。

    其中 Distribute 只有一套,故基地址也只有一个,而 Interface 有多套,因为每个 CPU 都对应一套 interface 。

    其中各个子中断使能,设置触发方式,优先级排序,分发到哪个 CPU 上这些功能由 Distribute 负责,总的中断的使能,状态的维护由 Interface 负责。

     

    Distributor

    Distributor的主要的作用是检测各个interrupt source的状态,控制各个interrupt source的行为,分发各个interrupt source产生的中断事件分发到指定的一个或者多个CPU interface上。虽然Distributor可以管理多个interrupt source,但是它总是把优先级最高的那个interrupt请求送往CPU interface。Distributor对中断的控制包括:

    (1)中断enable或者disable的控制。Distributor对中断的控制分成两个级别。一个是全局中断的控制(GIC_DIST_CTRL)。一旦disable了全局的中断,那么任何的interrupt source产生的interrupt event都不会被传递到CPU interface。另外一个级别是对针对各个interrupt source进行控制(GIC_DIST_ENABLE_CLEAR),disable某一个interrupt source会导致该interrupt event不会分发到CPU interface,但不影响其他interrupt source产生interrupt event的分发。

    (2)控制将当前优先级最高的中断事件分发到一个或者一组CPU interface。当一个中断事件分发到多个CPU interface的时候,GIC的内部逻辑应该保证只assert 一个CPU。

    (3)优先级控制。

    (4)interrupt属性设定。例如是level-sensitive还是edge-triggered

    (5)interrupt group的设定

    Distributor可以管理若干个interrupt source,这些interrupt source用ID来标识,我们称之interrupt ID。

     

    CPU interface

    CPU interface这个block主要用于和process进行接口。该block的主要功能包括:

    (a)enable或者disable CPU interface向连接的CPU assert中断事件。对于ARM,CPU interface block和CPU之间的中断信号线是nIRQCPU和nFIQCPU。如果disable了中断,那么即便是Distributor分发了一个中断事件到CPU interface,但是也不会assert指定的nIRQ或者nFIQ通知processor。

    (b)ackowledging中断。processor会向CPU interface block应答中断,中断一旦被应答,Distributor就会把该中断的状态从pending状态修改成active。如果没有后续pending的中断,那么CPU interface就会deassert nIRQCPU和nFIQCPU信号线。如果在这个过程中又产生了新的中断,那么Distributor就会把该中断的状态从pending状态修改成pending and active。这时候,CPU interface仍然会保持nIRQ或者nFIQ信号的asserted状态,也就是向processor signal下一个中断。

    (c)中断处理完毕的通知。当interrupt handler处理完了一个中断的时候,会向写CPU interface的寄存器从而通知GIC CPU已经处理完该中断。做这个动作一方面是通知Distributor将中断状态修改为deactive,另外一方面,可以允许其他的pending的interrupt向CPU interface提交。

    (d)设定priority mask。通过priority mask,可以mask掉一些优先级比较低的中断,这些中断不会通知到CPU。

    (e)设定preemption的策略

    (f)在多个中断事件同时到来的时候,选择一个优先级最高的通知processor

     

    GIC仲裁单元:为每一个中断维护一个状态机,分别是:inactive、pending、active and pending、active。

    下面是来自IHI0048B GIC-V2规格书3.2.4 Interrupt handling state machine截图:

    GIC检测中断流程如下:

    (1) 当GIC检测到一个中断发生时,会将该中断标记为pending状态(A1)。

    (2) 对处于pending状态的中断,仲裁单元回确定目标CPU,将中断请求发送到这个CPU上。

    (3) 对于每个CPU,仲裁单元会从众多pending状态的中断中选择一个优先级最高的中断,发送到目标CPU的CPU Interface模块上。

    (4) CPU Interface会决定这个中断是否可以发送给CPU。如果该终端优先级满足要求,GIC会发生一个中断信号给该CPU。

    (5) 当一个CPU进入中断异常后,会去读取GICC_IAR寄存器来响应该中断(一般是Linux内核的中断处理程序来读寄存器)。寄存器会返回硬件中断号(hardware interrupt ID),对于SGI中断来说是返回源CPU的ID。

         当GIC感知到软件读取了该寄存器后,又分为如下情况:

         * 如果该中断源是pending状态,那么转改将变成active。(C   

         * 如果该中断又重新产生,那么pending状态变成active and pending。(D)

         * 如果该中断是active状态,现在变成active and pending。(A2)

    (6) 当处理器完成中断服务,必须发送一个完成信号EOI(End Of Interrupt)给GIC控制器。软件写GICC_EOIR寄存器,状态变成inactive。(E1)

    补充:

    (7) 对于level triggered类型中断来说,当触发电平消失,状态从active and pending变成active。(B2)

    常用路径是A1->D->B2->E1。

     

    1.2.1 GIC中断抢占

    GIC中断控制器支持中断优先级抢占,一个高优先级中断可以抢占一个低优先级且处于active状态的中断,即GIC仲裁单元会记录和比较当前优先级最高的pending状态,然后去抢占当前中断,并且发送这个最高优先级的中断请求给CPU,CPU应答了高优先级中断,暂停低优先级中断服务,进而去处理高优先级中断。

    GIC会将pending状态优先级最高的中断请求发送给CPU。

     

    1.2.2 Linux对中断抢占处理

    从GIC角度看,GIC会发送高优先级中断请求给CPU。

    但是目前CPU处于关中断状态,需要等低优先级中断处理完毕,直到发送EOI给GIC。

    然后CPU才会响应pending状态中优先级最高的中断进行处理。

    所以Linux下:

    1. 高优先级中断无法抢占正在执行的低优先级中断。

    2.同处于pending状态的中断,优先响应高优先级中断进行处理。

     

    1.3 GIC中断时序

    首先给出前提条件:

    • N和M用来标识两个外设中断,N的优先级大于M
    • 两个中断都是SPI类型,level trigger,active-high
    • 两个中断被配置为去同一个CPU
    • 都被配置成 group 0,通过FIQ触发中断

    (1) T1时刻:GIC的总裁单元检测到中断M的电平变化。

    (2) T2时刻:仲裁单元设置中断M的状态为pending。

    (3) T17时刻:CPU Interface模块会拉低nFIQCPU[n]信号。在中断M的状态变成pending后,大概需要15个时钟周期后会拉低nFIQCPU[n]信号来向CPU报告中断请求(assertion)。仲裁单元需要这些时间来计算哪个是pending状态下优先级最高的中断。

    (4) T42时刻:仲裁单元检测到另外一个优先级更高的中断N。

    (5) T43时刻:仲裁单元用中断N替换中断M为当前pending状态下优先级最高的中断,并设置中断N为pending状态。

    (6) T58时刻:经过tph个时钟后,CPU Interface拉低你FIOCPU[n]信号来通知CPU。因为此信号在T17时刻已经被拉低,CPU Interface模块会更新GICC_IAR寄存器的Interrupt ID域,该域的值变成中断N的硬件中断号。

    (7) T61~T131时刻:Linux对中断N的服务程序---------------------中断服务程序处理段,从GICC_IAR开始到GICC_EOIR结束

    •   T61时刻:CPU(Linux中断服务例程)读取GICC_IAR寄存器,即软件响应了中断N。这时仲裁单元把中断N的状态从pending变成active and pending。
    •   T64时刻:在中断N被Linux相应3个时钟内,CPU Interface模块完成对nFIQCPU[n]信号的deasserts,即拉高nFIQCPU[n]信号。
    •   T126时刻:外设也deassert了该中断N。
    •   T128时刻:仲裁单元移出了中断N的pending状态。
    •   T131时刻:Linux服务程序把中断N的硬件ID号写入GICC_EOIR寄存器来完成中断N的全部处理过程。

    (8) T146时刻:在向GICC_EOIR寄存器写入中断N中断号后的tph个时钟后,仲裁单元会选择下一个最高优先级中断,即中断M,发送中断请求给CPU Interface模块。CPU Interface会拉低nFIQCPU[n]信号来向CPU报告外设M的中断请求。

    (9) T211时刻:Linux中断服务程序读取GICC_IAR寄存器来响应中断,仲裁单元设置中断M的状态为active and pending。

    (10) T214时刻:在CPU响应中断后的3个时钟内,CPU Interface模块拉高nFIOCPU[n]信号来完成deassert动作。

     

    1.4 GIC中 寄存器描述

    1.4.1 Distributor

    一种实现是:

    偏移

    名称

    可读写

    复位后

    作用

    0x000

    GICD_CTLR

    RW

    0x00000000[c]

    Distributor Control Register

    写入1使能控制器,必备

    0x004

    GICD_TYPER

    RO

    Configuration-dependent[d]

    Interrupt Controller Type Register

    其中可以查看中断线的总数

    0x008

    GICD_IIDR

    RO

    0x0200143B

    Distributor Implementer Identification Register, GICD_IIDR

    存了一些版本信息

    0x080-0x0BC

    GICD_IGROUPRn

    RW

    0x00000000

    Interrupt Group Registers[e]

    一个位图,控制中断属于A组还是B组

    0x100

    GICD_ISENABLERn

    RW[f]

    SGIs and PPIs:0x0000FFFF

    Interrupt Set-Enable Registers

    一个位图,用于使能各个中断,写入1使能。有用

    0x104-0x13C

    SPIs: 0x00000000

    0x180

    GICD_ICENABLERn

    RW[f]

    0x0000FFFF

    Interrupt Clear-Enable Registers

    和上一个寄存器类似,作用相反,写入1禁止。

    0x184-0x1BC

    0x00000000

    0x200-0x23C

    GICD_ISPENDRn

    RW

    0x00000000

    Interrupt Set-Pending Registers

    pend位图,写入1可以进入pend状态

    0x280-0x2BC

    GICD_ICPENDRn

    RW

    0x00000000

    Interrupt Clear-Pending Registers

    同上,写入1效果相反,阻止pend状态

    0x300-0x33C

    GICD_ISACTIVERn

    RW

    0x00000000

    Interrupt Set-Active Registers

    位图,写入1可以激活中断

    0x380-0x3BC

    GICD_ICACTIVERn

    RW

    0x00000000

    Interrupt Clear-Active Registers

    写入1反激活中断

    0x400-0x5FC

    GICD_IPRIORITYRn

    RW

    0x00000000

    Interrupt Priority Registers

    存着各个中断的优先级,每8位算一个

    0x800-0x81C

    GICD_ITARGETSRn

    RO[h]

    -

    Interrupt Processor Targets Registers[i]

    某个中断应该发往哪个处理器进行处理

    0x820-0x9FC

    RW

    0x00000000

    0xC00

    GICD_ICFGRn

    RO

    SGIs: 0xAAAAAAAA

    Interrupt Configuration Registers, GICD_ICFGRn

    配置中断是低电平触发还是下降沿触发

    0xC04

    RO

    PPIs: 0x55540000

    0xC08-0xC7C

    RW[j]

    SPIs: 0x55555555

    0xD00

    GICD_PPISR

    RO

    0x00000000

    Private Peripheral Interrupt Status Register, GICD_PPISR

    一般没用

    0xD04-0xD3C

    GICD_SPISRn

    RO

    0x00000000

    Shared Peripheral Interrupt Status Registers, GICD_SPISRn

    没用

    0xF00

    GICD_SGIR

    WO

    -

    Software Generated Interrupt Register

    控制软中断

    0xF10-0xF1C

    GICD_CPENDSGIRn

    RW

    0x00000000

    SGI Clear-Pending Registers

    软中断的pend位

    0xF20-0xF2C

    GICD_SPENDSGIRn

    RW

    0x00000000

    SGI Set-Pending Registers

    同上,不过写入1时停止pend

    0xFD0

    GICD_PIDR4

    RO

    0x00000004

    Peripheral ID 4 Register

    0xFD4

    GICD_PIDR5

    RO

    0x00000000

    Peripheral ID 5 Register

    0xFD8

    GICD_PIDR6

    RO

    0x00000000

    Peripheral ID 6 Register

    0xFDC

    GICD_PIDR7

    RO

    0x00000000

    Peripheral ID 7 Register

    0xFE0

    GICD_PIDR0

    RO

    0x00000090

    Peripheral ID 0 Register

    0xFE4

    GICD_PIDR1

    RO

    0x000000B4

    Peripheral ID 1 Register

    0xFE8

    GICD_PIDR2

    RO

    0x0000002B

    Peripheral ID 2 Register

    0xFEC

    GICD_PIDR3

    RO

    0x00000000

    Peripheral ID 3 Register

    0xFF0

    GICD_CIDR0

    RO

    0x0000000D

    Component ID 0 Register

    0xFF4

    GICD_CIDR1

    RO

    0x000000F0

    Component ID 1 Register

    0xFF8

    GICD_CIDR2

    RO

    0x00000005

    Component ID 2 Register

    0xFFC

    GICD_CIDR3

    RO

    0x000000B1

    Component ID 3 Register

     

    1.4.2 CPU Interface

    Offset

    Name

    Type

    Reset

    Description[a]

    0x0000

    GICC_CTLR

    RW

    0x00000000

    CPU Interface Control Register 

    使能位。写入1使能

    0x0004

    GICC_PMR

    RW

    0x00000000

    Interrupt Priority Mask Register

    限制中断最低优先级,高于此值无法中断,最好写大一点

    0x0008

    GICC_BPR

    RW

    0x00000002

    Binary Point Register

    The minimum value of the Binary Point Register depends on which security-banked copy is considered:

    0x2

    Secure copy

    0x3

    Non-secure copy

    优先级分组

    0x000C

    GICC_IAR

    RO

    0x000003FF

    Interrupt Acknowledge Register

    只读,中断id

    0x0010

    GICC_EOIR

    WO

    -

    End of Interrupt Register

    写入以告知cpu已经处理完中断

    0x0014

    GICC_RPR

    RO

    0x000000FF

    Running Priority Register

    当前中断优先级

    0x0018

    GICC_HPPIR

    RO

    0x000003FF

    Highest Priority Pending Interrupt Register

    最高优先级中断号及其pend值

    0x001C

    GICC_ABPR

    RW

    0x00000003

    Aliased Binary Point Register

    The minimum value of the Aliased Binary Point Register is 0x3.

    别名寄存器

    0x0020

    GICC_AIAR

    RO

    0x000003FF

    Aliased Interrupt Acknowledge Register

    别名寄存器

    0x0024

    GICC_AEOIR

    WO

    -

    Aliased End of Interrupt Register

    别名寄存器

    0x0028

    GICC_AHPPIR

    RO

    0x000003FF

    Aliased Highest Priority Pending Interrupt Register

    别名寄存器

    0x00D0

    GICC_APR0

    RW

    0x00000000

    Active Priority Register

    用于保存和恢复

    0x00E0

    GICC_NSAPR0

    RW

    0x00000000

    Non-Secure Active Priority Register

    用于保存和恢复

    0x00FC

    GICC_IIDR

    RO

    0x0202143B

    CPU Interface Identification Register, GICC_IIDR

    存着版本信息

    0x1000

    GICC_DIR

    WO

    -

    Deactivate Interrupt Register

     

    参考文档:

    DDI0471B_gic400_r0p1_trm.pdf

    IHI 0048B, ARM Generic Interrupt Controller Architecture Specification, Ver 2.0.pdf

    http://www.cnblogs.com/arnoldlu/p/8659972.html

    https://www.cnblogs.com/arnoldlu/p/8659981.html

    https://blog.csdn.net/xiafeng1113/article/details/44998179 

    http://www.wowotech.net/linux_kenrel/gic_driver.html

    http://blog.csdn.net/velanjun/article/details/8757862

    https://blog.csdn.net/hcy642813/article/details/73550723

    https://www.cnblogs.com/linanwx/p/5631077.html

     

    展开全文
  • DMA是l/O设备与主存之间由硬件组成的直接数据通路,主要用于高速I/O设备与主存之间的成组数据传送。(外设快、慢了没意义。然后数据多,少了也没多大...外设向cpu发出中断请求,cpu响应中断后进行数据传输。但是如...

    DMA是l/O设备与主存之间由硬件组成的直接数据通路,主要用于高速I/O设备与主存之间的成组数据传送。(外设快、慢了没意义。然后数据多,少了也没多大意义)
    首先讲一下外设跟内存进行数据传输的几种方式:
    1.程序传送。通过无条件或者if等条件语句使cpu主动进行数据传输,但是这种情况下要等待外设准备好,会浪费大量的等待时间。
    2.中断方式。外设向cpu发出中断请求,cpu响应中断后进行数据传输。但是如果传输较多数据的情况下,cpu得一直花费时间在中断上,也会造成cpu利用率低。
    3.dma方式。外设请求传输,dma向cpu发出总线控制请求,cpu把总线控制下发给DMA控制器。DMA利用总线进行数据的快速传输。传输完毕后把总线控制权交还给cpu。有点:快、能传输大量数据而不降低CPU速度。

    DMA方式和中断方式的区别:
    1.DMA方式是硬件方式。中断是软件方式。
    2.优先级:DMA方式比中断方式高。
    3.DMA只占用cpu少部分时间,不浪费cpu资源。但是中断方式全程占有cpu。
    4.中断方式能处理异常事件,但是DMA方式只能够传输数据。

    展开全文
  • 下面的这个视频解释了Linux的中断号与硬件里面中断号之间究竟是什么关系澄清关于Linux中断号的误解。# cat /proc/interrupts CPU0 ...

    下面的这个视频解释了Linux的中断号与硬件里面中断号之间究竟是什么关系澄清关于Linux中断号的误解。

    # cat /proc/interrupts 
               CPU0       CPU1       CPU2       CPU3       
     16:       3092       2942       1436       1997       GIC  29  twd
     17:         10          0          0          0       GIC  34  timer
     31:          4          0          0          0       GIC  47  eth0
     34:        375          0          0          0       GIC  41  mmci-pl18x (cmd)
     35:      22227          0          0          0       GIC  42  mmci-pl18x (pio)
     36:          8          0          0          0       GIC  44  kmi-pl050
     37:         98          0          0          0       GIC  45  kmi-pl050
     38:        108          0          0          0       GIC  37  uart-pl011
     44:          0          0          0          0       GIC  36  rtc-pl031
    IPI0:          0          1          1          1  CPU wakeup interrupts
    IPI1:          0          0          0          0  Timer broadcast interrupts
    IPI2:        653        682        935        364  Rescheduling interrupts
    IPI3:          1          2          2          1  Function call interrupts
    IPI4:          0          0          0          0  Single function call interrupts
    IPI5:          0          0          0          0  CPU stop interrupts
    IPI6:          0          0          0          0  IRQ work interrupts
    IPI7:          0          0          0          0  completion interrupts
    Err:          0
    
    
    

    实验平台为ARM。视频解释上述/proc/interrupts里面的16,17,31,34,35,36,38,44等这些中断号与ARM GIC(Generic Interrupt Controller)里面硬件中断号之间的关系。

    硬件的中断号我们一般称为“hwirq”,通常意味中断控制器里面哪个bit被设置了。Linux会建立Linux的IRQ号与hwirq的映射关系。

    (END)

    Linux阅码场原创精华文章汇总

    更多精彩,尽在"Linux阅码场",扫描下方二维码关注

    别忘了点“在看”鼓励哦~

    展开全文
  • 中断控制

    千次阅读 2018-01-12 20:49:26
    发生异常以后:  1.进入异常模式(切换寄存器)  2.pc(指针)=异常入口 使用中断: 1.硬件相关设置,设置相应的引脚为中断输入 2.中断触发方式 3.中断优先级设置 4.中断源分辨(读状态寄存器) 5.中断使能/失能
  • 关于8259中断控制

    千次阅读 2018-12-28 21:09:33
    可编程中断控制(PIC - Programmable Interrupt Controller)是微机系统中管理设备中断请求的管理者。当PIC向处理器的INT引脚发出一个中断信号时,处理器会立刻停下当时所做的事情并询问PIC需要执行哪个中断服务...
  • ARM GICv3中断控制

    千次阅读 多人点赞 2019-02-17 21:55:45
    GIC,Generic Interrupt Controller。 本文主要介绍GIC v3控制, 基于linux kernel 4.19.0。
  • GIC通用中断控制

    千次阅读 多人点赞 2018-07-24 10:47:07
    1. GIC简介 操作系统中,中断是很重要的组成部分。有了中断系统才可以不用...中断控制可以管理中断的优先级等,而处理器则由寄存器设置用来响应中断。 1.1 GIC结构 作为 ARM 系统中通用中断控制的是 GIC(...
  • 什么是中断源?中断源的分类介绍

    万次阅读 2018-01-31 16:49:23
    什么是中断?  中断就是使CPU暂停运行原来的程序而应更为急迫事件的需要转向去执行为中断源服务的程序(称为中断服务程序),待该程序处理完后,再返回运行原程序。  什么是中断源?  所谓中断源,即引起中断...
  • 重要声明: 以下代码有粘贴 截取他人劳动成果的成分 如有雷同 不胜荣幸 如您不能容忍 请不要独自忍受@weChat:iisssssssssii 联系小民 主动删除  中断含义:  ...引起中断的原因或者说发出中断请求的
  • 可编程中断控制8259A

    万次阅读 多人点赞 2015-12-06 13:11:38
    可编程中断控制8259A是Intel公司专为80x86 CPU控制外部中断而设计开发的芯片。 它将中断源优先级判优、中断源识别和中断屏蔽电路集于一体,不需要附加任何电路就可以对外部中断进行管理,单片可以管理8级外部中断...
  • startup_stm32f10x_hd.s,stm32f10x_exti.h,stm32f10x_exti.c,另外,这里说的外部中断是相对于M3内核之外的,主要是外设中断如:如I/O口相应的外接设备中断,USART、Timer等其它本身固件中断。 对于cortex_m3内核...
  • 中断机制是操作系统中极为重要的一个部分。操作系统在管理输入输出设备时,在处理外部的各种事件时,都需要通过中断机制进行处理。所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。 由于中断机制...
  • 文章目录第八章 中断系统8.1 中断的基本概念8.1.1 中断概念的引入及描述中断方式示意(以输入中断为例)**中断**的定义8.1.2 中断源及中断分类中断的分类8.1.3 中断类型码中断类型码中断向量中断向量表中断向量表的...
  • 从物理学的角度看,中断是一种电信号,由硬件设备生成,并直接送入中断控制的输入引脚上。 然后再由中断控制向处理器发送相应的信号。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。 此后,处理器...
  • 2外部中断+3内部定时器中断/计时器中断+1串口中断 EX0 EX1 外部中断; ET0 ET1 ET2 内部 定时器中断 / 计时器中断; ES 串口中断; 值为1,允许中断;值为0,禁止中断; =====================================...
  • 中断详解

    千次阅读 2018-10-24 01:28:04
    1.中断的基本概念 程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CPU又自动返回到现行程序的断点...
  • CPU中断

    千次阅读 2019-08-31 21:03:36
    0~31:对应于异常和非屏蔽中断,不使用中断控制; 32~47:分配给可屏蔽中断,由I/O设备引起的中断,这其中就包含可由两个8259A级联响应的15个; 48~255:用来标识软中断; CPU中断的机制概论 cpu的数学...
  • cpu是如何响应中断

    千次阅读 2020-07-20 20:44:17
    这是NVIC的控制,其实NVIC在内存中就是一个接口芯片,通过译码电路连接到总线上,可以把NVIC想象成一个内存块。 这些寄存器就是控制NVIC的主要的寄存器,我们对NVIC的配置大部分都是通过对上面的寄存器进行配置以...
  • STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制)学习 在STM32中EXTI有0~18个事件/中断,0~4各自都是单独的一个通道,5~9是共一个通道,10~15共享一个通道,16/17/18各自独立用到一个通道 在STM32中NVIC是嵌套...
  • 什么是中断,为什么要用中断

    千次阅读 多人点赞 2010-11-13 23:09:00
    中断解析  一、中断什么  <br />中断的汉语解释是半中间发生阻隔、停顿或故障而断开。那么,在计算机系统中,我们为什么需要“阻隔、停顿和断开”呢?  <br />举个日常生活中的例子,比如...
  • 中断中断处理流程

    千次阅读 2020-12-20 04:41:20
    1. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器...
  • 中断嵌套

    千次阅读 2020-03-25 23:38:57
    读研期间,有幸接触了Stellaris系列的基于ARM Cortex-M3内核的LM3S9B9x微控制,该微控制支持中断的嵌套。 中断嵌套是指高优先级的中断能够打断低优先级的中断(反过来不可以),处理完高优先级的中断后,还得...
  • arm gic 中断控制工作原理概述

    千次阅读 2018-07-21 19:46:08
    linux pinctrl 里面有个gpio抽象的中断控制与系统的gic中断控制级联cascade 阅读arm generic interrupter controller architecture specification,总结下 支持的中断类型 平常工作接触到的是ppi,sgi和spi...
  • 51单片机 中断控制蜂鸣

    千次阅读 2020-02-21 17:30:23
    51单片机 中断控制蜂鸣 单片机通过使用外部中断控制蜂鸣。 #include <reg51.h> #define uint unsigned int #define uchar unsigned char // 定义蜂鸣连接的引脚 sbit beep = P1^0; // 延时...
  • arduino 计时中断

    万次阅读 多人点赞 2019-11-03 12:43:01
    定时器0:计时1:定时器2:Timer3,Timer4,Timer5:计时寄存器时钟选择和定时器频率计时模式什么是中断?定时器中断计时溢出:输出比较匹配:定时器输入捕捉:PWM和计时 本教程说明了Arduino板的计时和...
  • 中断向量控制中断处理的主要寄存器 --参考朱有鹏ARM裸机 1、异常处理的2个阶段 可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转 第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。 ...
  • 中断向量表

    千次阅读 2021-01-21 13:34:06
    中断向量表(interrupt vector table,IVT)是中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。在Pc/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类...
  • 文章目录§8.1 中断8.1.1 中断概念和分类1.中断的定义和功能2.中断源和中断分类8.1.2 中断的响应与处理过程1.中断响应过程2.8086的中断响应与处理§8.2 8259A的工作原理8.2.1 8259A的引脚信号和内部结构8.2.2 8259A...
  • 中断应用—时钟中断

    千次阅读 2019-08-20 15:40:54
    在所有的外部中断中,时钟中断起特殊的作用。因为计算机是以精确的时间进行数值运算和数据处理的,最基本的时间单元是时钟周期,例如取指令、执行指令、存取内存等,这里讨论的是操作系统建立的时间系统,这个时间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 453,035
精华内容 181,214
关键字:

中断器是什么

友情链接: monkey_eat.rar