freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

armlinux內(nèi)核中arm中斷實(shí)現(xiàn)詳解-資料下載頁

2025-06-25 06:02本頁面
  

【正文】 e_irq(irq, desc)和我們注冊(cè)的中斷有什么關(guān)聯(lián),就要了解中斷處理模型了。 中斷處理模型結(jié)構(gòu) 中斷處理模型如下圖所示,其中NR_IRQS表示最大的中斷號(hào),在include/asm/arch/。 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/,如下: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ì)說明這個(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)體寫入irq_desc [irq]action。這樣就把設(shè)備的中斷請(qǐng)求號(hào)與該設(shè)備的中斷服務(wù)例程irqaction聯(lián)系在一起了。樣當(dāng)CPU接收到中斷請(qǐng)求后,就可 以根據(jù)中斷號(hào)通過irq_desc []找到該設(shè)備的中斷服務(wù)程序。 中斷共享的處理模型共享中斷的不同設(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)生了中斷。通常是通過讀取該硬件設(shè)備提供的中斷flag標(biāo)志位進(jìn)行判斷。也就是說不是任何設(shè)備都 可以做為中斷共享源的,它必須能夠通過的它的中斷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ù)(即irqactionhandler函數(shù))。因此irqactionhandler函數(shù)有責(zé) 任識(shí)別出是否是自己的硬件設(shè)備產(chǎn)生了中斷,然后再執(zhí)行該中斷處理函數(shù)。通常是通過讀取該硬件設(shè)備提供的中斷flag標(biāo)志位進(jìn)行判斷。那既然kernel循 環(huán)執(zhí)行該中斷線上注冊(cè)的所有irqactionhandler函數(shù),把識(shí)別究竟是哪個(gè)硬件設(shè)備產(chǎn)生了中斷這件事交給中斷處理函數(shù)本身去做,那 request_irq的dev_id參數(shù)究竟是做什么用的? 很多資料中都建議將設(shè)備結(jié)構(gòu)指針作為dev_id參數(shù)。在中斷到來時(shí),迅速地根據(jù)硬件寄存器中的信息比照傳入的 dev_id參數(shù)判斷是否是本設(shè)備的中斷,若不是,應(yīng)迅速返回。這樣的說法沒有問題,也是我們編程時(shí)都遵循的方法。但事實(shí)上并不能夠說明為什么中斷共享必 須要設(shè)置dev_id。 下面解釋一下dev_id參數(shù)為什么必須的,而且是必須唯一的。 當(dāng)調(diào)用free_irq注銷中斷處理函數(shù)時(shí)(通常卸載驅(qū)動(dòng)時(shí)其中斷處理函數(shù)也會(huì)被注銷掉),因?yàn)閐ev_id是唯一 的,所以可以通過它來判斷從共享中斷線上的多個(gè)中斷處理程序中刪除指定的一個(gè)。如果沒有這個(gè)參數(shù),那么kernel不可能知道給定的中斷線上到底要?jiǎng)h除哪 一個(gè)處理程序。注銷函數(shù)定義在Kernel/irq/: void free_irq(unsigned int irq, void *dev_id)五、S3C2410子中斷的注冊(cè)的實(shí)現(xiàn) S3C2410子中斷注冊(cè)問題的提出,可以看到只是通過S3C2410中斷控制器中的INTOFFSET寄存器來判斷的。對(duì)于INTPND中的EINT4_EINT8_2INT_UART0、INT_ADC 等帶有子中斷的向量,INTOFFSET無法判斷出具體的中斷號(hào)。平臺(tái)留給我們的注冊(cè)方法如下: 在include/asm/arch/:/* 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è)的呢? S3C2410子中斷注冊(cè)問題的解決 /*arch/arm/plats3c24xx/*/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_EINT8_2INT_UART0、INT_ADC等中斷的注冊(cè)。下面看看這些帶有子中斷的中斷號(hào)對(duì)應(yīng)的處理函數(shù)的內(nèi)容。以IRQ_EINT4t7為例,其它情況類似。 /*arch/arm/plats3c24xx/*/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 amp。= ~eintmsk。eintpnd amp。= 0xff。 /* only lower irqs *//* eintpnd中可以有多個(gè)位同時(shí)置1,這一點(diǎn)和intpnd的只能有1個(gè)位置1是不一樣的 */while (eintpnd) { //循環(huán)執(zhí)行所有置位的子中斷 irq = __ffs(eintpnd)。 //算出第一個(gè)不為0的位,類似arm v5后的clz前導(dǎo)0的作用 eintpnd amp。= ~(1irq)。//清除相應(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ì)問為何不在 include/asm/archs3c2410/ 文件中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í)置位的情況無法通過一個(gè)值返回(因?yàn)樽又袛嘀校鏴intpnd是可以多個(gè)位同時(shí)置位的))。而intpnd則沒有這個(gè)問題。15 / 1
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1