资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
第11页 / 共46页
第12页 / 共46页
第13页 / 共46页
第14页 / 共46页
第15页 / 共46页
第16页 / 共46页
第17页 / 共46页
第18页 / 共46页
第19页 / 共46页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式处理器的结构和编程,中断系统,学习要点,ARM中断系统,中断向量表,LPC2000中断系统,VIC中断控制器,ARM体系的中断系统,只要正常的程序流被暂时中止,处理器就进入异常模式。,例如响应一个来自外设的中断。,在处理异常之前,ARM7TDMI内核保存当前的处理器状态,这样当处理程序结束时可以恢复执行原来的程序。,对于每一个异常事件,都有一个与之相对应的处理程序,它们是关联在一起的,并以一张一维表的格式存储在存储器的固定单元中。这张指定了各异常中断及其处理程序的对应关系的表,称为,异常向量表,。,异常向量表,地址,异常类型,进入时的模式,进入时I的状态,进入时F的状态,0 x0000 0000,复位,管理,禁止,禁止,0 x0000 0004,未定义指令,未定义,I,F,0 x0000 0008,软件中断,管理,禁止,F,0 x0000 000C,中止(预取),中止,I,F,0 x0000 0010,中止(数据),中止,I,F,0 x0000 0014,保留,保留,0 x0000 0018,IRQ,中断,禁止,F,0 x0000 001C,FIQ,快中断,禁止,禁止,注,:表中的I和F表示不对该位有影响,保留原来的指。,异常优先级,当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:,异常类型,优先级,复位,1(最高优先级),数据中止,2,FIQ,3,IRQ,4,预取中止,5,未定义指令,6,SWI,7(最低优先级),优先级降低,程序A,IRQ服务程序,系统模式,IRQ模式,程序,寄存器组,图示进入异常过程,1.程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;,2.用户程序运行时发生IRQ中断,硬件完成以下动作:,LR_sys,SPSR_irq,LR_irq,LR,PC,CPSR,SPSR,SYS,1,?,0,.,?,?,?,?,MOD,T,F,I,.,N,Z,C,V,置位,I,位(禁止,IRQ,中断),清零,T,位(进入,ARM,状态),设置,MOD,位,切换处理器模式至,IRQ,模式,将下一条指令的地址存入,IRQ,模式的,LR,寄存器,将,CPSR,寄存器内容存入,IRQ,模式的,SPSR,寄存器,将跳转地址存入,PC,,实现跳转,IRQ,0,?,1,.,?,?,?,?,BackAddr,JumpAddr,Jump,SYS,1,?,0,.,?,?,?,?,“?”表示对该位不关心,在异常处理结束后,异常处理程序完成以下动作:,程序A,IRQ服务程序,系统模式,IRQ模式,程序,寄存器组,图示退出异常过程,LR_sys,SPSR_irq,LR_irq,LR,PC,CPSR,SPSR,SYS,1,?,0,.,?,?,?,?,MOD,T,F,I,.,N,Z,C,V,将,SPSR,寄存器的值复制回,CPSR,寄存器;,将,LR,寄存的值减去一个常量后复制到,PC,寄存器,跳转到被中断的用户程序。,IRQ,0,?,1,.,?,?,?,?,BackAddr,JumpAddr,return,SYS,1,?,0,.,?,?,?,?,SYS,1,?,0,.,?,?,?,?,BackAddr-4,Jump,“?”表示对该位不关心,异常入口/出口汇总,异常或入口,返回指令,之前的状态,备注,ARM R14_x,Thumb R14_x,BL,MOV PC,R14,PC+4,PC+2,此处PC为BL,SWI,为定义的指令取指或预取指中止指令的地址,SWI,MOVS PC,R14_svc,PC+4,PC+2,未定义的指令,MOVS PC,R14_und,PC+4,PC+2,预取指中止,SUBS PC,R14_abt,#4,PC+4,PC+4,快中断,SUBS PC,R14_fiq,#4,PC+4,PC+4,此处PC为由于FIQ或IRQ占先而没有被执行的指令的地址,中断,SUBS PC,R14_irq,#4,PC+4,PC+4,数据中止,SUBS PC,R14_abt,#8,PC+8,PC+8,此处,PC,为产生数据中止的装载或保存指令的地址。,复位,无,复位时保存在,R14_svc,中的值不可预知。,注意,:“MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14指令。“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等指令也是类似的。,异常的入口和出口处理,如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。,SUB LR,LR,#4;计算返回地址,STMFD SP!,R0-R3,LR;保存使用到的寄存器,.,LDMFD SP!,R0-R3,PC;中断返回,中断处理代码的开始部分和退出部分,中断处理代码的开始部分和退出部分,异常的入口和出口处理,SUB LR,LR,#4;计算返回地址,STMFD SP!,R0-R3,LR;保存使用到的寄存器,.,LDMFD SP!,R0-R3,PC;中断返回,注意,:中断返回指令的寄存器列表(其中必须包括PC)后的“,”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针应必须在系统启动时初始化。,复位异常,当nRESET信号被拉低时,ARM处理器放弃正在执行的指令。,当你RESET信号再次变为高电平时,ARM处理器执行以下操作:,强制M4:0=10011,系统进入管理模式;,将CPSR的I和F置位,禁止中断和快速中断;,将CPSR的T清零,处理器出入ARM状态;,强制PC清零;,系统返回ARM状态并回复执行。,中断请求,中断请求(IRQ)异常是一个由nIRQ输入端的低电平所产生的正常中断。,IRQ的优先级低于FIQ。任何时候在一个特权模式下,都可通过置位CPSR中的I 位来禁止IRQ。,不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:,SUBS PC,R14_fiq,#4,异常向量,地址,异常类型,进入时的模式,进入时I的状态,进入时F的状态,0 x0000 0000,复位,管理,禁止,禁止,0 x0000 0004,未定义指令,未定义,I,F,0 x0000 0008,软件中断,管理,禁止,F,0 x0000 000C,中止(预取),中止,I,F,0 x0000 0010,中止(数据),中止,I,F,0 x0000 0014,保留,保留,0 x0000 0018,IRQ,中断,禁止,F,0 x0000 001C,FIQ,快中断,禁止,禁止,注,:表中的I和F表示不对该位有影响,保留原来的指。,该位置被Boot装载程序用作有效用户程序的检测标志。通过定义此保留值,使向量表所有数据32位累加和为0,芯片复位后才能脱机运行用户程序。,启动代码中的异常向量表的构建,一般在32位ARM应用系统中,大多数采用C语言进行软件编程。但是在运行应用代码前需要进行系统初始化。,常用一个汇编文件作启动代码,它可以实现:,异常向量表定义,堆栈初始化,系统变量初始化,中断系统初始化,I/O初始化,地址重映射等操作。,位于启动代码中的异常向量表,CODE32,AREA vectors,CODE,READONLY,ENTRY,Reset,LDR PC,ResetAddr,LDR PC,UndefinedAddr,.,DCD 0 xb9205f80,LDR PC,PC,#-0 xff0,LDR PC,FIQ_Addr,ResetAddr DCD ResetInit,UndefinedAddr DCD Undefined,.,Nouse DCD 0,IRQ_Addr DCD 0,FIQ_Addr DCD FIQ_Handler,前32字节为异常入口,后32字节为跳转地址,异常向量表,位于启动代码中的异常向量表,CODE32,AREA vectors,CODE,READONLY,ENTRY,Reset,LDR PC,ResetAddr,LDR PC,UndefinedAddr,.,DCD 0 xb9205f80,LDR PC,PC,#-0 xff0,LDR PC,FIQ_Addr,ResetAddr DCD ResetInit,UndefinedAddr DCD Undefined,.,Nouse DCD 0,IRQ_Addr DCD 0,FIQ_Addr DCD FIQ_Handler,异常向量表,例如:发生未定义异常时,1.程序计数器(PC)指向0 x00000004;,2.执行当前的指令,将Undefined地址值装入PC,实现至未定义异常处理程序的跳转。,装入,位于启动代码中的异常向量表,CODE32,AREA vectors,CODE,READONLY,ENTRY,Reset,LDR PC,ResetAddr,LDR PC,UndefinedAddr,.,DCD 0 xb9205f80,LDR PC,PC,#-0 xff0,LDR PC,FIQ_Addr,ResetAddr DCD ResetInit,UndefinedAddr DCD Undefined,.,Nouse DCD 0,IRQ_Addr DCD 0,FIQ_Addr DCD FIQ_Handler,异常向量表,注意:,异常向量表中程序跳转使用LDR指令,而没有使用B指令。,原因:,1.LDR指令可以全地址范围跳转,而B指令只能在前后32MB范围内跳转;,2.芯片具有Remap功能。当向量表位于内部RAM或外部存储器中,用B指令不能跳转到正确的位置。,B ResetAddr,有效用户代码的判别,Reset,0 xe59ff018 ldr pc,ResetAddr,0 xe59ff018 ldr pc,UndefinedAddr,.,0 xb9205f80 dcd 0 xb9205f80,0 xe51ffff0 ldr pc,0 x7ffff030,0 xe59ff018 ldr pc,FIQ_Addr,ResetAddr,0 x8000008c dcd 0 x8000008c,UndefinedAddr,0 x80000040 dcd 0 x80000040,.,Nouse,0 x00000000 dcd 0 x00000000,IRQ_Addr,0 x00000000 dcd 0 x00000000,FIQ_Addr,0 x8000004c dcd 0 x8000004c,异常向量表,反汇编代码,前32字节为异常入口,后32字节为跳转地址,有效用户代码的判别,Reset,0 xe59ff018 ldr pc,ResetAddr,0 xe59ff018 ldr pc,UndefinedAddr,.,0 xb9205f80 dcd 0 xb9205f80,0 xe51ffff0 ldr pc,0 x7ffff030,0 xe59ff018 ldr pc,FIQ_Addr,ResetAddr,0 x8000008c dcd 0 x8000008c,UndefinedAddr,0 x80000040 dcd 0 x80000040,.,Nouse,0 x00000000 dcd 0 x00000000,IRQ_Addr,0 x00000000 dcd 0 x00000000,FIQ_Addr,0 x8000004c dcd 0 x8000004c,异常向量表反汇编代码,指令的机器码,指令,有效用户代码的判别,Reset,0 xe59ff018 ldr pc,ResetAddr,0 xe59ff018 ldr pc,UndefinedAddr,.,0 xb9205f80 dcd 0 xb9205f80,0 xe51ffff0 ldr
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6