<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:中斷編程

          嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:中斷編程

          作者: 時(shí)間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

          11.5

          前面所講述的驅(qū)動(dòng)程序中都沒有涉及中斷處理,而實(shí)際上,有很多Linux的驅(qū)動(dòng)都是通過中斷的方式來進(jìn)行內(nèi)核和硬件的交互。中斷機(jī)制提供了硬件和軟件之間異步傳遞信息的方式。硬件設(shè)備在發(fā)生某個(gè)事件時(shí)通過中斷通知軟件進(jìn)行處理。中斷實(shí)現(xiàn)了硬件設(shè)備按需獲得處理器關(guān)注的機(jī)制,與查詢方式相比可以大大節(jié)省CPU資源的開銷。

          本文引用地址:http://www.ex-cimer.com/article/257108.htm

          在此將介紹在驅(qū)動(dòng)程序中用于申請中斷的request_irq()調(diào)用,和用于釋放中斷的free_irq()調(diào)用。request_irq()函數(shù)調(diào)用的格式如下所示:

          intrequest_irq(unsignedintirq,

          void(*handler)(intirq,void*dev_id,structpt_regs*regs),

          unsignedlongirqflags,constchar*devname,oid*dev_id);

          其中irq是要申請的硬件中斷號。在Intel平臺(tái),范圍是0~15。

          參數(shù)handler為將要向系統(tǒng)注冊的中斷處理函數(shù)。這是一個(gè)回調(diào)函數(shù),中斷發(fā)生時(shí),系統(tǒng)調(diào)用這個(gè)函數(shù),傳入的參數(shù)包括硬件中斷號、設(shè)備id以及寄存器值。設(shè)備id就是在調(diào)用request_irq()時(shí)傳遞給系統(tǒng)的參數(shù)dev_id。

          參數(shù)irqflags是中斷處理的一些屬性,其中比較重要的有SA_INTERRUPT。這個(gè)參數(shù)用于標(biāo)明中斷處理程序是快速處理程序(設(shè)置SA_INTERRUPT)還是慢速處理程序(不設(shè)置SA_INTERRUPT)??焖偬幚沓绦虮徽{(diào)用時(shí)屏蔽所有中斷。慢速處理程序只屏蔽正在處理的中斷。還有一個(gè)SA_SHIRQ屬性,設(shè)置了以后運(yùn)行多個(gè)設(shè)備共享中斷,在中斷處理程序中根據(jù)dev_id區(qū)分不同設(shè)備產(chǎn)生的中斷。

          參數(shù)devname為設(shè)備名,會(huì)在/dev/interrupts中顯示。

          參數(shù)dev_id在中斷共享時(shí)會(huì)用到。一般設(shè)置為這個(gè)設(shè)備的device結(jié)構(gòu)本身或者NULL。中斷處理程序可以用dev_id找到相應(yīng)的控制這個(gè)中斷的設(shè)備,或者用irq2dev_map()找到中斷對應(yīng)的設(shè)備。

          釋放中斷的free_irq()函數(shù)調(diào)用的格式如下所示。該函數(shù)的參數(shù)與request_irq()相同。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();