linux2 6關於中斷的一些入門介紹

2021-06-21 22:43:10 字數 3457 閱讀 7958

我覺得要學好中斷的話,下面的內容遲早都要很熟的。

底層硬體操作方法

每一條中斷線都有乙個底層硬體操作函式集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對多工事件的處理能...