首页 > 编程知识 正文

中断优先级是如何控制的,软中断intn的优先级排列原则是

时间:2023-05-03 21:27:06 阅读:27507 作者:4784

中断一般包括中断发生装置和中断处理装置。 中断控制器负责中断的处理,每个中断都有对应的中断号码和触发条件。 中断发生设备可能有多个中断源,多个中断源可能对应于中断控制器中的一个中断。 这种中断发生设备的中断源称为中断控制器中与中断对应的子中断。 一般情况下,中断发生设备的数量比中断控制器多,多个中断发生设备的中断由一个中断控制器处理。 由于这种多对一关系也类似于树结构,因此在设备树中,中断也被描绘为树,称为中断树。 在以下描述中,为了明确中断树的情况,在父节点和子节点之前标注了中断这一文字。 这是为了防止与设备树的父节点、子节点混淆(在大部分情况下,设备树的父子关系是中断树的父子关系,但由于存在特例,强调中断父子关系)。

中断发生设备用interrupts属性描述“中断源”(interrupt specifier )。 interrupts属性的类型也是如此,因为不同的硬件需要不同的数据量来描述中断源。 为了明确一个中断由几个u32表示,引入了#interrupt-cells属性。 #interrupt-cells属性的类型为u32,如果一个中断源需要两个u32表示(一个表示中断号码,另一个表示中断类型),则在#interrupt-celllls的情况下,在设备树中的由于中断控制器通常不是父节点,因此引入了引用父节点而不是中断控制器的interrupt-parent属性类型。 如果设备树的父节点是中断父节点,则可以不设置interrupt-parent属性。 interrupts和interrupt-parent属性是中断发生设备节点的属性,但#interrupt-cells属性不同。 #interrupt-cells属性是中断控制器节点和interrupt nexus节点的属性,这两种类型的节点都可能是中断父节点。

中断控制器节点在interrupt-controller属性中表示是中断控制器。 此属性的类型为空,不需要设置值。 只要该节点存在,就表示该节点是中断控制器。 除了该属性外,中断控制器的节点还具有#interrupt-cells属性。 它表示由中断控制器直接管理的中断域。 中断控制器的中断子节点interrupt nexus节点具有单独的interrupt domain。 在几个u32上显示中断源(中断控制器节点包含有关中断的两个属性: interrupt-controller和#interrupt-cells。 中断控制器的#address-cells属性与中断映射有关,但此属性不是为中断设计的,中断映射只是使用了此属性。

他说,中断控制器中的一个中断可能支持中断发生装置中的多个中断源,这种对应关系是如何描述的? 另外,##interrupt-celll属性不仅是中断控制器节点的属性,还用interrupt-map、interrupt-map-mask属性记述中断映射关系的interrupt-celll not 请注意,它是“中断映射关系”,而不是“中断映射关系”。 从子设备地址中断、子设备中断源“中断规范”、父设备中断、父设备中断、父设备中断子设备地址具体为好此位置使用中断子设备地址而不是中断子设备的phandle的原因是,中断子设备在interrupt-parrent属性中指向中断父节点,因此可以确定中断子设备,以及子设备地址中断子设备“中断源”(interrupt specifier )由几个u32组成,由该interrupt nexus节点下的#interrupt-cell确定。 中断父设备是指向中断父设备的属性,通常是中断控制器,但根据中断树的逻辑,也可能是较高的interrupt nexus节点。 中断父设备地址具体由几个u32组成,由中断父设备节点下的#address-cells属性决定。 请注意,这不是中断父设备所在总线的#address-cells属性。 中断父设备“中断源”(interrupt specifier )由中断父设备的#interrupt-cells属性确定的几个u32组成。

请记住,中断设备的中断源和中断控制器的中断源可能存在多对一的关系。 如果每个子中断由interrupt-map中的一行表示,则interrupt-map属性将非常大。 为了使多个子中断共享映射关系,引入了interrupt-map-mask属性。 此属性的类型也是位掩码,包括子设备地址和中断子设备中断源,给定子中断源后,首先与interrupt-map-mask进行运算,运算结果通过interrupt-map

对应的中断父设备中断源。这就是我们前边为什么说interrupt-map属性的一行是一个“中断映射关系”,而不是“一个中断”映射关系的原因。

我们再来复习一下,整个中断树的最底层是中断产生设备(也可能是从interrupt nexus节点),中断产生设备用interrupts属性描述他能产生的中断。因为他的中断父设备可能和设备树的父设备不同,那么用interrupt-parent属性指向他的中断父设备。他的中断父设备可能是中断控制器(如果中断产生设备的中断和中断控制器的中断是一一对应的,或者最底层是interrupt nexus节点),也可能是interrupt nexus节点(如果最底层是中断产生设备,且需要映射)。interrupt nexus节点及他的所有直接子节点构成了一个interrupt domain,在该interrupt domain下中断源怎样表示由#interrupt-cells属性决定,如何由中断子设备中断源找到中断父设备中断源由interrupt-map和interrupt-map-mask属性决定。interrupt nexus的父节点可能还是一个interrupt nexus父节点,也可能是一个中断控制器,当向上找到最后一个中断控制器,并且该中断控制器再也没有中断父设备时,整个中断树就遍历完成了。中断控制器用interrupt-controller属性表示自己是中断控制器,并且用#interrupt-cells属性表示他所直接管理的interrupt domain用几个u32表示一个中断源。根据中断树的特性,一个设备树中是有可能有多个中断树的。

以上是中断在设备树中如何描述的规则,听起来是挺复杂的,但只要理解了就很简单,为了帮助理解我们举一个实际的例子。为了突出中断部分,我们做了简化。

/ {

model = "Marvell Armada 375 family SoC";

compatible = "marvell,armada375";

soc {

#address-cells = <2>;

#size-cells = <1>;

interrupt-parent = ;

internal-regs {

compaTIble = "simple-bus";

#address-cells = <1>;

#size-cells = <1>;

TImer@c600 {

compaTIble = "arm,cortex-a9-twd-TImer";

reg = <0xc600 0x20>;

interrupts = ;

clocks = ;

};

gic: interrupt-controller@d000 {

compatible = "arm,cortex-a9-gic";

#interrupt-cells = <3>;

#address-cells = <0>;

interrupt-controller;

reg = <0xd000 0x1000>,

<0xc100 0x100>;

};

}

pcie-controller {

compatible = "marvell,armada-370-pcie";

#address-cells = <3>;

#size-cells = <2>;

pcie@1,0 {

#address-cells = <3>;

#size-cells = <2>;

#interrupt-cells = <1>;

interrupt-map-mask = <0 0 0 0>;

interrupt-map = <0 0 0 0 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;

};

};

}

首先我们看到timer@c600这个设备节点下定义了interrupts属性,这说明该设备可以产生中断,但是这个属性下描述了几个中断我们是看不出来的(如果有经验了,我们能猜出只是一个中断,现在我们按照规则确认)。因为该节点没有interrupt-parent属性,那么认为设备树的父节点internal-regs就是中断父节点,在internal-regs父节点下还是没有interrupt-parent属性,那么还是继续找设备树父节点,找到了soc,在该节点下边有interrupt-parent属性。该属性引用的标签为gic,搜索整个设备树,interrupt-controller@d000的标签为gic。gic节点下有interrupt-controller属性,说明他是一个中断控制器。gic节点还有属性#interrupt-cells = <3>,说明在该控制器的interrupt domain下,中断源(interrupt specifier)用3个u32表示,我们再看timer@c600下的interrupts属性也确实由3个u32组成(可以参考GIC的规范,第一个u32表示中断类型,第二个是中断号,第三个是中断触发条件)。这个例子说明如果中断产生设备的中断源和中断控制器的中断源是一一对应的,那么可以不需要interrupt nexus节点及相关的属性来表示中断映射。

再看pcie@1,0这个节点,有#interrupt-cells属性,但是没有interrupt-controller属性,这说明他是一个interrupt nexus节点。该节点的#interrupt-cells属性为1,说明该interrupt nexus节点管辖下的中断源用1个u32表示就可以了。在pcie@1,0节点下边没有子节点,且也没有节点的interrupt-parent属性指向pcie@1,0节点,所以从设备树上看不到该interrupt domain下的中断产生设备,可能的原因是这些中断产生设备软件可以动态识别所以不需要设备树描述。因为interrupt-map-mask属性是由中断产生设备的地址和中断源(interrupt specifier)组成,且中断源用1个u32表示,那么可以推测中断产生设备地址由3个u32组成。这里需要注意的是pcie@1,0节点的#address-cells属性为3,是说该总线下边的设备地址用3个u32表示,但并不代表中断产生设备的设备地址也一定3个u32表示,此处不能说是巧合,但是我们要清楚中断产生设备的地址由几个u32组成是由该设备所在总线决定的,对于pcie总线也确实是3,但是其他总线可能存在其他种的情况。现在我们来分析interrupt-map属性,前三个数字是中断设备地址,第四个数字是中断设备的中断源。因为interrupt-map-mask是全0,这样不管与什么数字做与运算结果都是0,interrupt-map属性的前4个数字也都是0,这说明在pcie@1,0下边所有的中断映射到中断父节点的中断都是一个中断。接着是指向gic的,因为gic节点下#address-cells属性为0,所以后边不需要描述中断父设备的地址了,后边3个数字都是表示中断父设备中断源的。一句话描述就是pcie@1,0下的所有中断都映射到gic,GIC_SPI类型的第29号中断,触发类型为高电平触发。这个例子说明在中断树的最下边可以是interrupt nexus节点。

以上例子中断树的根是gic,gic下边有两个孩子,一个是中断设备timer@c600,一个是interrupt nexus节点pcie@1,0。gic直接管辖的interrupt domain用3个u32表示中断源,timer@c600在这个interrupt domain下。pcie@1,0下定义了一个新的interrupt domain,在该interrupt domain下,中断源用1个u32表示,pcie@1,0用interrupt-map和interrupt-map-mask属性将下边所有设备的中断映射到一个gic下边的中断上。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。