在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Linux內(nèi)核開發(fā)之中斷與時鐘(一)

            Linux內(nèi)核開發(fā)之中斷與時鐘(一)

            作者: 時間:2016-12-05 來源:網(wǎng)絡 收藏

              “小王,醒醒,開始上課了,今天咱們開始講,這可是高級東西,錯過不補哈”我使勁推著睡夢中的小王。

            本文引用地址:http://www.biyoush.com/article/201612/341124.htm

              “嗯?感情好啊,快點,快點”小王一聽有新東西講,像打了雞血似的興奮,連我都懷疑起她是不是性格中喜新厭舊。

              不管那么多了,我講我的,她厭她的…

              啥叫?就是指cpu在執(zhí)行過程中,出現(xiàn)了某些突發(fā)事件時CPU必須暫停執(zhí)行當前的程序,轉(zhuǎn)去處理突發(fā)事件,處理完畢后CPU有返回原程序被的位置并繼續(xù)執(zhí)行。

              中斷的分法不懂,分類就不同,向什么內(nèi)外部中斷,可/不可屏蔽中斷…等等亂七八糟一大堆,我這里要說明的一點是按照中斷入口跳轉(zhuǎn)方法的不同,可分為向量中斷和非向量中斷。采用向量中斷的CPU通常為不同的中斷分配不同的中斷號,當檢測到某中斷號的中斷到來后,就自動跳轉(zhuǎn)到與該中斷號對應的地址執(zhí)行。不同的中斷號有不同的中斷地址(即入口)。而非向量中斷的多個中斷共享一個入口地址。進入后根據(jù)軟件判斷中斷標志來識別具體是哪個中斷。也就是說,向量中斷是由硬件提供中斷服務程序入口地址,非向量中斷由軟件提供中斷服務程序入口地址。

              我們在后邊會說到一個時鐘定時器,它也是通過中斷來實現(xiàn)的。它的原理很簡單,嵌入式微處理器它接入一個時鐘輸入,當時鐘脈沖到來時,就將目前的計數(shù)器值加1并和預先設置的計數(shù)值比較,若相等,證明計數(shù)周期滿,產(chǎn)生定時器中斷并復位目前計數(shù)器值。

                

             

              中斷處理架構(gòu)

              設備的中斷會打斷內(nèi)核中進程的正常調(diào)度和運行,會影響系統(tǒng)的性能。為了在中斷執(zhí)行時間盡可能短和中斷處理需完成大量工作之間找到一個平衡點,將中斷處理程序分解成兩個半部:頂半部和底半部。其中頂半部盡可能完成盡可能少的比較緊急的功能。而底半部幾乎做了中斷處理程序所有的事情,而且可以被新的中斷打斷。

              在linux設備驅(qū)動中,提供了一系列函數(shù)來幫助設備實現(xiàn)中斷的相關(guān)操作:

              1)設備申請中斷

              int request_irq(unsigned int irq, //irq是要申請的中斷號

              void (*handler)(int irq, void *dev_id, struct pt_regs * *regs),//回調(diào)函數(shù),中斷發(fā)生時,系統(tǒng)會調(diào)用該函數(shù),

              unsigned long irqflags,

              const char *devname,

              void *dev_id);

              其中irqflags是中斷處理的屬性,若設置為SA_INTERRUPT,則表示中斷處理程序是快速處理程序,它被調(diào)用時屏蔽所有中斷。若設置為SA_SHIRQ,則表示多個設備共享中斷,dev_id在中斷共享時會用到,一般設置為這個設備的設備結(jié)構(gòu)體或者NULL.

              該函數(shù)返回0表示成功,返回-INVAL表示中斷號無效或處理函數(shù)指針為NULL,返回EBUSY表示中斷已經(jīng)被占用且不能共享。

              2)釋放中斷

              free_irq(unsigned int irq, void *dev_id);

              3)使能和屏蔽中斷

              void disable_irq(int irq); //這個會立即返回

              void disable_irq_nosync(int irq);//等待目前的中斷處理完成再返回。

              void enable_irq(int irq);

              上述三個函數(shù)作用于可編程中斷處理器,因此對系統(tǒng)內(nèi)所有的CPU都生效。

              void local_irq_save(unsigned long flags);//會將目前的中斷狀態(tài)保留在flags中

              void local_irq_disable(void);//直接中斷

              這兩個將屏蔽本CPU內(nèi)的所有中斷。對應的上邊兩個中斷的方法如下

              void local_irq_restore(unsigned long flags);

              void local_irq_enable(void);

              我們兩邊說了系統(tǒng)中中斷是分為頂半部和底半部的,那么在系統(tǒng)實現(xiàn)方面是具體怎樣實現(xiàn)的呢,這主要有tasklet,工作隊列,軟中斷:

              1)tasklet:使用比較簡單,如下:

              void my_tasklet_function(unsigned long); //定義一個處理函數(shù)

              DECLARE_TASKLET(my_tasklet, my_tasklet_function, data); //定義了一個名叫my_tasklet的tasklet并將其與處理函數(shù)綁定,而傳入?yún)?shù)為data

              在需要調(diào)度tasklet的時候引用一個tasklet_schedule()函數(shù)就能使系統(tǒng)在適當?shù)臅r候進行調(diào)度運行:tasklet_schedule(&my_tasklet);

              2)工作隊列:使用方法和tasklet相似,如下:

              struct work_struct my_wq; //定義一個工作隊列

              void my_wq_func(unsigned long); //定義一個處理函數(shù)

              通過INIT_WORK()可以初始化這個工作隊列并將工作隊列與處理函數(shù)綁定,如下:

              INIT_WORK(&my_wq, (void (*)(void *))my_wq_func, NULL); //初始化工作隊列并將其與處理函數(shù)綁定

              同樣,使用schedule_work(&my_irq);來在系統(tǒng)在適當?shù)臅r候需要調(diào)度時使用運行。

              3)軟中斷:使用軟件方式模擬硬件中斷的概念,實現(xiàn)宏觀上的異步執(zhí)行效果,tasklet也是基于軟中斷實現(xiàn)的。

              在Linux內(nèi)核中,用softirq_action結(jié)構(gòu)體表征一個軟中斷,這個結(jié)構(gòu)體中包含軟中斷處理函數(shù)指針和傳遞給函數(shù)的參數(shù),使用open_softirq()可以注冊軟中斷對應的處理函數(shù),而raise_softirq()函數(shù)可以觸發(fā)一個中斷。

              軟中斷和tasklet仍然運行與中斷上下文,而工作隊列則運行于進程上下文。因此,軟中斷和tasklet的處理函數(shù)不能休眠,但工作隊列是可以的。

              local_bh_disable()和local_bh_enable()是內(nèi)核用于禁止和使能軟中斷和tasklet底半部機制的函數(shù)。

              下邊咱們再來說說有關(guān)中斷共享的相關(guān)點:中斷共享即是多個設備共享一根硬件中斷線的情況。Linux2.6內(nèi)核支持中斷共享,使用方法如下:

              *共享中斷的多個設備在申請中斷時都應該使用SA_SHIRQ標志,而且一個設備以SA_SHIRQ申請某中斷成功的前提是之前該中斷的所有設備也都以SA_SHIRQ標志申請該終端

              *盡管內(nèi)核模塊可訪問的全局地址都可以作為request_irq(….,void *dev_id)的最后一個參數(shù)dev_id,但是設備結(jié)構(gòu)體指針是可傳入的最佳參數(shù)。

              *在中斷帶來時,所有共享此中斷的中斷處理程序都會被執(zhí)行,在中斷處理程序頂半部中,應迅速根據(jù)硬件寄存器中的信息比照傳入的dev_id參數(shù)判斷是否是被設備的中斷,如果不是,應迅速返回。

              結(jié)語:在這次講解中說了三種Linux系統(tǒng)中中斷的頂/底半部機制和中斷共享的先關(guān)內(nèi)容,但礙于頁面空間的原因,沒有給出例子,我在下次博客中會專門來對每個點給出典型的模版.



            關(guān)鍵詞: Linux 中斷

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉