欢迎来到优知文库! | 帮助中心 分享价值,成长自我!
优知文库
全部分类
  • 幼儿/小学教育>
  • 中学教育>
  • 高等教育>
  • 研究生考试>
  • 外语学习>
  • 资格/认证考试>
  • 论文>
  • IT计算机>
  • 法律/法学>
  • 建筑/环境>
  • 通信/电子>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 优知文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    arm linux内核中ARM中断实现详解.docx

    • 资源ID:1630046       资源大小:50.50KB        全文页数:14页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录
    二维码
    扫码关注公众号登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,如果您不填写信息,系统将为您自动创建临时账号,适用于临时下载。
    如果您填写信息,用户名和密码都是您填写的【邮箱或者手机号】(系统自动生成),方便查询和重复下载。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    arm linux内核中ARM中断实现详解.docx

    Iinux-2.6.26内核中ARM中断实现详解(1)作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARMATC授权培训讲师。看了一些网络上关于IinUX中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对些问题的理解,先从函数注册引出问感吧.一、中断注册方法在IinUX内核中用于申请中断的函数是requesiirq<),函数原型在KerneIirqmanage.c中定义:intrequest/rq(unsignedintirq,irq_hand1.er_thand1.er,unsigned1.ongirqf1.ags,constchardevname,void*dev_id)irq是要申请的硬件中断号。hand1.er是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,deid参数将被传递给它。irqf1.ags是中断处理的属性,若设JS了IRQFD1.SAB1.ED(老板本中的SAINTERRUPT,本版ZhOn已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被谢用时屏锻所有中断,慢速处理程序不屏蔽:若设置了IRQF.SHARED(老版本中的SAsHIRQ),则表示多个设备共享中断.若设置了IRQFSAMP1.E_RAMX)M(老版本中的SA-SAMP1.ERANDOM),表示对系统端有奉献,对系统获取随机数有好处,(这几个f1.ag是可以通过或的方式同时使用的)devid在中断共享时会用到,一般设巴为这个设备的设备结构体或者NU1.Jdevname设置中断名称,在Catprocinterrupts中可以看到此名称。requcSJirqO返回0表示成功,返回-INVA1.表示中断号无效或处理函数指针为MJ1.1.,返回-EBUSY表示中断已经被占用且不能共享。关于中断注册的例子,大家可在内核中搜索下request.irq.在编写驶动的过程中,比较容易产生疑惑的地方是:1、中断向星表在什么位置?是如何建立的?2、从中断开始,系统是怎样执行到我自己注册的函数的?3、中I析号是如何确定的?对于硬件上有子中断的中断号如何确定?4、中断共享是怎么回事,deid的作用是?本文以2.6.26内核和S3C2410处理器为例,为大家讲解这几个问题,二、异常向量表的建立在ARMV4及Y4T以后的大局部处理器中,中断向盘表的位置可以有两个位置:一个是0,另一个是OXffffoO00。可以通过CP15协处理器C1.存放器中V位(bi1.13)控制。V和中断向量表的对应关系如F:OXOOOoooOO'0x00000O1.COxffffOOOO'OxffffOO1.Carch/ammproc-ar11920.S,.section”.1.ex1.ini1.”,Hoc,Uexecinstr_arn920_setup:orrr,r,.11.140x21001./bit13=1中断向量表基址为OxFFFFOOOOeRO的值将被付给CP15的C1.在IinUX中.向量:表建立的函数为:init/main.c->starJkerne1.()->trapinit()voidinittrapiniI(void)(unsigned1.ongvectors=CONFIG_VECTORS_BASE:nemcpy(void*)vectors,vectorsstart,_vectors_end-_vectors_start):memcpy(void*)vectors+0x200,_stubs_start,_stubs_end-_stubs_start);)在2.6.26内核中CONF1.GVECTORSBASE最初是在各个平台的配置文件中设定的,如:arch/arm/configss3c2410defconfi中CONFIGVECTORSBASE=OxffffOOOOvectorsend至_vectors_start之间为异常向量表。位于arch/arm/kerne1/entry-armv.S.g1.ob1._VeetOrS_starC_vectors_start:swiSYS_ERRORO:/未定义指令异常:软件中断异常:数据异常:保存:普通中断异常:快速中断异常:bvectorUnd+stubsoffset/复位异常:Idrpc,.1.Cvswi+stubs_offsetbvcctor_pabt+StUbS_OffSetbVeCtOJdabt+StUbS_OffSetbvectorHddrexcp1.n+stubsoffsetbVeCtoJirq+StUbS.offsetbvector_fiq+StUbS.offset.g1.ob1.vectorsend:_vectors_end:stubsend至SIUbSSIar1.之间是异常处理的位置。也位于文件archarmkerne1.entry-a11nv.S,t,vectorUnd、VeCtOJPabt、vectorirq.VeCtor.fiq都在它们中间。stubsoffset值如下:.equStUbS.offset,_vectors_start+0x200-_StUbS_StartStUbS.offset是如何獭定的呢?(引用网络上的一段比较详细的解糅)当汇编器看到B指令后会把要跳转的标卷转化为相对于当前PC的偏移量(+32M)写入指令码。从上面的代码可以看到中断向量表和stubs都发生了代码搬移,所以如果中断向量表中仍然写成bvectorirq,那么实际执行的时候就无法跳转到搬移后的VeCtorirq处,因为指令码里写的是原来的儡移垃,所以需要把指令码中的偏移量写成搬移后的.我们把搬移前的中断向量表中的irq入口地址记irqPC,它在中断向量表的偏移域就是irqPCrec1.orsstart,vectorirq在StUbS中的偏移量是VeCtorJrq-StUbS_start,这两个偏移量在搬移前后是不变的。搬移后YCCtOrS_Start在OXffffOOOO处,而StUbSStart在OXffff在00处,所以搬移后的VeetoJirq相对于中断向量中的中断入口地址的偏移坑就是,200+v。Ctorirq在StUbS中的偏移量再减去中断入口在向量表中的偏移量,即200+vectorirqstubss1.ar1.-irqPCvectorsstart=(vector_irq-irq_PC)+VeCtorS_start+200-StUbS_Start,对于括号内的值实际上就是中断向量表中写的VeCtorirq,她去irq_PC是由汇编器完成的,而后面的VeCtOrS_Start+200-StUbSstart就应该是stubsoffset,实际上在entry-arnv.S中也是这样定义的.三、中断处理过程这一节将以S3C2410为例,描述IinUX-2.6.26内核中,从中断开始,中断是如何步步执行到我们注册函数的。3. 1中断向量衰archarmkerne1.entry-armv.S_VeCtorS_start:swiSYS_ERRORObVeCtoJUnd+stubs_offsot1.<1.rpc,.1.Cvswi+stubsoffsetbvector_pabt+StUbS.offsetbvector_dabt+StUbS.offsetbVeCtOJaddreXCPtn+stubs_offsetbVeCtOjirq+stubs_offsetbvector_fiq+StUbS.offset.g1.ob1._vectors-endvectorsend:中断发生后,跳转到bvector_irq+st泌&oet的位置执行。注意现在的向:止表的初始位置是OXfffTOO00。3.2 中断跳转的入I位置archarmkerne1.entry-armv.S.g1.ob1._StUbS_startstubsstart:*Interruptdispatcher*/.vector.stubirq,IRQ_MODE,4'IRQ-MODEinc1.udenptrace.h中定义t0x12.1.ong_irq_usr0(USR_26/USR.32)1.ongirqiriva1.id91(FIQ26/FIQ32)1.ongirqiriva1.id92(IRQ26/IRQ32)1.ong_irq_svc3(SVC_267SVC_32).1.ong_irq_inva1.id4.1.ong_irq_inva1.id51.ong_irq_inva1.id61.ong_irq_inva1.id97-1.ong_irq_inva1.id8.1.ong_irq_inva1.id09.1.ongirqinva1.id®a1.ong_irq_inva1.ideb.1.ong.irq_inva1.idc.1.ong一irq_inva1.idd.1.ongirqinva1.id®e1.ong.irq_inva1.idf上面代码中vectorstub宏的定义为:.macrovectorstub,mime,mode,Correction=O.a1.ign5vector-name:.ifcorrectionsubIr,Ir,#correction.endifSaver,1.r_<exception>(parentPC)andspsr_<excoption>蚀(parentCPS1.Ostmiasp.(r,Ir)saver.Irmrs1r,spsrsirIr,sp,即savespsrPrepareforSVC32mode.IRQsremaindisab1.ed.mrsr,cpsreorr,r,#(mode*SVjMODE)msrSPSJCXSf,r为后面进入SVC模式做准备®thebranchtab1.emustimmediate1.yfo1.1.owthiscodeandIr,Ir,的XOf进入中断前的mod。的后4位defineVSRMODE0x00000010鲫defineFIe1.MoDE0x00000011鲍defineIRQMODE0x00000012触defin。SYJM(2E0x00000013例defineABTMODE0x00000017购defineUM1.MODE0x000000Ib鲫defineSYSTEMMODE0x0000001fmovr,sp1.<rIr,pc,Ir,Is1.#2。如果进入中断前是usr,则取出PC+4*0的内容,即irq-usr©如果进入中断前是SVc,则取出PC+4*3的内容,即_irq_svcmovspc,Ir当指令的目标存放器是PC,I1.M令以S结束,则它会把&SPSr的值恢的给CPSrbranchtohand1.erinSVCmode.endm.g1.ob1._stubs_start_StUbS_start:*Interrupt

    注意事项

    本文(arm linux内核中ARM中断实现详解.docx)为本站会员(王**)主动上传,优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知优知文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 yzwku网站版权所有

    经营许可证编号:宁ICP备2022001189号-2

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。优知文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知优知文库网,我们立即给予删除!

    收起
    展开