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

下载本文档

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

文档简介

1、拌linux挨-癌2.6.2版6败内核中AR暗M中断实现绊详解(1)班 巴作者:刘洪伴涛,华清远敖见嵌入式学半院金牌讲师芭,ARM 艾ATC授权稗培训讲师。澳看了一些网埃络上关于l俺inux中瓣断实现的文安章,感觉有皑一些写的非碍常好,在这澳里首先感谢般他们的无私扳付出,然后绊也想再补充捌自己对一些熬问题的理解吧。先从函数艾注册引出问邦题吧。耙一、中断注扳册方法扳在linu鞍x内核中用扳于申请中断懊的函数是r半eques暗t_irq熬(),函数案原型在Ke扒rnel/班irq/m坝anage摆.c中定义胺:奥K。拌int r百eques癌t_irq哀(unsi阿gned 敖int i盎rq,

2、i隘rq_ha稗n白dler_暗t han瓣dler,扳半拔霸白 暗unsig斑ned l阿ong i肮rqfla办gs, c爸onst 百char 氨*devn搬ame, 哎void 败*dev_巴id)案b。邦irq是要坝申请的硬件傲中断号。啊handl耙er是向系傲统注册的中盎断处理函数拜,是一个回伴调函数,中耙断发生时,坝系统调用这背个函数,d叭ev_id熬参数将被传半递给它。胺h。斑irqfl昂ags是中叭断处理的属板性,若设置案了IRQF哀_DISABLED 傲(老版本中碍的SA_I埃NTERR佰UPT,本斑版zhon拌已经不支持阿了),则表翱示中断处理扒程序是快速搬处理程序,凹快

3、速处理程摆序被调用时稗屏蔽所有中懊断,慢速处半理程 序不凹屏蔽;若设肮置了IRQ鞍F_SHA办RED (唉老版本中的岸SA_SH败IRQ),邦则表示多个搬设备共享中翱断,若设置伴了IRQF哎_SAMP邦LE_RA靶NDOM(蔼老版本中的斑 SA_S柏AMPLE傲_RAND熬OM),表笆示对系统熵矮有贡献,对半系统获取随拌机数有好处耙。(这几个啊flag是柏可以通过或佰的方式同时把使用的)安Z。哎dev_i耙d在中断共芭享时会用到板,一般设置暗为这个设备鞍的设备结构俺体或者NU吧LL。胺P。霸devna背me设置中凹断名称,在柏cat /靶proc/皑inter鞍rupts靶中可以看到靶此名称。

4、懊U。碍reque艾st_ir埃q()返回搬0表示成功盎,返回-I罢NVAL表示中断号无胺效或处理函凹数指针为N扳ULL,返斑回-EBU霸SY表示中蔼断已经被占爱用且不能共办享。安4。般关于中断注傲册的例子,瓣大家可在内耙核中搜索下疤reque碍st_ir扒q。岸E。昂在编写驱动绊的过程中,懊比较容易产艾生疑惑的地敖方是:肮1、中断向阿量表在什么懊位置?是如鞍何建立的?安盎 2、办从中断开始哎,系统是怎拔样执行到我斑自己注册的皑函数的?袄坝 3、爱中断号是如笆何确定的?懊对于硬件上奥有子中断的靶中断号如何袄确定?癌颁 4、皑中断共享是板怎么回事,版dev_i绊d的作用是翱?袄h。芭本文以百2.

5、6.2把6拌内核和S阿3C板2410处凹理器为例,吧为大家讲解拜这几个问题盎。疤i。办二、异常向绊量表的建立案在ARM 班V4及V4般T以后的大澳部分处理器拜中,中断向爱量表的位置唉可以有两个翱位置:一个伴是0,另一版个是0 xf敖fff00岸00。可以澳通过CP1稗5协处理器拜c1寄存器癌中V位(b癌it13佰)控制。拌V和中断向扮量表的对应挨关系如下:肮J。芭V=0昂澳 拌 拜0 x0 x坝C般坝 V=柏1阿 胺叭 0 x跋ffff0唉0000哀xffff坝001C斑d。扒arch/拌arm/m稗m/pro疤c-arm瓣920.S昂中瓣.sect蔼ion 肮.text颁.init耙, #a

6、扒lloc,碍 #exe按cinst八r霸拜 _拜arm92捌0_set把up:八罢 搬 orr暗岸 r0, 啊r0, #艾0 x210蔼0阿办 懊 .1般. .霸1 .1绊1 .捌1艾Q。靶/bit芭13=1 板中断向量表耙基址为0 x把FFFF0办000。R艾0的值将被扮付给CP1笆5的C1.按V。扒在linu摆x中,向量把表建立的函败数为:艾init/阿main.哀c-st昂art_k斑ernel班()-t笆rap_i鞍nit坝()败8。白void 八_ini搬t tra坝p_ini背t(voi败d)把巴 矮暗班昂 uns袄igned芭 long搬 vect扳ors =矮 CONF板IG

7、_VE唉CTORS拔_BASE版;败罢皑暗 暗拔笆摆 mem癌cpy(啊void 按*)vec柏tors,扳 _ve翱ctors盎_star案t, _败vecto吧rs_en碍d - _靶_vect凹ors_s吧tart)盎;奥颁傲稗 memc搬py(v埃oid *啊)vect爱ors +阿 0 x20败0, _瓣stubs哎_star板t, _癌stubs翱_end 扒- _s伴tubs_氨start拌);霸跋氨爱 .搬.安把 颁Y。稗在爸2.6.2盎6靶内核中CO碍NFIG_鞍VECTO案RS_BA昂SE最初是伴在各个平台碍的配置文件稗中设定的,哎如:癌K。奥arch/半arm/c八onf

8、ig扒s/s把3c霸2410_皑defco阿nfig中捌8。瓣CONFI碍G_VEC邦TORS_败BASE=澳0 xfff翱f0000案_vec笆tors_稗end 至哎 _ve矮ctors胺_star耙t之间为异岸常向量表。般7。按位于arc暗h/arm吧/kern吧el/en俺try-a柏rmv.S隘.glob跋l _v办ector巴s_sta昂rt暗_vec柏tors_半start矮:巴瓣 sw扳i SYS班_ERRO拌R0:耙哀 b 罢vecto般r_und罢 + st耙ubs_o袄ffset袄 /复位癌异常:翱办 ld鞍r pc,挨 .LCv哀swi +凹 stub按s_off凹se

9、t阿吧 /未定哀义指令异常邦:熬霸 b 翱vecto板r_pab哀t + s翱tubs_爸offse挨t奥 /败/软件中断敖异常:扮矮 b 凹vecto案r_dab案t + s邦tubs_颁offse皑t肮 /艾/数据异常办:靶办 b 隘vecto盎r_add哀rexcp靶tn + 爱stubs背_offs罢et隘 爸/保留:埃邦 b 翱vecto办r_irq班 + st吧ubs_o百ffset百疤 /挨普通中断异邦常:扮熬 b 翱vecto碍r_fiq办 + st傲ubs_o昂ffset白白 /拜快速中断异常:盎阿 .g盎lobl 罢_vec跋tors_哀end:熬_vec跋tors_捌en

10、d:摆9。蔼_stu斑bs_en癌d 至 _白_stub胺s_sta唉rt之间是败异常处理的拔位置。也位摆于文件ar埃ch/ar奥m/ker稗nel/e岸ntry-霸armv.昂S中。ve熬ctor_奥und、v白ector哀_pabt岸、vect绊or_ir挨q、vec坝tor_f般iq都在它跋们中间。俺M。版stubs班_offs翱et值如下奥:癌.equ 搬stubs敖_offs矮et, _耙_vect鞍ors_s般tart 埃+ 0 x2爱00 - 安_stu笆bs_st懊art袄A。般stubs案_offs般et是如何半确定的呢?罢(引用网络叭上的一段比按较详细的解疤释)傲p。疤当汇

11、编器看扮到B指令后埃会把要跳转唉的标签转化奥为相对于当疤前PC的偏艾移量(芭32M挨)写入指令扮码。从上面斑的代码可以耙看到中断向矮量表和st耙ubs都发艾生了 代码拔搬移,所以拜如果中断向安量表中仍然俺写成b v拜ector伴_irq,蔼那么实际执八行的时候就皑无法跳转到胺搬移后的vector稗_irq处巴,因为指令罢码里写的是稗原来的偏移凹量,所以需摆要把指令码瓣中的偏移量唉写 成搬移鞍后的。我们挨把搬移前的扳中断向量表熬中的irq哎入口地址记半irq_P扒C,它在中澳断向量表的暗偏移量就是俺irq_P癌C-vec颁tors_癌start百, vec胺tor_i安rq在st巴ubs中的皑偏

12、移量是v办ector扮_irq-版stubs佰_star瓣t,这两个颁偏移量在搬懊移前后是不扒变的。搬移扒后 vec耙tors_拌start肮在0 xff癌ff000拌0处,而s芭tubs_俺start盎在0 xff奥ff020斑0处,所以肮搬移后的v肮ector爱_irq相霸对于中断 稗向量中的中板断入口地址芭的偏移量就办是,200摆+vect捌or_ir暗q在stu隘bs中的偏疤移量再减去唉中断入口在芭向量表中的把偏移量,即翱200+ 肮vecto笆r_irq捌-stub靶s_sta白rt-ir敖q_PC+癌vecto蔼rs_st安art =蔼 (vec白tor_i挨rq-ir巴q_PC)

13、跋 + ve绊ctors芭_star拜t+200耙-stub疤s_sta巴rt,对于岸括号内的值爱实际上就是暗中断向量表袄中写的ve澳ctor_癌irq,减般去irq_跋PC是由汇败 编器完成癌的,而后面奥的 vec班tors_半start阿+200-搬stubs案_star扮t就应该是八stubs半_offs颁et,实际佰上在ent伴ry-ar办mv.S中癌也是这样定颁义的。翱Y。绊三、中断处搬理过程 把这一节将以颁S百3C佰2410为疤例,描述l艾inux-百2.6.2啊6巴内核中,从癌中断开始,半中断是如何摆一步一步执拔行到我们注班册函数的。败 安J。鞍3.1 中摆断向量表 捌arch办

14、armk肮ernel办entr拔y-arm拌v.S暗G。暗_vec背tors_癌start奥:办皑笆sw八i SYS搬_ERRO安R0艾扒扒b凹 ve蔼ctor_扳und +佰 stub扒s_offset矮坝拌ld鞍r pc,败 .LCv艾s俺wi + 把stubs爸_offs胺et稗背袄b啊 ve胺ctor_搬pabt 案+ stu爱bs_of按fset瓣扮捌b暗 ve霸ctor_熬dabt 柏+ stu半bs_of澳fset巴挨绊b盎 ve疤ctor_柏addre案xcptn熬 + st唉ubs_o岸ffset岸罢版b邦 ve背ctor_斑irq +芭 stub跋s_off般set 奥瓣伴

15、b爱 ve稗ctor_唉fiq +阿 stub柏s_off懊set邦捌.g阿lobl班 _v皑ector跋s_end罢哎_安vecto拔rs_en俺d:奥T。拌中断发生后盎,跳转到耙b vec败tor_i爱rq + 绊stubs班_offs氨et绊的位置执行翱。注意现在爸的向量表的巴初始位置是巴0 xfff肮f0000案。 哀z。邦3.2 中稗断跳转的入暗口位置 a笆rcha搬rmke捌rnel爱entry敖-armv吧.S澳5。哎俺.glo挨bl 隘_stu霸bs_st版art熬_绊_stub叭s_sta跋rt:班 敖/*岸 扮* Int邦errup办t dis按patch皑er败班*/瓣按

16、白ve颁ctor_扳stub盎 ir拌q, IR胺Q_MOD岸E, 4 矮吧IRQ_M唉ODE在i埃nclud胺easm班ptra啊ce.h中皑定义:0 x佰12奥班拜.l拔ong坝 _i芭rq_us巴r 0版 (USR拔_26 /澳 USR_案32)哎百疤.l芭ong袄 _i按rq_in板valid按 1 艾(FIQ_伴26 / 唉FIQ_3罢2)矮八蔼.l挨ong敖 _i安rq_in般valid昂 2 暗(IRQ_26 / 绊IRQ_3霸2)鞍鞍爱.l癌ong瓣 _i背rq_sv佰c 3袄 (SVC巴_26 /傲 SVC_班32)暗疤懊.l按ong蔼 _i蔼rq_in岸valid哀 4白唉

17、背.l办ong败 _i佰rq_in熬valid疤 5靶邦.l百ong颁 _i绊rq_in皑valid扮 6坝敖邦.l吧ong安 _i靶rq_in矮valid霸 7唉岸颁.l奥ong拌 _i扳rq_in班valid昂 8绊般伴.l佰ong唉 _i扳rq_in八valid唉 9懊氨昂.l八ong _氨_irq_扒inval唉id 癌a绊昂哎.l伴ong _懊_irq_俺inval瓣id 靶b班挨稗.l胺ong _班_irq_搬inval败id 瓣c叭鞍鞍.l伴ong _哎_irq_挨inval鞍id 柏d岸袄败.l艾ong _隘_irq_瓣inval柏id 颁e巴霸安.l坝ong _佰_irq_案

18、inval笆id 碍f败8。拔上面代码中挨vecto翱r_stu敖b宏的定义邦为: 霸.macr挨o vec澳tor_s笆tub, 佰name,安 mode盎, cor哎recti熬on=0奥稗爸.a碍lign 哀5啊芭ve爱ctor_胺name把:叭懊阿.i扮f co盎rrect绊ion跋癌扮su拌b lr,阿 lr, 蔼#cor拌recti坝on半捌碍.e伴ndif扒般版爸败瓣 岸Save 败r0, l阿r_ (瓣p办arent翱 PC) 安and s叭psr_蔼氨敖 (pare拔nt CP哀SR)啊搬案柏笆白st鞍mia s盎p, r瓣0, lr傲 s疤ave r吧0, lr皑扒半mr矮

19、s lr,皑 spsr柏办碍st鞍r lr,拌 sp,柏 #8 肮 sav搬e sps奥r昂蔼搬哀昂埃 凹Prepa绊re fo碍r SVC白32 mo挨de. I熬RQs r懊emain绊 disa鞍bled.澳搬霸柏埃伴mr肮s r0,坝 cpsr瓣胺爸eo阿r r0,伴 r0, 挨#(mo碍de 扒SVC_M盎ODE)哎绊霸ms翱r sps斑r_cxs摆f, r0挨 俺为后面进入疤svc模式啊做准备 班h。拜岸袄埃 the b靶ranch盎 tabl按e mus板t imm胺ediat把ely f暗ollow懊 this办 code百岸佰 斑扳袄an胺d lr,斑 lr, 板#0 x把0

20、f拌 进入中坝断前的mo哀de的后4哎位 凹白般#蔼defin唉e USR颁_MODE昂 0 x胺把斑#白defin败e FIQ啊_MODE啊 0 x皑岸安#背defin扳e IRQ板_MODE八 0 x拌氨靶#碍defin翱e SVC傲_MODE唉 0 x巴扳#白defin盎e ABT凹_MODE暗 0 x办巴般#俺defin暗e UND搬_MODE按 0 xb爱半熬#背defin稗e SYS柏TEM_M板ODE 0奥x把f摆肮奥mo傲v r0,靶 sp坝翱办ld肮r lr,皑 pc,矮 lr, 八lsl #稗2 如百果进入中断哎前是usr摆,则取出P斑C+4*0百的内容,即办_irq柏_u

21、sr般如果进入百中断前是s矮vc,则取胺出PC+4半*3的内容叭,即_i般rq_sv背c癌白叭mo鞍vs pc皑, lr 拜 当指令八的目标寄存佰器是PC,哎且指令以S矮结束,则它绊会把 s拌psr的值按恢复给cp罢sr br办anch 翱to ha皑ndler隘 in S罢VC mo稗de敖哀芭.e隘ndm挨吧熬.g暗lobl 埃_stu捌bs_st八art疤八_s坝tubs_把start按:扒安/*摆奥* I捌nterr傲upt d班ispat按cher扮*/鞍鞍绊ve爱ctor_败stub 捌irq, 挨IRQ_M敖ODE, 把4百半邦.l傲ong _搬_irq_隘usr 啊 0 (U矮

22、SR_26颁 / US熬R_32)颁扮澳.l颁ong _拌_irq_疤inval般id 霸1 (FI柏Q_26 蔼/ FIQ绊_32)斑袄碍.l芭ong _昂_irq_疤inval暗id 爱2 (IR昂Q_26 伴/ IRQ翱_32)奥唉芭.l艾ong _埃_irq_挨svc 敖 3 (S癌VC_26靶 / SV敖C_32)跋i。按用“irq爱, IRQ俺_MODE百, 氨4”埃代替宏ve斑ctor_哀stub中摆的“nam埃e, mo跋de, c氨orrec版tion”坝,找到了我叭们中断处理佰的入口位置皑为vect般or_ir巴q(宏里面吧的扳vecto傲r_na熬me跋)。 盎从上面代码

23、哎中的注释可拌以看出,根瓣据进入中断耙前的工作模佰式不同,程昂序下一步将奥跳转到_i耙rq_us哀r 、或_鞍_irq_斑svc等位扒置。我们先巴选择_i笆rq_us拜r作为下一挨步跟踪的目肮标。 拔v。哎3.3 _背_irq_皑usr的实白现 arc摆harm笆kern疤elen版try-armv.S爱T。熬_irq矮_usr:肮俺稗us拔r_ent捌ry 后八面有解释 摆败肮岸kuser般_cmpx哀chg_c埃heck霸办#if摆def C扒ONFIG昂_TRAC板E_IRQ翱FLAGS盎挨扮半bl tr芭ace_h坝ardir办qs_of暗f凹阿#en捌dif佰扮袄笆get_t阿hre

24、ad般_info tsk 隘获取当前敖进程的进程懊描述符中的矮成员变量t俺hread疤_info隘的地址,并吧将该地址保暗存到寄存器挨tsk等于跋r9(在e办ntry-白heade扮r.S中定扒义)按笆#if般def C按ONFIG靶_PREE巴MPT/霸如果定义了拌抢占,增加碍抢占数值 扮疤扳ld啊r r8,跋 tsk案, #TI白_PREE笆MPT 罢 get爱 pree鞍mpt c凹ount坝颁版ad矮d r7,八 r8, 啊#1 胺incre般ment 傲it安巴案st败r r7,芭 tsk白, #TI氨_PREE八MPT叭碍#en翱dif柏W。爱irq_h澳andle柏r 中断班处理

25、,我们啊最关心的地绊方,3.4氨节有实现过颁程。 跋稗#ifd懊ef CO碍NFIG霸_PREE唉MPT靶埃白ld办r r0,矮 tsk耙, #TI拔_PREE埃MPT奥疤耙st蔼r r8,扳 tsk瓣, #TI癌_PREE阿MPT氨佰霸te爱q r0,扮 r7爱傲八st靶rne r百0, r氨0, -r伴0班敖#end版if唉蔼#ifd吧ef CO版NFIG_叭TRACE挨_IRQF搬LAGS隘罢暗bl哎 trac耙e_har皑dirqs昂_on把爸#en傲dif败g。澳mov w啊hy, #哀0跋b 凹ret_t拜o_use办r 盎中断处理完芭成,返回中啊断产生的位白置,3.7办节有实现过

26、袄程埃 把t。岸上面代码中澳的懊usr_e肮ntry叭是一个宏,笆主要实现了搬将usr模拔式下的寄存熬器、中断返板回地址保存霸到堆栈中。跋Y。蔼.macr跋o 爱usr_e艾ntry笆拔sub熬 sp, 扮sp, #昂S_FRA半ME_SI敖ZE 翱S_FRA耙ME_SI叭ZE的值在扳arch扳armk癌ernel百asm-霸offse翱ts.c霸霸 中罢定义 DE凹FINE(白S_FRA耙ME_SI叭ZE, s板izeof邦(stru板ct pt般_regs癌);实际板上等于72百4。傲八stmib唉 sp,爱 r1 八- r12皑瓣叭皑ld八mia r拌0, r败1 - r扒3哀稗坝ad把

27、d r0,鞍 sp, 斑#S_PC扮 he懊re fo瓣r int摆erloc氨k avo肮idanc伴e邦颁伴mo背v r4,扒 #-1 坝 伴 扳 按r。敖绊巴st办r r1,佰 sp柏 sa办ve th绊e re把al r佰0 cop哎ied捌罢罢 伴from 颁the e坝xcept唉ion s败tack巴I。疤办板扳氨 敖We ar爸e now扒 read柏y to 笆fill 拔in th稗e rem伴ainin罢g bla袄nks o氨n the扳 stac扮k:袄巴霸暗阿埃 八r2 - 斑lr_,板 alre拜ady f阿ixed 跋up fo扒r cor盎rect 摆retu

28、r俺n/res按tart班翱阿 巴r3 - 唉spsr_澳瓣癌斑 摆r4 - 吧orig_办r0 (s白ee pt昂_regs跋 defi安nitio暗n in 隘ptrac癌e.h)把跋熬俺巴矮 半Also,爱 sepa白ratel啊y sav懊e sp_蔼usr a摆nd lr稗_usr拔摆矮版笆鞍st艾mia r艾0, r熬2 - r版4半傲拌st办mdb r败0, s碍p, lr凹碍i。百奥唉颁埃 背Enabl叭e the耙 alig啊nment奥 trap隘 whil翱e in 巴kerne翱l mod昂e岸埃霸鞍align罢ment_败trap 癌r0拌6。哎吧艾阿袄 跋Clear

29、袄 FP t熬o mar拔k the坝 firs安t sta霸ck fr芭ame拜摆哀隘摆跋ze碍ro_fp阿熬唉.e叭ndm啊c。捌上面的这段肮代码主要在熬填充结构体罢pt_re败gs ,这癌里提到的s啊truct胺 pt_r矮egs,在爱inclu败de/as袄m/ptr捌ace.h捌中定义。此癌时sp指向扳struc颁t pt_百regs。佰 爸m。绊拜stru扒ct pt阿_regs埃 扳板拜俺邦靶long拌 ureg爸s18啊;摆霸挨;斑傲#de版fine 半ARM_c邦psr u拌regs笆16佰稗#define ARM_p翱c ure懊gs15啊懊哎#de哀fine 案AR傲M_

30、lr 叭uregs坝14傲八#de碍fine 坝ARM_s氨p ure百gs13坝阿般#de吧fine 坝ARM_i办p ure绊gs12把百昂#de瓣fine 暗ARM_f碍p ure邦gs11罢澳凹#de阿fine 袄ARM_r澳10 ur爸egs1安0瓣吧#de笆fine 凹ARM_r靶9 ure啊gs9袄癌#de隘fine 板ARM_r安8 ure哎gs8叭翱#de安fine 盎ARM_r阿7 ure斑gs7版白#de罢fine 邦ARM_r跋6 ure搬gs6败哀#de坝fine 搬ARM_r坝5 ure凹gs5叭懊#de拜fine 蔼ARM_r袄4 ure挨gs4颁霸#de佰fin

31、e 般ARM_r胺3 ure敖gs3胺叭#de哎fine 伴ARM_r哎2 ure胺gs2按邦#de敖fine 扮ARM_r版1 ure懊gs1凹肮#de巴fine 敖ARM_r0 ure昂gs0般爸#de捌fine 捌ARM_O凹RIG_r胺0 ure邦gs17疤爸D。搬3.4 i蔼rq_ha胺ndler哎的实现过程笆,坝arch拔armk八ernel把entr岸y-arm暗v.S颁y。凹.ma办cro 百irq_h扮andle芭r稗吧傲g埃et_ir案qnr_p艾reamb靶le r5矮, lr爱耙柏吧在incl爸ude/a凹sm/ar哎ch-s奥3c胺2410/凹entry扒-macr拔

32、o.s中定拔义了宏ge鞍t_irq版nr_pr敖eambl疤e为空操作班,什么都不搬做靶斑哀1芭: get_irqn白r_and把_base俺 r0, 罢r6, r唉5, lr跋 判断中昂断号,通过凹R0返回,叭3.5节有办实现过程 凹拔懊m癌ovne 懊r1, s爸p哀耙懊傲柏拔哎 routine c爱alled扒 with把 r0 =把 irq 扒numbe哀r, r1唉 = st吧ruct 隘pt_re矮gs *把皑啊艾挨百a败drne 隘lr, 1艾b坝鞍挨颁bne a碍sm_do傲_IRQ 案进入中断白处理。 板靶 坝蔼案.柏endm按T。扮3.5 g靶et_ir罢qnr_a肮nd_

33、ba邦se中断号板判断过程半,incl熬ude/a艾sm/ar柏ch-s唉3c巴2410/坝entry板-macr扒o.s颁3。板.macr哀o get哎_irqn耙r_and拔_base绊, irq皑nr, irqsta办t, ba扮se, t按mp懊柏m霸ov b柏ase, 翱#S瓣3C版24XX_办VA_IR傲Q颁耙邦唉 try瓣 the 佰inter扮rupt 叭offse鞍t reg岸ister拜, sin按ce it袄 is t扒here袄鞍熬l版dr i坝rqsta百t, 皑 bas懊e, #I稗NTPND 啊袄傲t傲eq i摆rqsta扳t, #0伴疤办b傲eq 盎1002f捌

34、暗l澳dr i靶rqnr,搬 b哀ase, 熬#INTO罢FFSET俺 澳 通过判翱断INTO皑FFSET哎寄存器得到奥中断位置氨 扳奥扮m搬ov t隘mp, #哀1安哎熬t昂st i白rqsta跋t, t巴mp, l瓣sl i背rqnr白斑拔b澳ne 耙1001f跋柏挨靶 th伴e num把ber s板pecif安ied i唉s not稗 a va摆lid i皑rq, s肮o try翱般八耙 and鞍 work伴 it o瓣ut fo版r our拔selve矮s坝袄m背ov i吧rqnr,澳 #0 吧 sta碍rt he扳re艾摆靶霸 wor办k out吧 which irq哀 (if 啊a

35、ny) 哀we go坝t吧绊唉m拔ovs 八tmp, 懊irqs懊tat, 隘lsl#1半6袄靶盎a爱ddeq 盎irqnr, i皑rqnr,伴 #16柏板肮m百oveq 岸irqs白tat, 碍irqs版tat, 瓣lsr#1暗6绊班蔼t肮st i笆rqsta鞍t, #0败xff捌坝扒a拌ddeq 爸irqn敖r, i败rqnr,氨 #8奥叭肮m靶oveq 吧irqs拌tat, 伴irqs肮tat, 蔼lsr#8翱笆胺t熬st i背rqsta跋t, #0巴xf芭氨班a爱ddeq 袄irqn凹r, i拌rqnr,伴 #4瓣爸俺m拌oveq 袄irqs阿tat, 哀irqs熬tat, 跋lsr#

36、4哀按岸t百st i盎rqsta蔼t, #0挨x3矮鞍捌a鞍ddeq 奥irqn癌r, i傲rqnr,百 #2笆扮伴m败oveq 佰irqs盎tat, 胺irqs罢tat, 拜lsr#2阿瓣耙t办st i埃rqsta叭t, #0跋x1跋半袄a斑ddeq 白irqn癌r, i懊rqnr,熬 #1绊笆叭爸 we 啊have 罢the v瓣alue颁案1001隘:半x。癌捌add拜s ir案qnr, 哀irqn按r, #I翱RQ_EI背NT0 疤加上中断号瓣的基准 数澳值,得到最敖终的中断号稗,注意:此斑时没有考虑吧子中断的具暗体情况,(袄子中断的问笆题后面会有搬讲解)。I傲RQ_EI斑NT0在i败

37、nclud吧e/asm/arch绊- s拜3c拜2410/柏irqs.靶h中定义.碍从这里可以阿看出,中断办号的具体值捌是有平台相爸关的代码决八定的,和硬俺件中断挂起坝寄存器中的坝中断号是不班等的。柏 阿U。把1002:哀盎疤坝 exi耙t her氨e, Z 凹flag 案unset凹 if I佰RQ安叭笆.endm阿A。皑3.6 叭asm_d蔼o_IRQ伴实现过程,拜arch/摆arm/k翱ernel按/irq.胺c 拌U。伴asmli搬nkage跋 void埃 _ex傲cepti芭on 盎asm_d半o_IRQ跋(傲unsigned i捌nt ir扳q, st拌ruct 唉pt_re柏gs

38、 *r扮egs)芭敖办稗矮s扳truct败 pt_regs *扒old_r版egs =按 set_哀irq_r邦egs(r碍egs);挨傲扒s矮truct伴 irq_般desc 胺*desc把 = ir昂q_des百c + i案rq;/肮根据中断号哎找到对应的般irq_d案esc俺白懊/鞍*八盎爸*爸 Some芭 hard埃ware 摆gives奥 rand肮omly 啊wrong稗 inte埃rrupt俺s. Ra拌ther芭扳拜*挨 than跋 cras叭hing,扮 do s奥ometh斑ing s埃ensib把le.安碍八*碍/肮叭霸i胺f (ir肮q = 版NR_IR耙QS)板碍八d

39、百esc =傲 &bad摆_irq_柏desc;袄凹昂i吧rq_en捌ter()跋;/没做背什么特别的靶工作,可以佰跳过不看 昂百叭d袄esc_h办andle八_irq(般irq, desc)败;/蔼 根据中断矮号和des啊c进入中断袄处理 蔼敖败/熬* AT9挨1 spe搬cific敖 work斑aroun伴d */氨翱搬i佰rq_fi巴nish(澳irq);氨伴罢i案rq_ex肮it();扮拜坝s挨et_ir按q_reg爸s(old爸_regs吧);肮把把K。安stati啊c inl爱ine v绊oid 唉desc_傲handl瓣e_irq艾(unsi翱gned 败int i挨rq, s半

40、truct爸 irq_俺desc 颁*desc矮)袄艾绊稗八隘俺desc哀-han案dle_i拜rq(ir扳q, de隘sc);/癌/中断处理巴 爱坝岸背U。安上述asm瓣linka凹ge vo白id _傲excep岸tion 邦asm_d爱o_IRQ奥(unsi靶gned 盎int i肮rq, s爸truct邦 pt_r澳egs *霸regs)岸使用了as叭mlink拔age标识傲。那么这个袄标识的含义隘如何理解呢瓣? 爱该符号定义哎在kern哀el/in扮clude跋/linu盎x/lin案kage.摆h中,如下白所示: 斑S。暗#incl扒ude /各个具体般处理器在此翱文件中定义爸as

41、mli把nkage耙碍#i扮fdef 矮_cpl凹usplu扒s巴挨#d摆efine昂 CPP_搬ASMLI伴NKAGE敖 exte佰rn C背拔矮#e拜lse把碍#d绊efine巴 CPP_唉ASMLI颁NKAGE按哀#e败ndif邦T。癌#ifnd败ef as岸mlink奥age/爱如果以前没氨有定义as阿mlink版age叭瓣#d俺efine鞍 asml颁inkag芭e CPP拔_ASML柏INKAG吧E阿拌#e跋ndif奥X。爸对于ARM稗处理器的,扳没有定义a佰smlin袄kage,罢所以没有意扮义(不要以唉为参数是从疤堆栈传递的把,对于AR矮M平台来说瓣还是符合A俺TPCS过叭程调

42、用标准凹,通过寄存办器传递的)伴。 邦s。班但对于X8搬6处理器的吧翱中是这样定邦义的:埃l。按#defi盎ne as罢mlink捌age C阿PP_AS爸MLINK绊AGE _爸_attr芭ibute碍_(r佰egpar袄m(0)阿)班T。颁表示函数的挨参数传递是爱通过堆栈完霸成的。蔼3.7 描佰述3.3节昂中的霸ret_t拔o_use办r 办中断返回过懊程,/ar邦ch/ar叭m/ker翱nel/e艾ntry-翱commo案n.S扒r。安ENTRY熬(ret_凹to_us跋er)拔昂re盎t_slo捌w_sys凹call:奥斑翱d拜isabl扮e_irq隘 di瓣sable靶 inte百r

43、rupts敖耙l碍dr r1皑, ts板k, #T隘I_FLA敖GS班笆安t疤st r1凹, #_T拌IF_WO叭RK_MA癌SK奥八b败ne wo柏rk_pe阿nding袄摆no笆_work摆_pend拜ing:伴霸霸/奥* per笆form 阿archi昂tectu罢re sp氨ecifi盎c act斑ions 凹befor蔼e use昂r ret阿urn *敖/板唉办a吧rch_r艾et_to爸_user八 r1, 扳lr盎r。坝半 sl哎ow_re罢store搬_user白_regs班袄柏l拔dr r1扮, sp坝, #S_矮PSR 按 get傲 call颁ing c懊psr敖奥按l邦

44、dr lr背, sp蔼, #S_暗PC! 霸 get疤 pc耙肮懊m按sr sp哎sr_cx艾sf, r扒1 s埃ave i靶n sps昂r_svc埃案安l阿dmdb 按sp, 霸r0 - 傲lr 班 get败 call岸ing r把0 - l挨r芭哎版m蔼ov r0拔, r0吧佰俺a按dd sp哀, sp,办 #S_F埃RAME_百SIZE 埃- S_P挨C癌熬坝m伴ovs p佰c, lr案 re板turn 拌& mov肮e sps扒r_svc背 into拜 cpsr百O。版第三章主要把跟踪了从中断发生到调爸用到对应中奥断号的爸desc-扒hand坝le_ir哎q(irq懊, des艾c)耙

45、中断函数的坝过程。后面哎的章节还会奥继续讲解后埃面的内容。百C。隘四、中断处板理模型 氨要想弄清楚desc-佰hand半le_ir笆q(irq埃, des疤c)和我们扒注册的中断暗有什么关联颁,就要了解拌中断处理模凹型了。 瓣O。暗4.1 中凹断处理模型鞍结构 肮中断处理模型如下图所安示,班其中NR_摆IRQS表胺示最大的中伴断号,在i傲nclud啊e/asm唉/arch扳/irq.暗h中定义。安 搬L。暗irq_d跋esc板是一个指向颁irq_d扳esc_t八结构的数组爸, irq邦_desc哎_t结构是拔各个设备中耙断服务例程稗的描述符。傲Irq_d唉esc_t扒结构体中的胺成员act霸i

46、on指向盎该中断号对叭应的irq耙actio靶n结构体 哀链表。Ir拔qacti碍on结构体隘定义在in扳clude案/linu啊x/int版errup班t.h中,办如下:哀z。肮truct凹 irqa氨ction蔼 爱瓣ir鞍q_han柏dler_佰t han敖dler;伴 /中断败处理函数,八注册时提供百澳un案signe颁d lon懊g fla捌gs; /傲/中断标志袄,注册时提柏供啊挨cp爱umask佰_t ma扒sk; /哀/中断掩码氨埃co凹nst c盎har *般name;斑 /中断佰名称邦啊vo案id *d办ev_id澳; /设疤备id,本坝文后面部分伴介绍中断共岸享时会详细扳

47、说明这个参背数的作用肮盎struct 拜irqac凹tion 伴*next佰; /如翱果有中断共芭享,则继续埃执行,肮安in奥t irq蔼; /中敖断号,注册败时提供盎坝st坝ruct 摆proc_佰dir_e般ntry 挨*dir;澳 /指向哎IRQn相隘关的/pr盎oc/ir鞍q/n目录斑的描述符板摆;昂m。扮在注册中断唉号为irq板的中断服务摆程序时,系翱统会根据注罢册参数封装般相应的ir挨qacti巴on结构体拔。并把中 扮断号为ir吧q的irq案action结构体写懊入irq_皑desc 暗irq阿-act八ion。这百样就把设备芭的中断请求笆号与该设备背的中断服务艾例程irq按ac

48、tio氨n联系在一岸起了。样当稗CPU接收扳到中断请求拔后,就可 颁以根据中断瓣号通过ir巴q_des肮c 找巴到该设备的袄中断服务程疤序。 白n。笆4.2 中佰断共享的处八理模型癌共享中断的袄不同设备的胺iqrac癌tion结颁构体都会添盎加进该中断袄号对应的i伴rq_de坝sc结构体般的 act哎ion成员斑所指向的i瓣rqact肮ion链表爱内。当内核胺发生中断时碍,它会依次啊调用该链表邦内所有的h瓣andle霸r函数。因伴此,若驱动案程序需要使笆用共享中 扳断机制,其把中断处理函办数必须有能稗力识别是否啊是自己的硬胺件产生了中埃断。通常是挨通过读取该阿硬件设备提拔供的中断f邦lag标志

49、芭位进行判断懊。也就是说胺不是任何设扳备都 可以吧做为中断共罢享源的,它罢必须能够通办过的它的中挨断flag芭判断出是否笆发生了中断哀。矮中断共享的瓣注册方法是邦:板I。罢int r氨equest_irq俺(unsi罢gned 爸int i案rq, i艾rq_ha矮ndler搬_t ha八ndler败,阿埃拜IRQF_半SHARE柏D捌, con隘st ch碍ar *d绊evnam跋e, vo扒id *d白ev_id笆) 昂j。哀很多权威资澳料中都提到蔼,中断共享阿注册时的注盎册函数中的跋dev_i笆d参数是必胺不可少的,傲并且dev昂_id的值搬必须唯一。伴那么这里提按供唯一的d摆ev_id

50、稗值的究竟是耙做什么用的翱? 癌A。肮根据我们前隘面中断模型翱的知识,可按以看出发生澳中断时,内癌核并不判断败究竟是共享疤中断线上的按哪个设备产捌生了中断,罢它会循环 按执行所有该跋中断线上注蔼册的中断处罢理函数(即熬irqac搬tion-癌hand败ler函数佰)。因此i扳rqact佰ion-安handl哎er函数有蔼责 任识别板出是否是自碍己的硬件设氨备产生了中疤断,然后再胺执行该中断扳处理函数。疤通常是通过案读取该硬件按设备提供的盎中断fla柏g标志位进安行判断。那颁既然ker白nel循 邦环执行该中百断线上注册拔的所有ir稗qacti板on-h瓣andle胺r函数,把柏识别究竟是胺哪个

51、硬件设爸备产生了中澳断这件事交皑给中断处理艾函数本身去背做,那 r埃eques班t_irq霸的dev_扮id参数究把竟是做什么哀用的? 矮z。挨很多资料中捌都建议将设啊备结构指针挨作为dev凹_id参数扮。在中断到哎来时,迅速爸地根据硬件安寄存器中的埃信息比照传板入的 de挨v_id参跋数判断是否安是本设备的邦中断,若不拜是,应迅速挨返回。这样坝的说法没有版问题,也是爱我们编程时颁都遵循的方矮法。但事实芭上并不能够拌说明为什么扳中断共享必昂 须要设置懊dev_i败d。 疤J。背下面解释一岸下dev_奥id参数为埃什么必须的爸,而且是必版须唯一的。傲 懊当调用fr皑ee_irq注销中断扮处理函数

52、时斑(通常卸载背驱动时其中疤断处理函数柏也会被注销扮掉),因为皑dev_i艾d是唯一 八的,所以可鞍以通过它来板判断从共享扮中断线上的稗多个中断处班理程序中删氨除指定的一般个。如果没班有这个参数唉,那么ke败rnel不背可能知道给氨定的中断线扒上到底要删背除哪 一个斑处理程序。昂X。安注销函数定般义在Ker笆nel/i皑rq/ma背nage.瓣c中定义:按 般v熬oid f哎ree_i搬rq(un伴signed int扒 irq,耙 void把 *dev鞍_id)案J。白五、S3C疤2410子碍中断的注册柏的实现 案5.1 S袄3C241盎0子中断注拌册问题的提艾出案参看3.5摆节中判断中哎断

53、号的方法耙,可以看到扮只是通过S半3C241案0中断控制爸器中的IN办TOFFS捌ET寄存器芭来判断的。摆对于邦INTPN板D昂中的EIN碍T4_7、艾EINT8哎_23、I背NT_UA斑RT0、I肮NT_AD跋C 等带有俺子中断的向靶量,INT稗OFFSE昂T无法判断拌出具体的中安断号。平台靶留给我们的氨注册方法如搬下: 稗B。凹在incl耙ude/a斑sm/ar板ch/irqs.h中艾有类似如下百定义:皑2。伴/* in阿terru氨pts g拌enera癌ted f稗rom t啊he ex隘terna般l int暗errup叭ts so败urces啊 */翱#蔼defin巴e IRQ鞍_

54、EINT拜4 S3C挨2410_芭IRQ(3斑2) /* 48 *翱/翱#胺defin办e IRQ哀_EINT坝5 S3C办2410_暗IRQ(3挨3)芭#扒defin蔼e IRQ办_EINT板6 S3C版2410_罢IRQ(3瓣4)拔#扮defin办e IRQ霸_EINT蔼7 S3C啊2410_俺IRQ(3皑5)班#阿defin癌e IRQ颁_EINT败8 S3C傲2410_把IRQ(3般6)颁#扮defin哀e IRQ巴_EINT阿9 S3C盎2410_拌IRQ(3矮7)扒#翱defin吧e IRQ背_EINT皑10 S3隘C2410艾_IRQ(爸38)埃#叭defin澳e IRQ哎_EI

55、NT把11 S3颁C2410暗_IRQ(芭39)颁#绊defin傲e IRQ八_EINT唉12 S3佰C2410奥_IRQ(邦40)芭#安defin蔼e IRQ啊_EINT八13 S3柏C2410傲_IRQ(阿41)办#巴defin扒e IRQ翱_EINT捌14 S3唉C2410哎_IRQ(氨42)巴#隘defin拔e IRQ碍_EINT熬15 S3唉C2410哎_IRQ(邦43)扮#把defin按e IRQ懊_EINT凹16 S3颁C2410白_IRQ(绊44)拜#邦defin哎e IRQ碍_EINT翱17 S3柏C2410颁_IRQ(靶45)罢#扳defin矮e IRQ爸_EINT搬18 S3艾C2410唉_IRQ(哀46)袄#拜defin熬e IRQ拜_EINT柏19 S3隘C2410办_IRQ(吧47)熬#吧defin柏e IRQ翱_EINT案20 S3唉C2410般_IRQ(哀48) /安* 64 案*/笆#八defin碍e IRQ澳_EINT绊21

温馨提示

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

评论

0/150

提交评论