ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:21.46KB ,
资源ID:14325545      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14325545.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(armlinux的中断系统.docx)为本站会员(b****5)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

armlinux的中断系统.docx

1、armlinux的中断系统浅析armlinux 中断irq分发例程的派发流程之根基文章来源应用程序运行在user模式,对应arm的cpsr&15的值为0,而内核代码运行在svc模式,对应arm的cpsr&15的值为3,所以,如果应用程序在运行期间,即usr模式下,arm发生了irq中断,那么中断处理代码得知后会调用_irq_usr分发处理例程处理irq中断,如果在系统调用syscall之类使程序运行在内核空间执行内核程序的时候,即svc模式下,arm发生了irq中断,那么中断处理代码得知后会调用_irq_svc分发处理例程处理irq中断,中断程序是怎么识别svc和usr模式,进而派发相应的_i

2、rq_usr和_irq_svc分发例程的呢,来看看代码部分:.LCvswi:.word:.word:.word:.word_temp_abt_stubs_end:.equ_real_stubs_start,.LCvectors+:swiSYS_ERROR0b_real_stubs_start+(vector_undefinstr-_stubs_start)ldrpc,_real_stubs_start+(.LCvswi-_stubs_start)b_real_stubs_start+(vector_prefetch-_stubs_start)b_real_stubs_start+(vector

3、_data-_stubs_start)b_real_stubs_start+(vector_addrexcptn-_stubs_start).vector_IRQ: save mode specific registersldrr13,.LCsirqord _irq_usr域和.word _irq_svc域ldrlr,pc,lr,lsl#2ord_irq_usr 0(USR_26/USR_32)ord_irq_invalid 1(FIQ_26/FIQ_32).word_irq_invalid 2(IRQ_26/IRQ_32).word_irq_svc 3(SVC_26/SVC_32)ord_i

4、rq_invalid 4.word_irq_invalid 5.word_irq_invalid 6.word_irq_invalid 7.word_irq_invalid 8.word_irq_invalid 9.word_irq_invalid a.word_irq_invalid b.word_irq_invalid c.word_irq_invalid d.word_irq_invalid e.word_irq_invalid f.LCvswi:.word:.word:.word:.word_temp_abtARM LINUX的中断系统0概述本文描述ARM PXA255系统中断部分的实

5、现原理和代码分析。1 ARM系统异常中断介绍异常中断种类ARM支持7类异常中断,所以中断向量表设8个条目,每个条目4字节,共32字节。异常名称中断向量异常中断模式优先级复位0x0特权模式1未定义的指令0x4未定义指令中止模式6软件中断0x8特权模式6指令预取中止0x0c中止模式5数据访问中止0x10中止模式2保留0x14外部中断请求IRQ0x18IRQ模式4快速中断请求FIQ0x1cFIQ模式3 GPIO引脚PXA255拥有81个GPIO引脚。另外各个外围模块有自己的中断线。The PXA255 processor enables and controls its 81 GPIO pins t

6、hrough the use of 27 registers which configure the pin direction (input or output), pin function, pin state (outputs only), pin level detection (inputs only), and selection of alternate functions.由Interrupt Controller Pending Register (ICPR)寄存器可知:前8个中断保留,其它的都分配相应的外围模块。且其中8和9是反映GPIO0/1的。IS10用来指示GPIO2

7、-80是否有中断触发这样,ARM linux的IRQ中断数组struct irqdesc irq_descNR_IRQS中NR_IRQS应该为:#defineNR_IRQS(IRQ_GPIO(80) + 1)cvectors处给出了ARM启动时的中断向量表内容。系统通过R1-R7,ip,lr等8个寄存器做中转,把向量表转存到r0(是传入的参数,即向量表的基址)对应的地址中。另外,在向量表基址后面512字节处,拷贝了向量表具体的处理代码。.LCvectors:swiSYS_ERROR0b_real_stubs_start + (vector_undefinstr - _stubs_start)l

8、drpc, _real_stubs_start + (.LCvswi - _stubs_start)b_real_stubs_start + (vector_prefetch - _stubs_start)b_real_stubs_start + (vector_data - _stubs_start)b_real_stubs_start + (vector_addrexcptn - _stubs_start)b_real_stubs_start + (vector_IRQ - _stubs_start)b_real_stubs_start + (vector_FIQ - _stubs_sta

9、rt)ENTRY(_trap_init)stmfdsp!, r4 - r6, lradrr1, .LCvectors set up the vectorsldmiar1, r1, r2, r3, r4, r5, r6, ip, lrstmiar0, r1, r2, r3, r4, r5, r6, ip, lraddr2, r0, #0x200adrr0, _stubs_start copy stubs to 0x200adrr1, _stubs_end1:ldrr3, r0, #4strr3, r2, #4cmpr0, r1blt1bLOADREGS(fd, sp!, r4 - r6, pc)

10、IRQ中断处理流程区分系统模式下面我们以IRQ为例,分析中断处理的过程。根据向量表,其跳转到:vector_IRQ把lr值减4后保存到.Lcsirq位置。再保存spsr的值到.Lcsirq后4字节的位置。再通过设置spsr_c切换系统到特权模式。最后一步就是跳转到优先级最高的中断对应的处理函数。这里要解释一下,andlr, lr, #15取出lr(实际是spsr)的低4位。即M0-M3,也就是原来系统所处的处理器模式。ldrlr, pc, lr, lsl #2将lr的值乘4后加到PC,再将其所指地址赋给lr。注意,这里的pc值为当前指针,其加上模式值后,就会指向.LCtab_irq:表中的对应

11、项。应该只有用户模式和特权模式会产生IRQ中断,所以就只有两个有效的对应指针:_irq_usr和_irq_svc。vector_IRQ: save mode specific registersldrr13, .LCsirqsublr, lr, #4strlr, r13 save lr_IRQmrslr, spsrstrlr, r13, #4 save spsr_IRQ now branch to the relevent MODE handling routinemovr13, #I_BIT | MODE_SVCmsrspsr_c, r13 switch to SVC_32 modeandl

12、r, lr, #15ldrlr, pc, lr, lsl #2movspc, lr Changes mode and branches.LCtab_irq:.word_irq_usr0(USR_26 / USR_32).word_irq_invalid1(FIQ_26 / FIQ_32).word_irq_invalid2(IRQ_26 / IRQ_32).word_irq_svc3(SVC_26 / SVC_32).word_irq_invalid4.word_irq_invalid5.word_irq_invalid6.LCsirq:.word_temp_irq_temp_irq:.wor

13、d0 saved lr_irq.word0 saved spsr_irq.word-1 old_r0用户模式下的IRQ处理上一小节根据IRQ发生时系统模式的不同跳转到不同的处理函数。处理流程如下:首先从堆栈中留出S_FRAME_SIZE大小的空间,保存了r0-r12.再把用户模式下的sp,lr值保存起来。(note:表面位置在下一句之后,但保存位置却更靠栈顶)。再把原来保存在.Lcirq中的lr_irq,spsr_irq,old_r0保存到堆栈中。get_irqnr_and_base是一个宏,负责从中断的寄存器中读取ICIP,ICMR值,再判断是否中断,判断方法是:首先看是否存在中断,没有返回

14、0。若系统有中断,判断ICIP的8-15位,若在低位中找到中断,不再查找高位的中断标志。其中,r0返回最小的中断号,r6等于ICIP&ICMR。R5是ICMR寄存器的虚拟地址。Lr没有使用。由此可以得到:中断号越小,中断程序越优先执行。然后,通过对lr的赋值,目的是实现中断的串行化处理。然后,针对找出的中断号,调用do_IRQ处理函数。get_current_task tsk把sp的低13清0。tsk.reqr9 current task_irq_usr:subsp, sp, #S_FRAME_SIZECirqaddr8, sp, #S_PCldmiar4, r5 - r7 get saved

15、 PC, SPSRstmiar8, r5 - r7 save pc, psr, old_r0stmdbr8, sp, lralignment_trap r4, r7, _temp_irqzero_fp1:get_irqnr_and_base r0, r6, r5, lrmovner1, sp将当前堆栈指针赋给r1adrsvcne, lr, 1b 通过设置lr,使实现了对中断的串行处理 routine called with r0 = irq number, r1 = struct pt_regs *bnedo_IRQmovwhy, #0get_current_task tskbret_to_u

16、ser do_irq处理主要的处理流程为:desc = irq_desc + irq;vector_FIQ:disable_fiqsubspc, lr, #4 PXA255开发板中断的初始化start_kernel()函数的初始化过程中,调用init_IRQ()进行开发板具体中断的初始化。for (irq = 0; irq init_irq;而mdesc-init_irq就是在/match-pxa/中定义的。static void _init xhyper255_init_irq(void)pxa_init_irq();set_GPIO_IRQ_edge( 0, GPIO_RISING_EDG

17、E);/* Ethernet Interrupt */#ifdef CONFIG_ARCH_XHYPER255Bset_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(IRQ_GPIO_ADS7843), GPIO_FALLING_EDGE); /* ADS7843 touch controller */set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(IRQ_GPIO_EZHOST),GPIO_RISING_EDGE);/* EZ-Host USB HOST controller */#elif defined(CONFIG_ARCH_XHYPER255A)

18、set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(IRQ_GPIO_ADS7843), GPIO_FALLING_EDGE); /* ADS7843 touch controller */#endif通过调用pxa_init_irq()完成PXA255的中断初始化。包括:设置相关寄存器:/* disable all IRQs */ICMR = 0;*/for (irq = IRQ_GPIO0; irq = IRQ_GPIO1; irq+) irq_descirq.valid= 0;irq_descirq.probe_ok= 1;irq_descirq.mask_ack= p

19、xa_mask_and_ack_GPIO_0_1_irq;irq_descirq.mask= pxa_mask_GPIO_0_1_irq;irq_descirq.unmask= pxa_unmask_GPIO_0_1_irq;for (irq = IRQ_GPIO_2_80; irq = IRQ_RTCAlrm; irq+) irq_descirq.valid= 1;irq_descirq.probe_ok= 0;irq_descirq.mask_ack= pxa_mask_irq;irq_descirq.mask= pxa_mask_irq;irq_descirq.unmask= pxa_u

20、nmask_irq;/* Those are reserved */irq_descPXA_IRQ(15).valid = 0;irq_descPXA_IRQ(16).valid = 0;for (irq = IRQ_GPIO(2); irq = IRQ_GPIO(80); irq+) irq_descirq.valid= 0;irq_descirq.probe_ok= 1;irq_descirq.mask_ack= pxa_mask_and_ack_GPIO_2_80_irq;irq_descirq.mask= pxa_mask_GPIO_2_80_irq;irq_descirq.unmas

21、k= pxa_unmask_GPIO_2_80_irq;设置ARM的ICPR的第10位,用来指示GPIO2-80引脚是否有中断发生。GPIO80:2 Edge Detect Interrupt Pending0 Interrupt NOT pending due to edge detect on one (or more) of GPIO80:2.1 Interrupt pending due to edge detect on one (or more) of GPIO80:2.注意,GPIO2-GPIO80这些引脚是没有直接接中断线的,它们是否有边沿触发,完全通过ICPR的第10来判断。当发现GPIO2-80引脚有中断时,首先触发的是ICPR中的第10位中断,该中断通过调用setu

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2