資源描述:
《arm linux對(duì)中斷處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、ARMLinux對(duì)中斷的處理--中斷管理系統(tǒng)的初始化8ARMLinux對(duì)中斷的處理--中斷注冊(cè)方法18ARMLinux對(duì)中斷的處理--中斷處理21ARMLinux對(duì)中斷的處理--內(nèi)核模式下的中斷處理23ARMLinux對(duì)中斷的處理--用戶模式下的中斷處理40ARMLinux對(duì)中斷的處理--相關(guān)數(shù)據(jù)結(jié)構(gòu)中斷處理依賴(lài)于中斷的類(lèi)型:I/O中斷、時(shí)鐘中斷和處理器間中斷。不管引起中斷的電路的種類(lèi)如何,所有I/O中斷處理程序都執(zhí)行四個(gè)相同的基本操作:在內(nèi)核態(tài)堆棧中保存IRQ的值和寄存器的內(nèi)容。為正在給IRQ線服務(wù)的PIC發(fā)送一個(gè)應(yīng)答,這將允許PIC進(jìn)一步發(fā)出中斷。執(zhí)行共享這個(gè)IRQ的所有設(shè)備
2、的中斷服務(wù)例程。與中斷處理相關(guān)的數(shù)據(jù)結(jié)構(gòu)Linux系統(tǒng)里每個(gè)中斷通過(guò)一個(gè)稱(chēng)為中斷描述符的結(jié)構(gòu)irq_desc來(lái)管理,各中斷的信息都在這個(gè)結(jié)構(gòu)中得以體現(xiàn)。irq_desc結(jié)構(gòu)體在include/irq.h文件中定義:structirq_desc{??unsignedint???irq;??structtimer_rand_state*timer_rand_state;??unsignedint???????????*kstat_irqs;#ifdefCONFIG_INTR_REMAP??structirq_2_iommu?????*irq_2_iommu;#endif??irq_f
3、low_handler_thandle_irq;??structirq_chip???*chip;??structmsi_desc???*msi_desc;??void???????*handler_data;??void???????*chip_data;??structirqaction??*action;/*IRQactionlist*/??unsignedint???status;????/*IRQstatus*/???unsignedint???depth;??/*nestedirqdisables*/??unsignedint???wake_depth;/*neste
4、dwakeenables*/??unsignedint???irq_count;?/*FordetectingbrokenIRQs*/??unsignedlong?????last_unhandled;/*Agingtimerforunhandledcount*/??unsignedint???irqs_unhandled;??spinlock_t?????lock;#ifdefCONFIG_SMP??cpumask_var_t?????affinity;??unsignedint???node;#ifdefCONFIG_GENERIC_PENDING_IRQ??cpumask_
5、var_t?????pending_mask;#endif#endif??atomic_t???threads_active;??wait_queue_head_t??????wait_for_threads;#ifdefCONFIG_PROC_FS??structproc_dir_entry*dir;#endif??constchar?????*name;}____cacheline_internodealigned_in_smp;irq_desc結(jié)構(gòu)體(中斷描述符)中各個(gè)字段說(shuō)明:irq:??中斷描述符的中斷號(hào)timer_rand_state:pointertotimerra
6、ndstatestructkstat_irqs:??irqstatspercpuirq_2_iommu:?iommuwiththisirqhandle_irq:??高層的irq時(shí)間處理程序(如果為NULL,則默認(rèn)調(diào)用__do_IRQ())chip:?底層的中斷硬件訪問(wèn),指向PIC對(duì)象(irq_chip結(jié)構(gòu)),它服務(wù)于IRQ線,Linux中斷管理系統(tǒng)使用該成員來(lái)進(jìn)行中斷控制器的訪問(wèn)。msi_desc:?MSIdescriptorhandler_data:irq_chip方法使用的per-IRQ數(shù)據(jù)chip_data:???chip方法使用的特定平臺(tái)的per-chip私有數(shù)據(jù),以允許
7、共享chip的實(shí)現(xiàn)action:???標(biāo)識(shí)當(dāng)出現(xiàn)IRQ時(shí)要調(diào)用的中斷服務(wù)例程。該字段指向IRQ的irqaction鏈表的第一個(gè)元素。我們用request_irq()注冊(cè)的中斷處理方法,會(huì)被用來(lái)創(chuàng)建相關(guān)的irqaction結(jié)構(gòu)體,對(duì)于同一個(gè)中斷號(hào)注冊(cè)的各個(gè)中斷方法會(huì)被鏈接在該中斷號(hào)的中斷描述符的該字段上。status:???描述IRQ線狀態(tài)的一組標(biāo)志depth:disable-depth用于嵌套的irq_disable()調(diào)用,如果IRQ線被激活,則顯示0,如果IRQ線被禁止了不止