中斷與時鐘

2022-08-10 09:09:12 字數 3405 閱讀 2592

0、序言

中斷服務程式的執行並不存在於程序上下問中,要求中斷服務程式的時間要盡量短。因此,linux中斷處理中引入上半部和下半部分離的機制。另外,核心對時鐘的處理也是採用中斷方式,而核心軟體定時器最終依賴於時鐘中斷。

1、中斷與定時器

基本概念……

2、linux中斷處理程式架構

中斷會打斷核心程序的正常排程和執行,為了提高系統的吞吐率勢必要求中斷服務程式盡量短小精悍。大多是真實的系統中,中斷需要處理的工作並不會是短小,他可能需要進行大量耗時的處理。

為了平衡執行時間盡量短和中斷處理需要處理較大工作量,linux將中斷處理程式分解為兩個半部:頂半部(top half)和底半部(bottom half)。

3、linux中斷程式設計

1)申請中斷(/include/linux/interrupt.h)

static inline int __must_check

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,

const char *name, void *dev)

static inline int __must_check

devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

2)釋放中斷(/include/linux/interrupt.h)

extern void free_irq(unsigned int, void *);

extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);

3)使能中斷(/include/linux/interrupt.h)

extern void enable_irq(unsigned int irq);

4)遮蔽中斷(/include/linux/interrupt.h)

extern void disable_irq_nosync(unsigned int irq);

extern void disable_irq(unsigned int irq);

4、linux底半部機制

1)tasklist(/include/linux/interrupt.h)

執行上下文是軟中斷,執行時機通常是頂半部返回。

extern void tasklet_init(struct tasklet_struct *t,

void (*func)(unsigned long), unsigned long data);

static inline void tasklet_schedule(struct tasklet_struct *t)

2)工作佇列(/include/linux/workqueue.h)

執行上下文是執行緒,可以排程和休眠。

extern void __init_work(struct work_struct *work, int onstack);

static inline bool schedule_work(struct work_struct *work)

3)軟中斷(/include/linux/interrupt.h)

不可打斷,執行時機通常是頂半部返回。

extern void open_softirq(int nr, void (*action)(struct softirq_action *));

extern void raise_softirq(unsigned int nr);

4)執行緒化(/include/linux/interrupt.h)

申請中斷和工作佇列的封裝。

extern int __must_check

request_threaded_irq(unsigned int irq, irq_handler_t handler,

irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev);

static inline int __must_check

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,

const char *name, void *dev)

5、中斷共享

多個裝置共享一根硬體中斷線的硬體系統廣泛存在,linux支援這種中斷共享。申請中斷時,只需要屬性標誌加上irqf_shared即可。

6、核心定時器

軟體意義上的定時器,最終依賴硬體定時器來實現。內部時鐘發生中斷,檢測各定時器是否到期,到期的定時器處理函式將作為軟中斷於底半部執行。

1)初始化定時器(/include/linux/timer.h)

void init_timer_key(struct timer_list *timer, unsigned int flags,

const char *name, struct lock_class_key *key)

2)增加定時器(/include/linux/timer.h)

extern void add_timer(struct timer_list *timer);

3)刪除定時器(/include/linux/timer.h)

extern int del_timer(struct timer_list * timer);

4)修改定時器(/include/linux/timer.h)

extern int mod_timer(struct timer_list *timer, unsigned long expires);

7、核心中延時工作

1)週期性延時(include/linux/workqueue.h)

delay_work封裝了工作佇列和定時器。

static inline bool schedule_delayed_work(struct delayed_work *dwork,

unsigned long delay)

extern bool cancel_delayed_work(struct delayed_work *dwork);

extern bool cancel_delayed_work_sync(struct delayed_work *dwork);

2)非週期性延時(/include/linux/sched.h)

extern long schedule_timeout(long timeout);

extern long schedule_timeout_interruptible(long timeout);

中斷與時鐘

0 序言 中斷服務程式的執行並不存在於程序上下問中,要求中斷服務程式的時間要盡量短。因此,linux中斷處理中引入上半部和下半部分離的機制。另外,核心對時鐘的處理也是採用中斷方式,而核心軟體定時器最終依賴於時鐘中斷。1 中斷與定時器 基本概念 2 linux中斷處理程式架構 中斷會打斷核心程序的正常...

中斷與時鐘機制

一.中斷 irq 中斷安裝與釋放 1.申請中斷線 int request irq unsigned int irq,irq handler t handler,unsigned long irqflags,const char devname,void dev id 中斷號 中斷處理函式 中斷觸發方...

時鐘中斷技術

時鐘中斷技術 1系統中斷與時鐘節拍 1.1 系統中斷 中斷是一種硬體機制,用於通知cpu有個非同步事件發生了。中斷一旦被系統識別,cpu則儲存部分 或全部 現場 context 即部分 或全部 暫存器的值,跳轉到專門的子程式,稱為中斷服務子程式 isr 中斷服務子程式做事件處理,處理完成後執行任務排...