




免费预览已结束,剩余14页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,entry-armv.S.macroirq_handler1: get_irqnr_and_base r0, r6, r5, lrmovne r1, sp routine called with r0 = irq number, r1 = struct pt_regs *adrne lr, 1b返回到1处,asm_do_IRQ返回后将再次查询发生的中断bne asm_do_IRQkernel的中断处理函数.endm2,entry-macro.S下面这个宏查询ISPR(IRQ待定中断服务寄存器,当有需要处理的中断时,这个寄存器的相应位会置位,任意时刻,最多一个位会置位),计算出的中断号放在irqnr指定的寄存器中;这个宏在不同的ARM芯片上是不一样的,下面是s3c44b0x的定义.macroget_irqnr_and_base,irqnr, irqstat, base, tmpldr base, =S3C44B0X_I_ISPR装入中断服务寄存器地址ldr base, base装入中断服务寄存器值mov irqnr, #02222:tst base, #1测试中断位bne 1111fOK,找到add irqnr, irqnr, #1中断号加1mov base, base, lsr #1中断服务寄存器值右移1位,比较下一位cmp irqnr, #NR_IRQS比较一下,是不是超出了总的中断号bcc 2222b还没找到,继续1111:.endm3,下面这个宏是所有中断服务过程进入时的前序,主要是在当前堆栈上分配一个pt_regs结构,把r0-r15以及cpsr等保存到这个结构中,在进入irq_handler时,sp指向pt_regs底端.macrosvc_entrysub sp, sp, #S_FRAME_SIZEsizeof(pt_regs),分配一个pt_regs结构stmib sp, r1 - r12保存r1-r12ldmia r0, r1 - r3r0指向何处?这个地方的内容是什么?参见4节(1)(2)处add r5, sp, #S_SPS_SP为sp寄存器在pt_regs中的偏移mov r4, #-1ORIG_r0=-1?add r0, sp, #S_FRAME_SIZEr0为中断前的堆栈指针,将成为pt_regs中的sp的值str r1, sp save the real r0 copiedfrom the exception stackmov r1, lr We are now ready to fill in the remaining blanks on the stack: r0 - sp_svc r1 - lr_svc r2 - lr_, already fixed up for correct return/restart r3 - spsr_ r4 - orig_r0 (see pt_regs definition in ptrace.h)stmia r5, r0 - r4.endm4,.macrovector_stub, name, mode, correction=0.align 5vector_name:.ifcorrectionsub lr, lr, #correction修正返回地址,如果必要的话.endif Save r0, lr_(parent PC) and spsr_ (parent CPSR)stmia sp, r0, lr save r0, lr(1)(为什么向上长呢?)mrs lr, spsrstr lr, sp, #8 save spsr Prepare for SVC32 mode. IRQs remain disabled.mrs r0, cpsreor r0, r0, #(mode SVC_MODE)msr spsr_cxsf, r0 the branch table must immediately follow this codeand lr, lr, #0x0f这里时,lr的值是spsr的值,因此,这个指令之后lr的值为spsr0-3,即,系统模式的低4位mov r0, sp(2)ldr lr, pc, lr, lsl #2lr = pc+lr2,usr:pc,fiq:pc+4,irq:pc+8,svc:pc+12,abt:pc+28,und:pc+44,system:pc+60movs pc, lr branch to handler in SVC mode.endm对于irq中断,会这样调用上面这个宏:vector_stub irq, IRQ_MODE, 45,中断处理过程总体结构,当中断发生后控制先转移到4,然后跳转到_irq_svc_irq_svc:svc_entryirq_handlerldr r0, sp, #S_PSR irqs are already disabled,S_PSR为cpsr在pt_regs中的偏移;sp指向在svc_entry中分配的pt_regs结构msr spsr_cxsf, r0恢复spsrldmia sp, r0 - pc load r0 - pc, cpsr.global _stub_start_stub_start:vector_stub irq , IRQ_MODE ,4.long _irq_usr.long _irq_invalid.long _irq_invalid.long _irq_svc.long _irq_invalid.以下与irq中断无关,但是是arm整个异常处理结构的一部分,因此列示在这里vector_stub dabt, ABT_MODE, 8.vector_stub pabt, ABT_MODE, 4.vector_stub und, UND_MODE.vector_fiq:.vector_addrexcptn:.LCvswi:.globl _stubs_end_stubs_end:.下面这些才是最初的入口点,_vector_start和_vector_end之间的代码会被移动到CONFIG_VECTORS_BASE开始的地方,例如0xc000000.globl _vectors_start_vectors_start:swi SYS_ERROR0Resetb vector_und + stubs_offsetUndefined instructionldr pc, .LCvswi + stubs_offsetswi instructionb vector_pabt + stubs_offsetPrefetch Abortb vector_dabt + stubs_offsetData Abortb vector_addrexcptn + stubs_offsetARM reservedbvector_irq+ stubs_offsetIRQb vector_fiq + stubs_offsetFIQ.globl _vectors_end_vectors_end:.附录1,arm体系下pt_regs结构structpt_regs long uregs18;uregs0 - uregs17分别对应,r0 - r15,cpsr,ORIG_r0附录1,irq中断时堆栈的变化-spsr-lr ,中断返回地址,修正后的-r0- -进入irq_svc之前,sp的值,也是r0的值pt_regs- create_mapping()函数5-2-2/浅析arm-linux系统调用的流程/文章1:/u1/38994/showart_333925.html/文章2:/u1/38994/showart_353785.html/文章3:/u1/38994/showart_331915.html/为了更好理解上面的这几篇文章,最好先看看浅析armlinux2.4.19启动程序head-armv.s文件/文章4:/u1/38994/showart_346701.htmlb_real_stubs_start+(vector_IRQ-_stubs_start)b_real_stubs_start+(vector_FIQ-_stubs_start)./2.archarmkernelentry-armv.S.vector_IRQ: save mode specific registersldrr13,.LCsirq/取出LCsirq变量的地址,用来存放lrsublr,lr,#4/lr-4,这是arm必须的strlr,r13/将计算之后的返回地址lr存入LCsirq变量/读取此次irq中断发生时,cpu所处模式spsr,即,中断发生时cpu正在用户空间运行用户应用程序,/还是在内核空间svc模式下运行内核代码,lr&15的数值为arm进入irq之前cpu运行的模式值/如果lr&15=0表示,此次irq中断发生时,cpu正运行用户空间的用户程序,/如果lr&15=3表示,此次irq中断发生时,cpu正运行内核空间的内核代码gliethttp_20071225mrslr,spsrstrlr,r13,#4mrsr13,cpsrbicr13,r13,#MODE_MASKorrr13,r13,#I_BIT|MODE_SVC/切换到svc模式,因为当前cpsr为irq模式,所以可以修改cpsr,/注意在usr模式下cpsr的数值,即使使用了msr spsr_c, r13赋值语句,/因为usr模式不允许修改cpsr,所以r13的数值并不能被真正赋值给spsr,/执行完赋值语句之后,spsr的数值不会发生任何改变,仍然是原来的值gliethttp_20071225msrspsr_c,r13andlr,lr,#15/lr&15的值为发生irq之前cpu所在的空间,/0:在用户空间发生了irq中断/3:在内核空间发生了irq中断/lr= NR_IRQS | !irq_descirq.valid | !handler |(irq_flags & SA_SHIRQ & !dev_id)return -EINVAL;action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL);if (!action) /* 生成action结构*/return -ENOMEM;action-handler = handler;action-flags = irq_flags;action-mask = 0;action-name = devname;action-next = NULL;action-dev_id = dev_id;retval = setup_arm_irq(irq, action); /*把中断号irq和action 对应起来*/if (retval)kfree(action);return retval;其中第一个参数irq就是中断向量,第二个参数即是要注册的中断服务程序。很多同仁可能疑惑的是,我们要注册的中断向量号是怎么确定的呢?这要根据具体芯片的中断控制器,比如三星的S3C2410,需要通过读取其中的中断状态寄存器,来获得是哪个设备发生了中断:if defined(CONFIG_ARCH_S3C2410)#include .macro disable_fiq.endm.macro get_irqnr_and_base, irqnr, irqstat, base, tmpmov r4, #INTBASE virtual address of IRQ registersldr irqnr, r4, #0x8 read INTMSK 中断掩码寄存器ldr irqstat, r4, #0x10 read INTPND 中断寄存器bics irqstat, irqstat, irqnrbics irqstat, irqstat, irqnrbeq 1002fmov irqnr, #01001: tst irqstat, #1bne 1002f found IRQadd irqnr, irqnr, #1mov irqstat, irqstat, lsr #1cmp irqnr, #32bcc 1001b1002:.endm.macro irq_prio_table.endm以上代码也告诉了我们,中断号的确定,其实是和S3C2410手册中SRCPND寄存器是一致的,即:/* Interrupt Controller */#define IRQ_EINT0 0 /* External interrupt 0 */#define IRQ_EINT1 1 /* External interrupt 1 */#define IRQ_EINT2 2 /* External interrupt 2 */#define IRQ_EINT3 3 /* External interrupt 3 */#define IRQ_EINT4_7 4 /* External interrupt 4 7 */#define IRQ_EINT8_23 5 /* External interrupt 8 23 */#define IRQ_RESERVED6 6 /* Reserved for future use */#define IRQ_BAT_FLT 7#define IRQ_TICK 8 /* RTC time tick interrupt */#define IRQ_WDT 9 /* Watch-Dog timer interrupt */#define IRQ_TIMER0 10 /* Timer 0 interrupt */#define IRQ_TIMER1 11 /* Timer 1 interrupt */#define IRQ_TIMER2 12 /* Timer 2 interrupt */#define IRQ_TIMER3 13 /* Timer 3 interrupt */#define IRQ_TIMER4 14 /* Timer 4 interrupt */#define IRQ_UART2 15 /* UART 2 interrupt */#define IRQ_LCD 16 /* reserved for future use */#define IRQ_DMA0 17 /* DMA channel 0 interrupt */#define IRQ_DMA1 18 /* DMA channel 1 interrupt */#define IRQ_DMA2 19 /* DMA channel 2 interrupt */#define IRQ_DMA3 20 /* DMA channel 3 interrupt */#define IRQ_SDI 21 /* SD Interface interrupt */#define IRQ_SPI0 22 /* SPI interrupt */#define IRQ_UART1 23 /* UART1 receive interrupt */#define IRQ_RESERVED24 24#define IRQ_USBD 25 /* USB device interrupt */#define IRQ_USBH 26 /* USB host interrupt */#define IRQ_IIC 27 /* IIC interrupt */#define IRQ_UART0 28 /* UART0 transmit interrupt */#define IRQ_SPI1 29 /* UART1 transmit interrupt */#define IRQ_RTC 30 /* RTC alarm interrupt */#define IRQ_ADCTC 31 /* ADC EOC interrupt */#define NORMAL_IRQ_OFFSET 32这些宏定义在文件irqs.h中,大家可以看到它的定义取自S3C2410的文档。总结 linux在初始化的时候已经把每个中断向量的地址准备好了!就是说添加中断服务程序的框架已经给出,当某个中断发生时,将会到确定的地址处去找指令,所以我们做驱动程序时,只需要经过request_irq来挂接自己编写的中断服务程序即可。对于快速中断,linux在初始化时是空的,所以要对它挂接中断处理程序,就需要单独的函数set_fiq_handler来实现,此函数在源文件fiq.c中,有兴趣的读者可进一步研究。ARM LINUX的中断系统0概述本文描述ARM PXA255系统中断部分的实现原理和代码分析。1 ARM系统异常中断介绍1.1异常中断种类ARM支持7类异常中断,所以中断向量表设8个条目,每个条目4字节,共32字节。异常名称中断向量异常中断模式优先级复位0x0特权模式1未定义的指令0x4未定义指令中止模式6软件中断0x8特权模式6指令预取中止0x0c中止模式5数据访问中止0x10中止模式2保留0x14外部中断请求IRQ0x18IRQ模式4快速中断请求FIQ0x1cFIQ模式31.2 GPIO引脚PXA255拥有81个GPIO引脚。另外各个外围模块有自己的中断线。The PXA255 processor enables and controls its 81 GPIO pins through 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-80是否有中断触发?这样,ARM linux的IRQ中断数组struct irqdesc irq_descNR_IRQS中NR_IRQS应该为:#defineNR_IRQS(IRQ_GPIO(80) + 1)/32-2+80 8 +1 =103。GPIO引脚的一个问题:alternate function?2 linux对中断的支持2.1中断向量表初始化在kernel_start()初始化中的trap_init()完成ARM的中断向量表的构造。trap_init()执行的是entry-armv.S文件中的ENTRY(_trap_init)。其中.Lcvectors处给出了ARM启动时的中断向量表内容。系统通过R1-R7,ip,lr等8个寄存器做中转,把向量表转存到r0(是传入的参数,即向量表的基址)对应的地址中。另外,在向量表基址后面512字节处,拷贝了向量表具体的处理代码。.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_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_start)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)2.2IRQ中断处理流程2.2.1区分系统模式下面我们以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:表中的对应项。应该只有用户模式和特权模式会产生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 modeandlr, 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:.word0 saved lr_irq.word0 saved spsr_irq.word-1 old_r02.2.2用户模式下的IRQ处理上一小节根据IRQ发生时系统模式的不同跳转到不同的处理函数。处理流程如下:首先从堆栈中留出S_FRAME_SIZE大小的空间,保存了r0-r12.再把用户模式下的sp,lr值保存起来。(note:表面位置在下一句之后,但保存位置却更靠栈顶)。再把原来保存在.Lcirq中的lr_irq,spsr_irq,old_r0保存到堆栈中。get_irqnr_and_base是一个宏,负责从中断的寄存器中读取ICIP,ICMR值,再判断是否中断,判断方法是:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玩具超声波焊接工艺考核试卷及答案
- 木饰面涂装颜色匹配验收工艺考核试卷及答案
- 陶瓷熔融脱铪处理工艺考核试卷及答案
- 棉花收获后处理工艺考核试卷及答案
- 泰山银行笔试题及答案
- 商业银行内部面试题及答案
- 高层建筑电梯安装工程实施路径研究
- 风险决策中不确定性容忍度的作用机制与边界条件研究
- 解放军进行曲课件
- 2025年太阳能硅片硅碇行业市场前景预测:技术创新驱动产业升级
- 安全伴我行-大学生安全教育知到智慧树章节测试课后答案2024年秋哈尔滨工程大学
- 有害物质过程管理系统HSPM培训教材
- 2025年蛇年年会汇报年终总结大会模板
- 存款代持协议书范文模板
- DB3301T 0374-2022 疗休养基地评价规范
- 胖东来企业文化指导手册
- 北师大版八年级物理(上册)期末复习题及答案
- 【历年真题合集+答案解析】2024年教资高中历史
- 委托别人找工作的协议
- 医技三基三严知识模拟习题含参考答案
- Y -S-T 732-2023 一般工业用铝及铝合金挤压型材截面图册 (正式版)
评论
0/150
提交评论