技术文章: 操作系统中的中断详解

一口Linux
关注

由上图所示:

EXT_INT41_PEND清相应的中断源ICDICPR中断结束后,清相应中断标志位,此标志位由硬件置位ICCEOIR中断执行结束,清cpu内相应的中断号,由硬件填充3. 寄存器汇总

前面分析了按键连接的是GPX1_1,现在我们来看下对应的寄存器应该如何配置

【1】、GPIO控制器GPX1PUD

将GPX1_1引脚的上拉和下拉禁止

 GPX1PUD[3:2]= 0b00;
GPX1CON

GPX1CON

将GPX1_1引脚功能设置为中断功能

GPX1CON[7:4] = 0xf
EXT_INT41CON

EXT_INT41CON

配置成成下降沿触发:

  EXT_INT41CON[6:4] = 0x2
EXT_INT41_MASK

EXT_INT41_MASK

中断使能寄存器

EXT_INT41_MASK[1] = 0b0
EXT_INT41_PEND 中断状态寄存器

EXT_INT41_PEND

当GPX1_1引脚接收到中断信号,中断发生,中断状态寄存器EXT_INT41_PEND 相应位会自动置1注意:中断处理完成的时候,需要清除相应状态位。置1清0.

EXT_INT41_PEND[1] =0b1
【2】GIC

根据外设中断名称EINT9来查看该中断对应的GIC中维护的HW id。【所有的中断源在芯片厂商设计的时候都分配了唯一的一个ID,GIC通过该ID来驱动中断源】

查看芯片手册(datasheet -- 9.2表)

GIC中断源表

通过【9.2中断源表】找到和外设中断标示对应的中断控制器中断标识(GPIO有32个可被唤醒寄存器)其对应「EINT[9],中断ID为57」,这是非常重要的,在后面的寄存器设置中起很大作用;

1) ICDISER使能相应中断到分配器

ICDISER

ICDISER用于使能相应中断到分配器,一个bit控制一个中断源,一个ICDISER可以控制32个中断源,这里INT[9] 对应的中断ID为57,所以在ICDSER1中进行设置,57/32 =1余25,所以这里在ICDISER1第25位置一。

 ICDISER.ICDISER1 |= (0x1 << 25);    //57/32 =1...25 取整数(那个寄存器) 和余数(哪位)
ICDIPTR选择CPU接口

ICDIPTR

ICDIPTR

选择cpu

ICDIPTR寄存器每8个bit 控制一个中断源,其中CPU0可以处理160个中断源,所以需要40个寄存器。要选择cpu0第一个bit必须是1。

设置SPI[25]/ID[57]由cpu0处理,57/4=16余1 所以选择寄存器ICDIPTR14的第2个字节[15:8]。

//SPI 25 interrupts are sent to processor 0  
//57/4 = 14..1 14号寄存器的[15:8]
ICDIPTR.ICDIPTR14 |= 0x01<<8;
ICDDCR使能分配器

还寄存器用于使能分配器。

ICDDCR =1;
ICCPMR优先级屏蔽寄存器,设置cpu0能处理所有的中断。比如中断屏蔽优先级为255,该值表示优先级最低,所有的中断都能响应。

ICCPMRCPU0.ICCPMR = 0xFF;//设置cpu0 中断屏蔽优先级为255  最低,所有中断都能响应)
ICCICR 全局使能cpu0中断处理

ICCICR

EXYNOS 4412一共有4个cpu,用4个寄存器分别来控制4个cpu,每个寄存器的bit[0]用于全局控制对应的cpu。我们选择cpu0处理中断,将bit[0]置1即可。

  CPU0.ICCICR |= 0x1;
  使能中断到CPU。
ICCIAR

ICCIAR

当中断发生之后,中断的HW id值会由硬件写入到寄存器ICCIAR[9:0]中;对于SGIs来说,多处理器环境下,CPU的interface值写入到[12:10]中。

读取HW id:

int irq_num;

irq_num = CPU0.ICCIAR&0x3ff;  //获取中断号

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存