浏览代码

[PIC/FIXUP] pirq reinit fail

don't reinit pirq's list if cascade

Signed-off-by: GuEe-GUI <2991707448@qq.com>
GuEe-GUI 1 年之前
父节点
当前提交
584f4b869d
共有 1 个文件被更改,包括 13 次插入4 次删除
  1. 13 4
      components/drivers/pic/pic.c

+ 13 - 4
components/drivers/pic/pic.c

@@ -177,15 +177,24 @@ static void config_pirq(struct rt_pic *pic, struct rt_pic_irq *pirq, int irq, in
 {
     rt_ubase_t level = rt_spin_lock_irqsave(&pirq->rw_lock);
 
+    if (pirq->irq < 0)
+    {
+        rt_list_init(&pirq->list);
+        rt_list_init(&pirq->children_nodes);
+        rt_list_init(&pirq->isr.list);
+    }
+    else if (pirq->pic != pic)
+    {
+        RT_ASSERT(rt_list_isempty(&pirq->list) == RT_TRUE);
+        RT_ASSERT(rt_list_isempty(&pirq->children_nodes) == RT_TRUE);
+        RT_ASSERT(rt_list_isempty(&pirq->isr.list) == RT_TRUE);
+    }
+
     pirq->irq = irq;
     pirq->hwirq = hwirq;
 
     pirq->pic = pic;
 
-    rt_list_init(&pirq->list);
-    rt_list_init(&pirq->children_nodes);
-    rt_list_init(&pirq->isr.list);
-
     rt_spin_unlock_irqrestore(&pirq->rw_lock, level);
 }