日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
深入了解Linux中的irqdesc機(jī)制(linuxirqdesc)

Linux操作系統(tǒng)的使用越來(lái)越廣泛,因?yàn)樗哂袃?yōu)秀的穩(wěn)定性、安全性和開(kāi)放性,而且在嵌入式系統(tǒng)、服務(wù)器等領(lǐng)域也有廣泛的應(yīng)用。在Linux中,中斷是相當(dāng)重要的成分之一,以便在保證系統(tǒng)響應(yīng)速度和效率的同時(shí),能夠處理外設(shè)的數(shù)據(jù)和信號(hào)。IRQ(Interrupt Request,中斷請(qǐng)求)是一種方式,可以通過(guò)向CPU發(fā)送請(qǐng)求,并暫停主處理器,進(jìn)行一些臨時(shí)的時(shí)間敏感操作,如輸入輸出和其他設(shè)備操作。IRQ描述符機(jī)制是Linux中處理中斷請(qǐng)求的重要機(jī)制之一。讓我們來(lái)深入了解一下Linux中的irq desc機(jī)制吧。

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、志丹網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為志丹等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

1. 簡(jiǎn)介

irq desc指的是中斷事件的描述符(描述符是用于管理資源的抽象基本單元)。在Linux內(nèi)核中,用一個(gè)專(zhuān)門(mén)的機(jī)制來(lái)處理中斷,降低系統(tǒng)性能消耗的同時(shí)保證了中斷的準(zhǔn)確性和高效性。內(nèi)核把硬件中斷源映射到一個(gè)軟中斷之后,再由軟中斷處理程序進(jìn)行進(jìn)一步處理。這個(gè)過(guò)程中有一些數(shù)據(jù)結(jié)構(gòu)主要有irq_desc、irq_chip和irq_domn,其中irq_desc是中斷描述符。

2. 中斷處理的優(yōu)化

Linux內(nèi)核為了滿足高性能和低延遲的需求,對(duì)中斷和中斷處理進(jìn)行了優(yōu)化。主要包括兩個(gè)方面:

(1)中斷共享

當(dāng)多個(gè)設(shè)備同時(shí)發(fā)送中斷請(qǐng)求時(shí),內(nèi)核可以選擇使用共享的方式,只需要把所有的中斷源映射到一個(gè)軟中斷即可。這樣不僅可以減少中斷向量的占用,還可以減少CPU時(shí)間的浪費(fèi),從而提高系統(tǒng)的效率。

(2)中斷波動(dòng)處理

中斷可能會(huì)因?yàn)槟承┎豢深A(yù)知的原因而出現(xiàn)波動(dòng)。這時(shí)候,如果每一個(gè)中斷事件都去喚醒CPU的話,那么處理器的效率就會(huì)被大大降低。為了防止這種情況發(fā)生,Linux內(nèi)核采用一種稱為中斷波動(dòng)處理的機(jī)制,可以在一定周期內(nèi)進(jìn)行檢查,該周期叫做IRQ Stormreshold。

3. 中斷描述符機(jī)制

在Linux內(nèi)核中,中斷和中斷處理是通過(guò)中斷描述符進(jìn)行管理和調(diào)度的。當(dāng)硬件產(chǎn)生中斷信號(hào)的時(shí)候,中斷系統(tǒng)將生成一個(gè)中斷描述符,其中包含了中斷控制器在處理特定中斷時(shí)的所有相關(guān)信息。Linux中斷描述符結(jié)構(gòu)體(irq_desc)如下:

“`

struct irq_desc {

struct irq_common_data irq_common_data;

struct irq_data irq_data;

#ifdef CONFIG_GENERIC_IRQ_PROBE

struct device_node *of_node;

#endif

struct irq_chip *chip;

struct irq_desc *parent_irq;

struct module *owner;

const char *action_name;

#ifdef CONFIG_PROC_FS

struct proc_dir_entry *dir;

#endif

unsigned int yield_flags;

};

“`

其中,irq_common_data為公共中斷信息,irq_data為通用中斷處理程序所需的硬件描述,chip為處理硬件的架構(gòu)依賴代碼的指針,owner表示中斷描述符所屬的模塊,action_name為中斷名稱,yield_flags表示是否已經(jīng)被喚醒過(guò)。

4. 中斷和處理程序的注冊(cè)

當(dāng)一個(gè)中斷事件發(fā)生時(shí),它將發(fā)出一個(gè)中斷請(qǐng)求,并映射到中斷描述符上。中斷處理程序可以在系統(tǒng)內(nèi)核中注冊(cè),它的任務(wù)是在中斷事件發(fā)生時(shí)盡快被調(diào)用,以處理該事件。在內(nèi)核中可以使用request_irq()函數(shù)對(duì)中斷進(jìn)行注冊(cè),它的聲明如下所示:

“`

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

const char *name, void *dev);

“`

其中,irq參數(shù)是中斷編號(hào),handler是中斷處理函數(shù),flags為一個(gè)中斷標(biāo)志位,name是中斷描述符的名稱,dev是一個(gè)指向?qū)嵗闹羔槨?/p>

5. 中斷處理函數(shù)的執(zhí)行過(guò)程

當(dāng)某個(gè)中斷發(fā)生時(shí),對(duì)應(yīng)的硬件將向處理器發(fā)送信號(hào),處理器會(huì)暫停正在執(zhí)行的工作,并跳轉(zhuǎn)到與該中斷相應(yīng)的中斷處理程序。中斷處理程序執(zhí)行并完成特定的操作之后,將恢復(fù)主處理器的執(zhí)行。中斷處理函數(shù)內(nèi)包含的操作應(yīng)該是盡可能簡(jiǎn)短、絕不進(jìn)行復(fù)雜計(jì)算或大量I/O操作的程序。在執(zhí)行中斷處理程序時(shí),它可以從IRQ_DESC狀態(tài)中判斷該中斷是否已經(jīng)被處理過(guò),以便消除重復(fù)執(zhí)行。

6.

irq desc機(jī)制是Linux中處理中斷請(qǐng)求的重要機(jī)制之一,它可以保證系統(tǒng)的性能和穩(wěn)定性。中斷處理函數(shù)的執(zhí)行過(guò)程伴隨著中斷描述符的注冊(cè)以及一些其他的優(yōu)化策略,如中斷共享和中斷波動(dòng)處理。在系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)中,有必要深入了解其中的機(jī)制和原理,以便為系統(tǒng)的性能和效率提供更好的保障。

相關(guān)問(wèn)題拓展閱讀:

  • Linux如何及時(shí)響應(yīng)外部中斷
  • 請(qǐng)教linux irq 中斷能使用mutex互斥鎖嗎

Linux如何及時(shí)響應(yīng)外部中斷

FPGA每隔100us給運(yùn)行l(wèi)inux的ARM一個(gè)中斷,要求在20us內(nèi)響應(yīng)中斷,并讀走2023*16bit的數(shù)據(jù)。

目前主要的問(wèn)題是,當(dāng)系統(tǒng)同時(shí)發(fā)生多個(gè)中斷時(shí),會(huì)嚴(yán)重影響linux對(duì)FPGA中斷的響應(yīng)時(shí)間。如何解決?

1、首先想到了ARM的FIQ,它可以打斷IRQ中斷服務(wù)程序,保證對(duì)外部FIQ的及時(shí)響應(yīng)。但是發(fā)現(xiàn)linux只實(shí)現(xiàn)了IRQ,沒(méi)有顯示FIQ。

linux是從devicetree讀取中斷號(hào),加入中斷向量表的。

interrupts = ;中的之一個(gè)字段0表示非共享中斷,非零表示共享中斷,SDK產(chǎn)生的dts統(tǒng)一為0,此時(shí)第二字段的值比XPS中的小32;如果之一字段非零,則第二字段比XPS小16.

最后字段表示中斷的觸發(fā)方式。

IRQ_TYPE_EDGE_RISING =0x,

IRQ_TYPE_EDGE_FALLING =0x,

IRQ_TYPE_LEVEL_HIGH =0x,

IRQ_TYPE_LEVEL_LOW =0x,

很明顯,devicetree根本沒(méi)有提供通知linux有FIQ的渠道。

2、再來(lái)看linux的IRQ

linux的中斷分為上半部清伏和下半部,上半部運(yùn)行在IRQ模式,會(huì)屏蔽所有中斷,下半部運(yùn)行在SVC模式,會(huì)重新打開(kāi)中斷。

也就是說(shuō),當(dāng)一個(gè)中斷的上半部正在運(yùn)行時(shí)(不能再次響應(yīng)中斷),F(xiàn)PGA的中斷是不能被linux響應(yīng)的;

反過(guò)來(lái),當(dāng)FPGA中斷的上半部正在運(yùn)行時(shí)(不能再次響應(yīng)中斷),其他的中斷也不能被linux響應(yīng);

unsigned long flags;

local_irq_save(flags);

….

local_irq_restore(flags);

3.

ARM有七種模式,我們這里只討論SVC、IRQ和FIQ模式。

我們可以假設(shè)ARM核心有兩根中斷引腳(實(shí)際上是看不見(jiàn)的),一根叫 irq pin, 一根叫fiq pin.

在ARM的cpsr中,有一個(gè)I位和一個(gè)F位,分別用來(lái)禁止IRQ和FIQ的。

先不說(shuō)中斷控制器,只說(shuō)ARM核心。正常情況下,ARM核都只是機(jī)械地隨著pc的指示去做事情,當(dāng)CPSR中的I和F位為1的時(shí)候,IRQ和FIQ全部處于禁止?fàn)顟B(tài)。無(wú)論你在irq

pin和fiq pin上面發(fā)什么樣的中斷信號(hào),ARM是不會(huì)理你的,你根本不能打斷他,因?yàn)樗@了,眼也瞎了。

在I位和F位為0的時(shí)候,當(dāng)irq

pin上有中斷信號(hào)過(guò)來(lái)的時(shí)候,就會(huì)打斷arm的當(dāng)前工作,并且切換到IRQ模式下,并且跳到相應(yīng)的異常向量表(vector)位置去執(zhí)行代碼。這個(gè)過(guò)程是自動(dòng)的,但是返回到被中斷打斷的地方就得您親自動(dòng)手了。當(dāng)你跳到異常向量表,處于IRQ的模式的時(shí)候,這個(gè)時(shí)候如果irq

pin上面又來(lái)中斷信號(hào)了,這個(gè)時(shí)候ARM不會(huì)理你的,irq

pin就跟秘書(shū)一樣,ARM核心就像老板,老板本來(lái)在做事,結(jié)果來(lái)了一個(gè)客戶,秘書(shū)打斷它,讓客戶進(jìn)去了。而轎櫻這個(gè)時(shí)候再來(lái)一個(gè)客戶,要么秘書(shū)不斷去敲門(mén)問(wèn),要么客戶走人。老板之一個(gè)客戶沒(méi)有會(huì)見(jiàn)完,是不會(huì)理你的。

但是有一種情況例外,當(dāng)ARM處在IRQ模式,這個(gè)時(shí)候fiq pin來(lái)了一個(gè)中斷信號(hào),fiq

pin是什么?是快速中斷呀,比如是公安局的來(lái)查刑事案件,那才不管你老板是不是在會(huì)見(jiàn)閉正叢客戶,直接打斷,進(jìn)入到fiq模式下,并且跳到相應(yīng)的fiq的異常向量表處去執(zhí)行代碼。那如果當(dāng)ARM處理FIQ模式,fiq

pin又來(lái)中斷信號(hào),又就是又一批公安來(lái)了,那沒(méi)戲,都是執(zhí)法人員,你打不斷我。那如果這個(gè)時(shí)候irq

pin來(lái)了呢?來(lái)了也不理呀,正在辦案,還敢來(lái)妨礙公務(wù)。

所以得出一個(gè)結(jié)論: IRQ模式只能被FIQ模式打斷,F(xiàn)IQ模式下誰(shuí)也打不斷。

在打不斷的情況下,irq pin 或 fiq pin隨便你怎么發(fā)中斷信號(hào),都是白發(fā)。

所以除了fiq能打斷irq以外,根本沒(méi)有所謂中斷嵌套的情況。

Linux不用FIQ,只用到了IRQ。但是我們有時(shí)候一個(gè)中斷需要處理很長(zhǎng)時(shí)間,那我們就需要占用IRQ模式那么長(zhǎng)的時(shí)間嗎?沒(méi)有,linux在IRQ模式下只是簡(jiǎn)單的記錄是什么中斷,馬上就切換回了SVC模式,換句話說(shuō),Linux的中斷處理都是在SVC模式下處理的。

只不過(guò)SVC模式下的ISR上半部關(guān)閉了當(dāng)前中斷線,下半部才重新打開(kāi)

請(qǐng)教linux irq 中斷能使用mutex互斥鎖嗎

從 Backtrace 來(lái)看,應(yīng)該是 i2c_transfer 中調(diào)用 mutex_lock 導(dǎo)致 schedule 調(diào)用而產(chǎn)生 進(jìn)程調(diào)度,導(dǎo)致死機(jī). 而嘩運(yùn)在中斷上下文,這種情況亂好梁是絕對(duì)不允許發(fā)生的.換句襪洞話說(shuō)是不允許

睡眠的,不允許進(jìn)程調(diào)度. 

你可以 把 mutex_lock 注釋掉再試試 .

關(guān)于linux irq desc的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


標(biāo)題名稱:深入了解Linux中的irqdesc機(jī)制(linuxirqdesc)
分享路徑:http://www.5511xx.com/article/dhehocj.html