zoukankan      html  css  js  c++  java
  • linux 中断学习记录

    @jiffy:中断处理分成两个层次: 
    1、CPU层次的中断处理 
    2、各个IRQ层面的处理 
    由于中文习惯通常中断,因此工程师很容易混淆这两个概念。
    T64时刻 3个clock之后,由于CPU已经ack了中断,因此GIC中CPU interface模块 deassert nFIQCPU信号线 
    @tuya:dts中的中断号当然是硬件中断号了,对于一个使用中断的外设的dts中,一定要描述下面的内容: 
    1、使用哪一个interrupt controller 
    2、使用该interrupt controller的哪一个中断号。这个中断号是和interrupt controller和外设interrupt request signal的物理连接有关系,当然是该interrupt controller这个domain中的硬件interrupt ID 
    
    你说的软件中断号应该是指IRQ number,这个IRQ number是系统分配的,和硬件无关 
    这时候,对于这个版本的GIC driver而言,初始化之后,HW interrupt ID和IRQ number的映射关系已经建立,保存在线性lookup table中,size等于GIC支持的中断数目,具体如下: 
    
    index 0~15对应的IRQ无效 
    
    16号IRQ  <------------------>16号HW interrupt ID 
    
    17号IRQ  <------------------>17号HW interrupt ID 
    
    是不是说在gic driver中HW interrupt ID和IRQ number是相等的? 
    
    但是你文中又说到 
         if (domain->ops->xlate(domain, irq_data->np, irq_data->args,----C 
                        irq_data->args_count, &hwirq, &type)) 
                return 0; 
        } 
    
        /* Create mapping */ 
        virq = irq_create_mapping(domain, hwirq);--------D 
        if (!virq) 
            return virq; 
    解析完了,最终还是要调用irq_create_mapping函数来创建HW interrupt ID和IRQ number的映射关系。 
    我的理解是在gic_irq_domain_xlate中会将dts中的中断号+32获得真正的HW interrupt ID,然后在用virq = irq_create_mapping(domain, hwirq)获得HW interrupt ID和IRQ number的映射。不知到这样理解对吗? 
    
    如果是简单的情况下,这个request_irq传入的irq num本质的数值大小就等于物理中断号吧? 
    本质上virtual interrupt ID(irq number)和HW interrupt ID之间可以建立任何的映射关系。不过对于本文中的GIC驱动代码,它采用了偷懒的做法,初始化的时候就创建了映射,这个映射关系就是virtual interrupt ID等于HW interrupt ID。 
    
    @gzz:对于gic而言,HW interrupt ID是[0-1019],其中: 
    1、SPI interrupts 范围是 [32-1019] 
    2、SGI interrupts 范围是 [0-15] 
    3、PPI interrupts 范围是 [16-31] 
    
    
    在dts文件中的HW interrupt ID定义如下: 
    1、SPI interrupts 范围是 [0-987] 
    2、PPI interrupts 范围是 [0-15] 
    
    只要掌握这两个编码规则,一切都很简单了 
    @tuya:dts中的中断号当然是硬件中断号了,对于一个使用中断的外设的dts中,一定要描述下面的内容: 
    1、使用哪一个interrupt controller 
    2、使用该interrupt controller的哪一个中断号。这个中断号是和interrupt controller和外设interrupt request signal的物理连接有关系,当然是该interrupt controller这个domain中的硬件interrupt ID 
    gic: interrupt-controller@ffc01000 { 
        compatible = "arm,gic-400"; 
        interrupt-controller; 
        #interrupt-cells = <3>; 
        #address-cells = <0>; 
        reg = <0xffc01000 0x1000="">,----Distributor address range 
              <0xffc02000 0x1000="">,-----CPU interface address range 
              <0xffc04000 0x2000="">,-----Virtual interface control block 
              <0xffc06000 0x2000="">;-----Virtual CPU interfaces 
        interrupts = ; 
    };
    

      

    一勤天下无难事。
  • 相关阅读:
    BZOJ.1034.[ZJOI2008]泡泡堂(贪心)
    BZOJ.4247.挂饰(背包DP)
    Codeforces.1040E.Network Safety(思路 并查集)
    LOJ.2863.[IOI2018]组合动作(交互)
    BZOJ.3624.[APIO2008]免费道路(Kruskal)
    BZOJ.4237.稻草人(CDQ分治 单调栈)
    BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
    BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
    BZOJ.2660.[BJOI2012]最多的方案(DP)
    BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/nowroot/p/14054586.html
Copyright © 2011-2022 走看看