我覺得要學好中斷的話,下面的內容遲早都要很熟的。
底層硬體操作方法
每一條中斷線都有乙個底層硬體操作函式集struct irq_chip 。大多數控制方法都是重複的 ,基本上只要有
中斷響應 、 中斷遮蔽 、 中斷開啟 、 中斷觸發型別設定等方法就可以滿足要求了。其他各種方法基本上和這些相同。
這些操作方法的實現在檔案linux/arch/arm/plat-s3c24xx/irq.c中。
例如外部中斷 irq_eint0 ~ irq_eint3都用以下操作函式集:
static struct irq_chip s3c_irq_eint0t4 = ;
static inline void
s3c_irq_ack(unsigned int irqno)
static void
s3c_irq_mask(unsigned int irqno)
static void
s3c_irq_unmask(unsigned int irqno)
ints3c_irqext_type(unsigned int irq, unsigned int type)
。。。。。。
__raw_writel(value, gpcon_reg);
//將對應管腳配置成中斷功能
switch (type)
value = __raw_readl(extint_reg);
value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset);
__raw_writel(value, extint_reg);
//設定中斷的觸發方式。
return 0;
}中斷申請函式
//中斷申請函式request_irq()只是函式request_threaded_irq()的包裝而已
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
irq_handler_t thread_fn, unsigned long irqflags,
const char *devname, void *dev_id)
#ifdef config_lockdep
irqflags |= irqf_disabled;
#endif
if ((irqflags & irqf_shared) && !dev_id)
return -einval;
desc = irq_to_desc(irq);
//根據中斷號獲取中斷線描述符結構體
if (!desc)
return -einval;
if (desc->status & irq_norequest)
return -einval;
if (!handler)
return -einval;
//分配乙個中斷服務例程結構體action並初始化它的各欄位。
action = kzalloc(sizeof(struct irqaction), gfp_kernel);
if (!action)
return -enomem;
action->handler = handler;
action->thread_fn = thread_fn; //為null
action->flags = irqflags;
action->name = devname;
//對於共享中斷 , 此特定值用來區分各中斷,以便從共享中斷線的諸多中斷處理程式中刪除指定的那乙個。
action->dev_id = dev_id;
//將該例程新增到單向鍊錶desc->action上,並啟動該例程。
retval = __setup_irq(irq, desc, action);
if (retval)
kfree(action);
。。。。。。
return retval;}
static int
__setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
while (old);
shared = 1;
}if (!shared) else
compat_irq_chip_set_default_handler(desc);
// desc->status的標誌irq_noautoen 在中斷初始化函式 s3c24xx_init_irq()中呼叫函式set_irq_flags()設定。
if (!(desc->status & irq_noautoen)) else
desc->depth = 1;
。。。。。。
}*old_ptr = new; //將新加入的中斷處理例程新增到鍊錶中
。。。。。。
//在proc檔案系統中建立目錄。
new->irq = irq;
register_irq_proc(irq, desc);
new->dir = null;
register_handler_proc(irq, new);
。。。。。。
return ret;}
中斷解除安裝函式free_irq().。
如果指定的中斷線不是共享的 , 那麼 , 該函式刪除處理程式的同時將禁用這條中斷線 。 如果
中斷線是共享的,則僅刪除 dev_id 所對應的處理程式,而這條中斷線本身只有在刪除了最
後乙個處理程式時才會被禁用。由此可以看出為什麼惟一的 dev_ id 如此重要。對於共享的
中斷線,需要乙個惟一的資訊來區分其上面的多個處理程式,並讓 free_irq() 僅僅刪除指定
的處理程式。如果 dev_id 非空,它都必須與需要刪除的處理程式相匹配。非共享中斷,該
域可以為空,但需要和註冊時使用的指標一致。
static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
*action_ptr = action->next;
。。。。。。
if (!desc->action)
。。。。。。。
return action;
//返回中斷處理例程結構體
}//在函式free_irq中將函式__free_irq返回的中斷處理例程結構體釋放掉。
void free_irq(unsigned int irq, void *dev_id)
關於Linux2 6中斷的一些記錄
1.中斷向量和中斷號 中斷線 中斷向量是從cpu角度規定的中斷訊號劃分 中斷號是pic引腳號 2.幾種異常 故障,陷阱,中止 3.中斷描述符表idt 異常與中斷發生時,都需要到idt中查詢相關資訊,以找到對應的處理程式以及其他動作。需要注意的是,保護模式下發生許可權提公升時,中斷穿越的是中斷門,而異...
關於Linux中斷一些思考
目錄前言 關於中斷歷史與發展 linux中斷設計 linux中斷下半部實現 軟中斷 tasklet 工作佇列 關於可重入和不可重入函式 在我們學習中斷的時候,先要了解幾個概念。何為中斷?為什麼要使用中斷?中斷如何運作?弄明白這些再去使用中斷會顯得得心應手。何為中斷?cpu在執行的過程中,由於外部因素...
關於中斷的一些整理
中斷裝置和中斷處理程式統稱為中斷系統。中斷系統是計算機的重要組成部分。實時控制 故障自動處理 計算機與外圍裝置間的資料傳送往往採用中斷系統。中斷系統的應用大大提高了計算機效率。不同的計算機其硬體結構和軟體指令是不完全相同的,因此,中斷系統也是不相同的。計算機的中斷系統能夠加強cpu對多工事件的處理能...