arm linux内核中ARM中断实现详解_第1页
arm linux内核中ARM中断实现详解_第2页
arm linux内核中ARM中断实现详解_第3页
arm linux内核中ARM中断实现详解_第4页
arm linux内核中ARM中断实现详解_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linuxx-2.66.26内内核中ARRM中断实实现详解(11) 作者者:刘洪涛涛,华清远远见嵌入式式学院金牌牌讲师,AARM AATC授权权培训讲师师。看了一些网网络上关于于linuux中断实实现的文章章,感觉有有一些写的的非常好,在在这里首先先感谢他们们的无私付付出,然后后也想再补补充自己对对一些问题题的理解。先从函数数注册引出出问题吧。一、中断注注册方法在linuux内核中中用于申请请中断的函函数是reequesst_irrq(),函函数原型在在Kernnel/iirq/mmanagge.c中中定义:int rrequeest_iirq(uunsiggned int irq, irqq

2、_hanndlerr_t hhandller, unsiignedd lonng irrqflaags, consst chhar *devnname, voiid *ddev_iid)irq是要要申请的硬硬件中断号号。handller是向向系统注册册的中断处处理函数,是是一个回调调函数,中中断发生时时,系统调调用这个函函数,deev_idd参数将被被传递给它它。irqfllags是是中断处理理的属性,若若设置了IIRQF_DISAABLEDD (老版版本中的SSA_INNTERRRUPT,本本版zhoon已经不不支持了),则则表示中断断处理程序序是快速处处理程序,快快速处理程程序被调用用时屏

3、蔽所所有中断,慢慢速处理程程 序不屏屏蔽;若设设置了IRRQF_SSHAREED (老老版本中的的SA_SSHIRQQ),则表表示多个设设备共享中中断,若设设置了IRRQF_SSAMPLLE_RAANDOMM(老版本本中的 SSA_SAAMPLEE_RANNDOM),表表示对系统统熵有贡献献,对系统统获取随机机数有好处处。(这几几个flaag是可以以通过或的的方式同时时使用的)dev_iid在中断断共享时会会用到,一一般设置为为这个设备备的设备结结构体或者者NULLL。devnaame设置置中断名称称,在caat /pproc/inteerruppts中可可以看到此此名称。requeest_i

4、irq()返回0表表示成功,返返回-INNVAL表表示中断号号无效或处处理函数指指针为NUULL,返返回-EBBUSY表表示中断已已经被占用用且不能共共享。关于中断注注册的例子子,大家可可在内核中中搜索下rrequeest_iirq。在编写驱动动的过程中中,比较容容易产生疑疑惑的地方方是:1、中断向向量表在什什么位置?是如何建建立的? 22、从中断断开始,系系统是怎样样执行到我我自己注册册的函数的的? 3、中中断号是如如何确定的的?对于硬硬件上有子子中断的中中断号如何何确定? 44、中断共共享是怎么么回事,ddev_iid的作用用是?本文以2.6.266内核和SS3C24110处理器器为例,为

5、为大家讲解解这几个问问题。二、异常向向量表的建建立在ARM V4及VV4T以后后的大部分分处理器中中,中断向向量表的位位置可以有有两个位置置:一个是是0,另一一个是0 xxfffff00000。可以通通过CP115协处理理器c1寄寄存器中VV位(biit133)控制制。V和中中断向量表表的对应关关系如下:V=0 00 x00000000000 xx00000001CC V=1 0 xfffff0000000 xfffff0011Carch/arm/mm/pproc-arm9920.SS中.secttion .teext.iinit, #aallocc, #eexeciinstrr _arrm9

6、200_settup: orrr r0, r0, #0 x22100 .1. .11 .111 .1/bitt13=11 中断向向量表基址址为0 xFFFFF00000。R0的值值将被付给给CP155的C1.在linuux中,向向量表建立立的函数为为:init/mainn.c-starrt_keernell()-trapp_iniit()void _innit ttrap_initt(voiid) unssigneed loong vvectoors = CONNFIG_VECTTORS_BASEE; meemcpyy(vooid *)vecctorss, _vecttors_starrt,

7、_vecctorss_endd - _vecctorss_staart); memccpy(voidd *)vvectoors + 0 x2200, _sttubs_starrt, _stuubs_eend - _sstubss_staart); . 在2.6.26内核核中CONNFIG_VECTTORS_BASEE最初是在在各个平台台的配置文文件中设定定的,如:arch/arm/conffigs/s3c24110_deefconnfig中中CONFIIG_VEECTORRS_BAASE=00 xfffff00000_vecctorss_endd 至 _vecctorss_staart之间间为

8、异常向向量表。位于arcch/arrm/keernell/enttry-aarmv.S.globbl _vecttors_starrt_vvectoors_sstartt: swii SYSS_ERRROR0: b veectorr_undd + sstubss_offfset /复位位异常: lldr ppc, .LCvsswi + stuubs_ooffseet /未未定义指令令异常: bb vecctor_pabtt + sstubss_offfset /软件中中断异常: b veectorr_dabbt + stubbs_offfsett /数据据异常: bb vecctor_addr

9、rexcpptn + stuubs_ooffseet /保保留: b vecttor_iirq + stuubs_ooffseet /普普通中断异异常: b vecttor_ffiq + stuubs_ooffseet /快快速中断异异常: .gglobll _vvectoors_eend:_vecctorss_endd:_stuubs_eend 至至 _sstubss_staart之间间是异常处处理的位置置。也位于于文件arrch/aarm/kkerneel/enntry-armvv.S中。vecttor_uund、vvectoor_paabt、vvectoor_irrq、veectorr_

10、fiqq都在它们们中间。stubss_offfset值值如下:.equ stubbs_offfsett, _vecttors_starrt + 0 x2000 - _sttubs_starrtstubss_offfset是是如何确定定的呢?(引引用网络上上的一段比比较详细的的解释)当汇编器看看到B指令令后会把要要跳转的标标签转化为为相对于当当前PC的的偏移量(32M)写写入指令码码。从上面面的代码可可以看到中中断向量表表和stuubs都发发生了 代代码搬移,所所以如果中中断向量表表中仍然写写成b vvectoor_irrq,那么么实际执行行的时候就就无法跳转转到搬移后后的vecctor_irq

11、处处,因为指指令码里写写的是原来来的偏移量量,所以需需要把指令令码中的偏偏移量写 成搬移后后的。我们们把搬移前前的中断向向量表中的的irq入入口地址记记irq_PC,它它在中断向向量表的偏偏移量就是是irq_PC-vvectoors_sstartt, veectorr_irqq在stuubs中的的偏移量是是vecttor_iirq-sstubss_staart,这这两个偏移移量在搬移移前后是不不变的。搬搬移后 vvectoors_sstartt在0 xfffff00000处处,而sttubs_starrt在0 xxfffff02000处,所以以搬移后的的vecttor_iirq相对对于中断 向

12、量中的的中断入口口地址的偏偏移量就是是,2000+vecctor_irq在在stubbs中的偏偏移量再减减去中断入入口在向量量表中的偏偏移量,即即200+ vecctor_irq-stubbs_sttart-irq_PC+vvectoors_sstartt = (vecttor_iirq-iirq_PPC) + vecctorss_staart+2200-sstubss_staart,对对于括号内内的值实际际上就是中中断向量表表中写的vvectoor_irrq,减去去irq_PC是由由汇 编器器完成的,而而后面的 vecttors_starrt+2000-sttubs_starrt就应该该是s

13、tuubs_ooffseet,实际际上在enntry-armvv.S中也也是这样定定义的。三、中断处处理过程 这一节将以以S3C24110为例,描描述linnux-22.6.226内核中中,从中断断开始,中中断是如何何一步一步步执行到我我们注册函函数的。 3.1 中中断向量表表 arccharrmkeernellenttry-aarmv.S_vecctorss_staart:swi SYS_ERROOR0bb vecttor_uund + stuubs_ooffseetlddr pcc, .LLCvswwi + stubbs_offfsettb veectorr_pabbt + stubbs_

14、offfsettb veectorr_dabbt + stubbs_offfsettb veectorr_adddrexccptn + sttubs_offssetbb vecttor_iirq + stuubs_ooffseet bb vecttor_ffiq + stuubs_ooffseet.gglobll _vecctorss_endd_veectorrs_ennd:中断发生后后,跳转到到b veectorr_irqq + sstubss_offfset的的位置执行行。注意现现在的向量量表的初始始位置是00 xfffff00000。 3.2 中中断跳转的的入口位置置 arccharrm

15、keernellenttry-aarmv.S.gllobl _stubbs_sttart_stuubs_sstartt: /* * IInterrruptt disspatccher*/vvectoor_sttub irrq, IIRQ_MMODE, 4 IRQ_MODEE在inccludeeasmmptrrace.h中定义义:0 x112.llong _irqq_usrr 00 (USSR_266 / UUSR_332).longg _irrq_innvaliid 1 (FFIQ_226 / FIQ_32).lonng _iirq_iinvallid 2 (IRQ_26 / IRQQ_32)

16、.loong _irq_svc 3 (SVCC_26 / SVVC_322).llong _irqq_invvalidd 44.loong _irq_invaalid 5.lonng _iirq_iinvallid 6.longg _irrq_innvaliid 7.llong _irqq_invvalidd 88.loong _irq_invaalid 9.lonng _irq_invaalid a.lonng _irq_invaalid b.lonng _irq_invaalid c.lonng _irq_invaalid d.lonng _irq_invaalid e.lonng _ir

17、q_invaalid f上面代码中中vecttor_sstub宏宏的定义为为: .macrro veectorr_stuub, nname, modde, ccorreectioon=0.aliign 55vecttor_namee:.iif ccorreectioonsuub lrr, lrr, #corrrectiion.endiif Saave rr0, llr_ (pparennt PCC) annd sppsr_ (paarentt CPSSR)stmmia ssp, r0, lr saave rr0, llrmrrs lrr, sppsrsstr llr, sp, #8 saave

18、 sspsr Preppare for SVC332 moode. IRQss remmain disaabledd.mrs r0, cpsrreorr r0, r0, #(modee SSVC_MMODE)msrr spssr_cxxsf, r0 为后面进进入svcc模式做准准备 tthe bbrancch taable mustt immmediaatelyy folllow thiss codde andd lr, lr, #0 xx0f 进进入中断前前的modde的后44位 #deffine USR_MODEE 0 x0000000010#deefinee FIQQ_MODDE 0 x

19、x0000000111#ddefinne IRRQ_MOODE 00 x0000000112#defiine SSVC_MMODE 0 x0000000013#deffine ABT_MODEE 0 x0000000017#deefinee UNDD_MODDE 0 xx00000001bb#ddefinne SYYSTEMM_MODDE 0 xx00000001ffmovv r0, spldr lr, pc, lr, lsll #2 如果果进入中断断前是ussr,则取取出PC+4*0的的内容,即即_irrq_ussr如如果进入中中断前是ssvc,则则取出PCC+4*33的内容,即即_irrq

20、_svvcmoovs ppc, llr 当指令的的目标寄存存器是PCC,且指令令以S结束束,则它会会把 sspsr的的值恢复给给cpsrr braanch to hhandller iin SVVC moode.endmm.gllobl _sttubs_starrt_sttubs_starrt:/* Inteerruppt diispattcherr*/veectorr_stuub irrq, IIRQ_MMODE, 4.longg _iirq_uusr 0 (USR_26 / USRR_32).loong _irqq_invvalidd 11 (FIIQ_266 / FFIQ_332).lo

21、ngg _iirq_iinvallid 2 (IRQ_26 / IRQQ_32).loong _irqq_svcc 33 (SVVC_266 / SSVC_332)用“irqq, IRRQ_MOODE, 4”代替宏宏vecttor_sstub中中的“naame, modee, coorrecctionn”,找到到了我们中中断处理的的入口位置置为vecctor_irq(宏宏里面的vvectoor_nname)。 从上面面代码中的的注释可以以看出,根根据进入中中断前的工工作模式不不同,程序序下一步将将跳转到_irq_usr 、或_irq_svc等等位置。我我们先选择择_irrq_ussr作为下下一

22、步跟踪踪的目标。 3.3 _irqq_usrr的实现 archharmmkerrnelentrry-arrmv.SS_irqq_usrr:ussr_enntry 后面有有解释 kuseer_cmmpxchhg_chheck#iifdeff CONNFIG_TRACCE_IRRQFLAAGSbbl trrace_harddirqss_offf#endiifgeet_thhreadd_inffo tssk 获获取当前进进程的进程程描述符中中的成员变变量thrread_infoo的地址,并并将该地址址保存到寄寄存器tssk等于rr9(在eentryy-heaader.S中定义义)#ifddef CC

23、ONFIIG_PRREEMPPT/如如果定义了了抢占,增增加抢占数数值 lldr rr8, tsk, #TII_PREEEMPTT get preeempt counntaddd r77, r88, #11 iincreementt itstr r7, tskk, #TTI_PRREEMPPT#enndifirq_hhandller 中断处理理,我们最最关心的地地方,3.4节有实实现过程。 #ifdeef COONFIGG_PREEEMPTTldrr r0, tssk, #TI_PPREEMMPTstr r8, tskk, #TTI_PRREEMPPTtteq rr0, rr7sttrne r

24、0, r0, -r00#endiif#ifdeef COONFIGG_TRAACE_IIRQFLLAGSbl ttracee_harrdirqqs_onn#endiifmov wwhy, #0b rett_to_userr 中断断处理完成成,返回中中断产生的的位置,33.7节有有实现过程程 上面代码中中的usrr_enttry是一一个宏,主主要实现了了将usrr模式下的的寄存器、中断返回回地址保存存到堆栈中中。.macrro ussr_enntrysuub spp, spp, #SS_FRAAME_SSIZE S_FRAMME_SIIZE的值值在arccharrmkeernellasmm-of

25、ffsetss.c 中中定义 DDEFINNE(S_FRAMME_SIIZE, sizeeof(sstrucct ptt_reggs);实际上等等于72stmiib spp, rr1 - r12ldmmia rr0, r1 - r3addd r0, sp, #S_PC herre foor innterllock avoiidanccemoov r44, #-1 str r1, sp ssave the reaal rr0 coopiedd ffrom the exceeptioon sttack We aare nnow rreadyy to filll in the remaaininng

26、 bllankss on the stacck: rr2 - lr_, alreeady fixeed upp forr corrrectt retturn/resttart r33 - sspsr_ r44 - oorig_r0 (see pt_rregs defiinitiion iin pttracee.h) Alsoo, seeparaatelyy savve spp_usrr andd lr_usrsttmia r0, r2 - r44sttmdb r0, sp, lr Enaable the aliggnmennt trrap wwhilee in kernnel mmodeali

27、ignmeent_ttrap r0 Cleaar FPP to markk thee firrst sstackk fraamezerro_fpp.enndm上面的这段段代码主要要在填充结结构体ptt_reggs ,这这里提到的的struuct ppt_reegs,在在incllude/asm/ptraace.hh中定义。此时spp指向sttructt pt_regss。 strruct pt_rregs llong ureggs188;#deffine ARM_cpsrr ureegs116#deefinee ARMM_pc ureggs155#deffine ARM_lr uuregss1

28、4#defiine AARM_ssp urregs13#ddefinne ARRM_ipp ureegs112#deefinee ARMM_fp ureggs111#deffine ARM_r10 ureggs100#deffine ARM_r9 uuregss9#ddefinne ARRM_r88 ureegs88#deffine ARM_r7 uuregss7#ddefinne ARRM_r66 ureegs66#deffine ARM_r5 uuregss5#ddefinne ARRM_r44 ureegs44#deffine ARM_r3 uuregss3#ddefinne ARRM_

29、r22 ureegs22#deffine ARM_r1 uuregss1#ddefinne ARRM_r00 ureegs00#deffine ARM_ORIGG_r0 ureggs1773.4 iirq_hhandller的实实现过程,archharmmkerrnelentrry-arrmv.SS.maacro irq_handdlergett_irqqnr_ppreammble r5, lr在inncludde/assm/arrch-ss3c24110/enntry-macrro.s中中定义了宏宏get_irqnnr_prreambble为空空操作,什什么都不做做1: gett_irqqn

30、r_aand_bbase r0, r6, r5, lr 判断中断断号,通过过R0返回回,3.55节有实现现过程 movvne rr1, ssp routtine callled wwith r0 = irqq nummber, r1 = sttructt pt_regss *aadrnee lr, 1bbnee asmm_do_IRQ 进入中中断处理。 .enndm3.5 gget_iirqnrr_andd_basse中断号号判断过程程,inccludee/asmm/arcch-s33c24110/enntry-macrro.s.macrro geet_irrqnr_and_basee, ir

31、rqnr, irqqstatt, baase, tmpmovv baase, #S3CC24XXX_VA_IRQ try the inteerruppt offfsett reggisteer, ssincee it is tthereelddr iirqsttat, bbase, #INNTPNDD teq irqqstatt, #00beeq 10002fldrr irrqnr, basee, #IINTOFFFSETT 通过判断断INTOOFFSEET寄存器器得到中断断位置 moov ttmp, #1tst irqqstatt, ttmp, lsl irqqnrbne 10011f th

32、he nuumberr speecifiied iis noot a valiid irrq, sso trry annd woork iit ouut foor ouursellvesmovv irrqnr, #0 sstartt herre woork oout wwhichh irqq (iff anyy) wee gottmoovs tmp, irrqstaat, llsl#116aaddeqq irrqnr, irrqnr, #166mooveq irqqstatt, iirqsttat, lsr#16tst irqqstatt, #00 xffadddeq irqnnr, irqn

33、nr, #8mmoveqq irrqstaat, irqsstat, lsrr#8tst irqqstatt, #00 xfaddeeq iirqnrr, iirqnrr, #44mooveq irqqstatt, iirqsttat, lsr#4ttst irqsstat, #0 xx3aaddeqq irrqnr, irrqnr, #2movveq irqsstat, irrqstaat, llsr#22tsst iirqsttat, #0 x11adddeq irqqnr, irqqnr, #1 wwe haave tthe vvaluee10001:addds irqnnr, irqn

34、nr, #IRQ_EINTT0 加加上中断号号的基准 数值,得得到最终的的中断号,注注意:此时时没有考虑虑子中断的的具体情况况,(子中中断的问题题后面会有有讲解)。IRQ_EINTT0在inncludde/assm/arrch- s3c24110/irrqs.hh中定义.从这里可可以看出,中中断号的具具体值是有有平台相关关的代码决决定的,和和硬件中断断挂起寄存存器中的中中断号是不不等的。 1002: exiit heere, Z fllag uunsett if IRQ.enndm3.6 aasm_ddo_IRRQ实现过过程,arrch/aarm/kkerneel/irrq.c asmliin

35、kagge vooid _excceptiion aasm_ddo_IRRQ(unnsignned iint iirq, struuct ppt_reegs *regss)struuct ppt_reegs *old_regss = sset_iirq_rregs(regss);struuct iirq_ddesc *dessc = irq_descc + iirq;/根据中中断号找到到对应的iirq_ddesc/* SSome harddwaree givves rrandoomly wronng innterrruptss. Raatherr* thann craashinng, ddo

36、soomethhing senssiblee.*/iif (iirq = NRR_IRQQS)descc = &bad_irq_descc;iirq_eenterr();/没做什什么特别的的工作,可可以跳过不不看 descc_hanndle_irq(irq, dessc);/ 根据据中断号和和descc进入中断断处理 /* AT911 speecifiic woorkarroundd */irqq_finnish(irq);iirq_eexit();set_irq_regss(oldd_reggs);statiic innlinee voiid deesc_hhandlle_irrq(unns

37、ignned iint iirq, struuct iirq_ddesc *dessc)dessc-hhandlle_irrq(irrq, ddesc);/中中断处理 上述asmmlinkkage voidd _eexcepptionn asmm_do_IRQ(unsiignedd intt irqq, sttructt pt_regss *reegs)使使用了assmlinnkagee标识。那那么这个标标识的含义义如何理解解呢? 该该符号定义义在kerrnel/incllude/linuux/liinkagge.h中中,如下所所示: #incllude /各个具具体处理器器在此文件件中定义a

38、asmliinkagge#iffdef _cppluspplus#defiine CCPP_AASMLIINKAGGE exxternn C#elsse#deefinee CPPP_ASMMLINKKAGE#endiif#ifnddef aasmliinkagge/如如果以前没没有定义aasmliinkagge#deefinee asmmlinkkage CPP_ASMLLINKAAGE#eendiff对于ARMM处理器的的,没没有定义aasmliinkagge,所以以没有意义义(不要以以为参数是是从堆栈传传递的,对对于ARMM平台来说说还是符合合ATPCCS过程调调用标准,通通过寄存器器传递

39、的)。 但对于X886处理器器的中是这样样定义的:#defiine aasmliinkagge CPPP_ASSMLINNKAGEE _aattriibutee_(regpparm(0)表示函数的的参数传递递是通过堆堆栈完成的的。3.7 描描述3.33节中的rret_tto_usser 中中断返回过过程,/aarch/arm/kernnel/eentryy-commmon.SENTRYY(rett_to_userr)rett_sloow_syyscalll:disaable_irq diisablle innterrruptsslddr r11, ttsk, #TI_FLAGGStst r1,

40、 #_TIIF_WOORK_MMASKbnee worrk_peendinngno_workk_penndingg:/* peerforrm arrchittectuure sspeciific actiions befoore uuser retuurn */aarch_ret_to_uuser r1, lr sslow_resttore_userr_reggslldr rr1, sp, #S_PPSR geet caallinng cppsrldr lr, sp, #S_PC! gget ppcmmsr sspsr_cxsff, r11 ssave in sspsr_svcldmmdb s

41、sp, r0 - lr get callling r0 - lrmovv r0, r0addd sp, sp, #S_FRAMME_SIIZE - S_PPCmmovs pc, lr retturn & moove sspsr_svc intoo cpssr第三章主要要跟踪了从从中断发生生到调用到到对应中断断号的deesc-handdle_iirq(iirq, descc)中断函函数的过程程。后面的的章节还会会继续讲解解后面的内内容。四、中断处处理模型 要想弄清楚楚descc-haandlee_irqq(irqq, deesc)和和我们注册册的中断有有什么关联联,就要了了解中断处处理模型了了。

42、 4.1 中中断处理模模型结构 中断处理模模型如下图图所示,其中NR_IRQSS表示最大大的中断号号,在inncludde/assm/arrch/iirq.hh中定义。 irq_ddesc是一个个指向irrq_deesc_tt结构的数数组, iirq_ddesc_t结构是是各个设备备中断服务务例程的描描述符。IIrq_ddesc_t结构体体中的成员员actiion指向向该中断号号对应的iirqacctionn结构体 链表。IIrqacctionn结构体定定义在inncludde/liinux/inteerruppt.h中中,如下:tructt irqqactiion irq_handdler_

43、t haandleer; /中断处处理函数,注注册时提供供unsiignedd lonng fllags; /中中断标志,注注册时提供供cpummask_t maask; /中断断掩码coonst charr *naame; /中断断名称vooid *dev_id; /设备备id,本本文后面部部分介绍中中断共享时时会详细说说明这个参参数的作用用struuct iirqacctionn *neext; /如果果有中断共共享,则继继续执行,int irq; /中断号,注册时提供struct proc_dir_entry *dir; /指向IRQn相关的/proc/irq/n目录的描述符;在注册中断

44、断号为irrq的中断断服务程序序时,系统统会根据注注册参数封封装相应的的irqaactioon结构体体。并把中中 断号为为irq的的irqaactioon结构体体写入irrq_deesc irq-acctionn。这样就就把设备的的中断请求求号与该设设备的中断断服务例程程irqaactioon联系在在一起了。样当CPPU接收到到中断请求求后,就可可 以根据据中断号通通过irqq_dessc 找到该设设备的中断断服务程序序。 4.2 中中断共享的的处理模型型共享中断的的不同设备备的iqrractiion结构构体都会添添加进该中中断号对应应的irqq_dessc结构体体的 acctionn成员所指

45、指向的irrqacttion链链表内。当当内核发生生中断时,它它会依次调调用该链表表内所有的的handdler函函数。因此此,若驱动动程序需要要使用共享享中 断机机制,其中中断处理函函数必须有有能力识别别是否是自自己的硬件件产生了中中断。通常常是通过读读取该硬件件设备提供供的中断fflag标标志位进行行判断。也也就是说不不是任何设设备都 可可以做为中中断共享源源的,它必必须能够通通过的它的的中断fllag判断断出是否发发生了中断断。中断共共享的注册册方法是:int rrequeest_iirq(uunsiggned int irq, irqq_hanndlerr_t hhandller,IIR

46、QF_SHARRED, consst chhar *devnname, voiid *ddev_iid) 很多权威资资料中都提提到,中断断共享注册册时的注册册函数中的的dev_id参数数是必不可可少的,并并且devv_id的的值必须唯唯一。那么么这里提供供唯一的ddev_iid值的究究竟是做什什么用的? 根据我们前前面中断模模型的知识识,可以看看出发生中中断时,内内核并不判判断究竟是是共享中断断线上的哪哪个设备产产生了中断断,它会循循环 执行行所有该中中断线上注注册的中断断处理函数数(即irrqacttion-hanndlerr函数)。因此irrqacttion-hanndlerr函数有责责

47、任识别别出是否是是自己的硬硬件设备产产生了中断断,然后再再执行该中中断处理函函数。通常常是通过读读取该硬件件设备提供供的中断fflag标标志位进行行判断。那那既然keernell循 环执执行该中断断线上注册册的所有iirqacctionn-haandleer函数,把把识别究竟竟是哪个硬硬件设备产产生了中断断这件事交交给中断处处理函数本本身去做,那那 reqquestt_irqq的devv_id参参数究竟是是做什么用用的? 很多资料中中都建议将将设备结构构指针作为为dev_id参数数。在中断断到来时,迅迅速地根据据硬件寄存存器中的信信息比照传传入的 ddev_iid参数判判断是否是是本设备的的中

48、断,若若不是,应应迅速返回回。这样的的说法没有有问题,也也是我们编编程时都遵遵循的方法法。但事实实上并不能能够说明为为什么中断断共享必 须要设置置dev_id。 下面解释一一下devv_id参参数为什么么必须的,而而且是必须须唯一的。 当调用frree_iirq注销销中断处理理函数时(通通常卸载驱驱动时其中中断处理函函数也会被被注销掉),因因为devv_id是是唯一 的的,所以可可以通过它它来判断从从共享中断断线上的多多个中断处处理程序中中删除指定定的一个。如果没有有这个参数数,那么kkerneel不可能能知道给定定的中断线线上到底要要删除哪 一个处理理程序。注销函数定定义在Keernell/

49、irqq/mannage.c中定义义: vooid ffree_irq(unsiignedd intt irqq, vooid *dev_id)五、S3CC24100子中断的的注册的实实现 5.1 SS3C24410子中中断注册问问题的提出出参看3.55节中判断断中断号的的方法,可可以看到只只是通过SS3C24410中断断控制器中中的INTTOFFSSET寄存存器来判断断的。对于于INTPPND中的的EINTT4_7、EINTT8_233、INTT_UARRT0、IINT_AADC 等等带有子中中断的向量量,INTTOFFSSET无法法判断出具具体的中断断号。平台台留给我们们的注册方方法如下:

50、 在incllude/asm/archh/irqqs.h中中有类似如如下定义:/* innterrruptss genneratted ffrom the exteernall intterruupts sourrces */#ddefinne IRRQ_EIINT4 S3C22410_IRQ(32) /* 448 */#deffine IRQ_EINTT5 S33C24110_IRRQ(333)#deefinee IRQQ_EINNT6 SS3C24410_IIRQ(334)#ddefinne IRRQ_EIINT7 S3C22410_IRQ(35)#defiine IIRQ_EEINT88

51、 S3CC24100_IRQQ(36)#deffine IRQ_EINTT9 S33C24110_IRRQ(377)#deefinee IRQQ_EINNT10 S3C22410_IRQ(38)#defiine IIRQ_EEINT111 S33C24110_IRRQ(399)#deefinee IRQQ_EINNT12 S3C22410_IRQ(40)#defiine IIRQ_EEINT113 S33C24110_IRRQ(411)#deefinee IRQQ_EINNT14 S3C22410_IRQ(42)#defiine IIRQ_EEINT115 S33C24110_IRRQ(433)#deefinee IRQQ_EINNT16 S3C22410_IRQ(44)#defiine IIRQ_EEINT117 S33C24110_IRRQ(455)#deefinee IRQQ_EINNT18 S3C22410_IRQ(46)#defiine IIRQ_EEINT119 S33C24110_IRRQ(477)#deefinee IRQQ_EINNT20 S3C22410_IRQ(48) /* 664 */#deffine IRQ_EINTT21 SS3C24410_IIRQ(449)#ddefinne IRRQ_EIINT222 S3C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论