www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件

作者:劉洪濤,華清遠(yuǎn)見(jiàn)嵌入式學(xué)院金牌講師。

四、中斷處理模型

要想弄清楚desc->handle_IRq(irq, desc)和我們注冊(cè)的中斷有什么關(guān)聯(lián),就要了解中斷處理模型了。

4.1 中斷處理模型結(jié)構(gòu)

中斷處理模型如下圖所示,


其中NR_IRQS表示最大的中斷號(hào),在include/asm/arch/irq.h中定義。

irq_desc[]是一個(gè)指向irq_desc_t結(jié)構(gòu)的數(shù)組, irq_desc_t結(jié)構(gòu)是各個(gè)設(shè)備中斷服務(wù)例程的描述符。Irq_desc_t結(jié)構(gòu)體中的成員action指向該中斷號(hào)對(duì)應(yīng)的irqaction結(jié)構(gòu)體鏈表。Irqaction結(jié)構(gòu)體定義在include/linux/interrupt.h中,如下:

truct irqaction {

irq_handler_t handler; //中斷處理函數(shù),注冊(cè)時(shí)提供

unsigned long flags; //中斷標(biāo)志,注冊(cè)時(shí)提供

CPUmask_t mask; //中斷掩碼

const char *name; //中斷名稱

void *dev_id; //設(shè)備id,本文后面部分介紹中斷共享時(shí)會(huì)詳細(xì)說(shuō)明這個(gè)參數(shù)的作用

struct irqaction *next; //如果有中斷共享,則繼續(xù)執(zhí)行,

int irq; //中斷號(hào),注冊(cè)時(shí)提供

struct proc_dir_entry *dir; //指向IRQn相關(guān)的/proc/irq/n目錄的描述符

};

在注冊(cè)中斷號(hào)為irq的中斷服務(wù)程序時(shí),系統(tǒng)會(huì)根據(jù)注冊(cè)參數(shù)封裝相應(yīng)的irqaction結(jié)構(gòu)體。并把中斷號(hào)為irq的irqaction結(jié)構(gòu)體寫(xiě)入irq_desc [irq]->action。這樣就把設(shè)備的中斷請(qǐng)求號(hào)與該設(shè)備的中斷服務(wù)例程irqaction聯(lián)系在一起了。樣當(dāng)CPU接收到中斷請(qǐng)求后,就可以根據(jù)中斷號(hào)通過(guò)irq_desc []找到該設(shè)備的中斷服務(wù)程序。

4.2 中斷共享的處理模型

共享中斷的不同設(shè)備的iqraction結(jié)構(gòu)體都會(huì)添加進(jìn)該中斷號(hào)對(duì)應(yīng)的irq_desc結(jié)構(gòu)體的action成員所指向的irqaction鏈表內(nèi)。當(dāng)內(nèi)核發(fā)生中斷時(shí),它會(huì)依次調(diào)用該鏈表內(nèi)所有的handler函數(shù)。因此,若驅(qū)動(dòng)程序需要使用共享中斷機(jī)制,其中斷處理函數(shù)必須有能力識(shí)別是否是自己的硬件產(chǎn)生了中斷。通常是通過(guò)讀取該硬件設(shè)備提供的中斷flag標(biāo)志位進(jìn)行判斷。也就是說(shuō)不是任何設(shè)備都可以做為中斷共享源的,它必須能夠通過(guò)的它的中斷flag判斷出是否發(fā)生了中斷。

中斷共享的注冊(cè)方法是:

int request_irq(unsigned int irq, irq_handler_t handler,

IRQF_SHARED, const char *devname, void *dev_id)

很多權(quán)威資料中都提到,中斷共享注冊(cè)時(shí)的注冊(cè)函數(shù)中的dev_id參數(shù)是必不可少的,并且dev_id的值必須唯一。那么這里提供唯一的dev_id值的究竟是做什么用的?

根據(jù)我們前面中斷模型的知識(shí),可以看出發(fā)生中斷時(shí),內(nèi)核并不判斷究竟是共享中斷線上的哪個(gè)設(shè)備產(chǎn)生了中斷,它會(huì)循環(huán)執(zhí)行所有該中斷線上注冊(cè)的中斷處理函數(shù)(即irqaction->handler函數(shù))。因此irqaction->handler函數(shù)有責(zé)任識(shí)別出是否是自己的硬件設(shè)備產(chǎn)生了中斷,然后再執(zhí)行該中斷處理函數(shù)。通常是通過(guò)讀取該硬件設(shè)備提供的中斷flag標(biāo)志位進(jìn)行判斷。那既然kernel循環(huán)執(zhí)行該中斷線上注冊(cè)的所有irqaction->handler函數(shù),把識(shí)別究竟是哪個(gè)硬件設(shè)備產(chǎn)生了中斷這件事交給中斷處理函數(shù)本身去做,那request_irq的dev_id參數(shù)究竟是做什么用的?

很多資料中都建議將設(shè)備結(jié)構(gòu)指針作為dev_id參數(shù)。在中斷到來(lái)時(shí),迅速地根據(jù)硬件寄存器中的信息比照傳入的dev_id參數(shù)判斷是否是本設(shè)備的中斷,若不是,應(yīng)迅速返回。這樣的說(shuō)法沒(méi)有問(wèn)題,也是我們編程時(shí)都遵循的方法。但事實(shí)上并不能夠說(shuō)明為什么中斷共享必須要設(shè)置dev_id。

下面解釋一下dev_id參數(shù)為什么必須的,而且是必須唯一的。

當(dāng)調(diào)用free_irq注銷(xiāo)中斷處理函數(shù)時(shí)(通常卸載驅(qū)動(dòng)時(shí)其中斷處理函數(shù)也會(huì)被注銷(xiāo)掉),因?yàn)閐ev_id是唯一的,所以可以通過(guò)它來(lái)判斷從共享中斷線上的多個(gè)中斷處理程序中刪除指定的一個(gè)。如果沒(méi)有這個(gè)參數(shù),那么kernel不可能知道給定的中斷線上到底要?jiǎng)h除哪一個(gè)處理程序。

注銷(xiāo)函數(shù)定義在Kernel/irq/manage.c中定義:

void free_irq(unsigned int irq, void *dev_id)

五、S3C2410子中斷的注冊(cè)的實(shí)現(xiàn)

5.1 S3C2410子中斷注冊(cè)問(wèn)題的提出

參看3.5節(jié)中判斷中斷號(hào)的方法,可以看到只是通過(guò)S3C2410中斷控制器中的INTOFFSET寄存器來(lái)判斷的。對(duì)于INTPND中的EINT4_7、EINT8_23、INT_UART0、INT_ADC 等帶有子中斷的向量,INTOFFSET無(wú)法判斷出具體的中斷號(hào)。平臺(tái)留給我們的注冊(cè)方法如下:

在include/asm/arch/irqs.h中有類(lèi)似如下定義:

/* interrupts generated from the external interrupts sources */

#define IRQ_EINT4 S3C2410_IRQ(32) /* 48 */

#define IRQ_EINT5 S3C2410_IRQ(33)

#define IRQ_EINT6 S3C2410_IRQ(34)

#define IRQ_EINT7 S3C2410_IRQ(35)

#define IRQ_EINT8 S3C2410_IRQ(36)

#define IRQ_EINT9 S3C2410_IRQ(37)

#define IRQ_EINT10 S3C2410_IRQ(38)

#define IRQ_EINT11 S3C2410_IRQ(39)

#define IRQ_EINT12 S3C2410_IRQ(40)

#define IRQ_EINT13 S3C2410_IRQ(41)

#define IRQ_EINT14 S3C2410_IRQ(42)

#define IRQ_EINT15 S3C2410_IRQ(43)

#define IRQ_EINT16 S3C2410_IRQ(44)

#define IRQ_EINT17 S3C2410_IRQ(45)

#define IRQ_EINT18 S3C2410_IRQ(46)

#define IRQ_EINT19 S3C2410_IRQ(47)

#define IRQ_EINT20 S3C2410_IRQ(48) /* 64 */

#define IRQ_EINT21 S3C2410_IRQ(49)

#define IRQ_EINT22 S3C2410_IRQ(50)

#define IRQ_EINT23 S3C2410_IRQ(51)

可以看到平臺(tái)為每種子中斷都定義了中斷號(hào),如果你想實(shí)現(xiàn)EINT10的中斷注冊(cè),直接按照IRQ_EINT10這個(gè)中斷號(hào)注冊(cè)都可以了。那么平臺(tái)代碼是如何實(shí)現(xiàn)這部分中斷注冊(cè)的呢?

5.2 S3C2410子中斷注冊(cè)問(wèn)題的解決

/*arch/arm/plat-s3c24xx/irq.c*/

void __init s3c24xx_init_irq(void)

{……

set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint4t7);

set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8);

set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0);

set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1);

set_irq_chained_handler(IRQ_UART2, s3c_irq_demux_uart2);

set_irq_chained_handler(IRQ_ADCPARENT, s3c_irq_demux_adc);

……

}

平臺(tái)在初始化時(shí)會(huì)調(diào)用到s3c24xx_init_irq,在此函數(shù)中實(shí)現(xiàn)了對(duì)EINT4_7、EINT8_23、INT_UART0、INT_ADC等中斷的注冊(cè)。下面看看這些帶有子中斷的中斷號(hào)對(duì)應(yīng)的處理函數(shù)的內(nèi)容。以IRQ_EINT4t7為例,其它情況類(lèi)似。

/*arch/arm/plat-s3c24xx/irq.c*/

s3c_irq_demux_extint4t7(unsigned int irq,

struct irq_desc *desc)

{

unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);

unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);

eintpnd &= ~eintmsk;

eintpnd &= 0xff; /* only lower irqs */

/* eintpnd中可以有多個(gè)位同時(shí)置1,這一點(diǎn)和intpnd的只能有1個(gè)位置1是不一樣的 */

while (eintpnd) { //循環(huán)執(zhí)行所有置位的子中斷

irq = __ffs(eintpnd); //算出第一個(gè)不為0的位,類(lèi)似arm v5后的clz前導(dǎo)0的作用

eintpnd &= ~(1<<irq);//清除相應(yīng)的位

irq += (IRQ_EINT4 - 4);//算出對(duì)應(yīng)的中斷號(hào)

desc_handle_irq(irq, irq_desc + irq);//執(zhí)行對(duì)應(yīng)子中斷的注冊(cè)函數(shù)

}

}

從上面的函數(shù)可以看出子中斷是如何注冊(cè)及被調(diào)用到的。有人可能會(huì)問(wèn)為何不在include/asm/arch-s3c2410/entry-macro.s 文件中g(shù)et_irqnr_and_base函數(shù)判斷中斷號(hào)時(shí),直接算出對(duì)應(yīng)的子中斷號(hào),就可以直接找到子中斷處理了呢?

原因是: get_irqnr_and_base是平臺(tái)給系統(tǒng)提供的函數(shù),對(duì)于多個(gè)子中斷同時(shí)置位的情況無(wú)法通過(guò)一個(gè)值返回(因?yàn)樽又袛嘀?,如eintpnd是可以多個(gè)位同時(shí)置位的))。而intpnd則沒(méi)有這個(gè)問(wèn)題。

“本文由華清遠(yuǎn)見(jiàn)http://www.embedu.org/index.htm提供”



華清遠(yuǎn)見(jiàn)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉