收藏 分享(赏)

第7章-cortex-m3-异常和中断.pptx

上传人:天天快乐 文档编号:967863 上传时间:2018-05-09 格式:PPTX 页数:52 大小:910.19KB
下载 相关 举报
第7章-cortex-m3-异常和中断.pptx_第1页
第1页 / 共52页
第7章-cortex-m3-异常和中断.pptx_第2页
第2页 / 共52页
第7章-cortex-m3-异常和中断.pptx_第3页
第3页 / 共52页
第7章-cortex-m3-异常和中断.pptx_第4页
第4页 / 共52页
第7章-cortex-m3-异常和中断.pptx_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、第7章 Cortex-M3 异常和中断7.1 异常7.2 NVIC 和中断控制,1,7.1.1 异常类型所有能打断正常执行流的事件都称为异常。CM3支持为数众多的系统异常和外部中断。编号为115的对应系统异常;编号为16255的对应外部中断大部分的异常可编程优先级,其中很少的一些有固定的优先级。当前运行的异常值,是由特殊寄存器IPSR或NVIC的中断控制状态寄存器表示的。,2,7.1 异常,3,4,续,7.1.2 优先级定义在CM3中,优先级决定一个异常是否能被掩蔽,以及在未掩蔽的情况下何时可以响应。优先级的数值越小,则优先级越高。CM3支持中断嵌套,使得高优先级异常会抢占(preempt)低

2、优先级异常。3个系统异常:复位,NMI以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都是可编程的。CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。但是,绝大多数CM3芯片都会精简设计,裁掉表达优先级的几个低端有效位,以减少优先级的级数,如8级,16级,32级等。,5,3 比特优先级,4比特优先级,优先级寄存器的最小宽度值为3比特。,6,3位或4位宽度的可用优先级,7,通过让优先级以MSB对齐,可以简化程序的跨器件移植。,分别使用3-bit, 5-bit, 和8-bit 优先级寄存器的使用情况:,8,抢

3、占优先级和亚优先级通过NVIC中“应用程序中断及复位控制寄存器”的位段“PRIGROUP优先级组”设置。该位段的值对每一个优先级可配置的异常都有影响,把其优先级分为2个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级。,抢占优先位段和亚优先级位段在优先级寄存器中的定义,9,应用程序中断和复位控制寄存器(地址0xE000ED0C),10,11,12,7.1.3 向量表响应异常时,CM3需要定位其服务例程的入口地址。这些入口地址存储在所谓的“(异常)向量表”中。缺省情况下,CM3认为该表位于零地址处,且各向量占用4字节。,上电后的异常向量表,13,通过设置N

4、VIC中的向量表偏移寄存器,可以将向量表重定位到其它的内存地址。向量表的起始地址:先求出系统中共有多少个向量,再把这个数字向上“圆整”到2的整次幂,而起始地址必须对齐到后者的边界上。例:如果一共有32个中断,则共有32+16(系统异常)=48个向量,向上圆整到2的整次幂后值为64,因此向量表重定位的地址必须能被64*4=256整除,合法的起始地址为:0x0, 0x100, 0x200等。,14,向量表偏移寄存器(地址0xE000ED08),7.1.4 中断输入和挂起行为当中断输入脚被置为有效(assert)后,该中断就被悬起。即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。到

5、了系统中它的优先级最高的时候,就会得到响应。 如果在某个中断得到响应之前,其悬起状态被清除了(例如,在PRIMASK或FAULTMASK置位的时候软件清除了悬起状态标志),则中断被取消。,中断挂起,15,中断在得到处理器响应之前被清除悬起状态,当处理器开始执行一个中断,中断被激活,同时挂起位将被自动清除。,在处理器进入服务例程后对中断活跃状态的设置,16,如果一个中断源持续保持中断响应型号活跃,在中断服务程序结束时,中断将被再次挂起。,在中断结束后,连续中断请求再次挂起,17,如果一个中断在处理器执行前有多次脉冲,它将被视为一次中断请求,而不是多次。,18,如果在服务例程执行时,中断请求释放了

6、,但是在服务例程返回前又重新被置为有效,则CM3会记住此动作,重新悬起该中断。,19,7.1.5 Fault异常有若干个系统异常专用于fault处理。CM3中的Faults可分为以下几类: 总线faults 存储器管理faults 用法faults 硬faults,20,(1)总线错误当在AHB接口数据传输过程中一个错误响应被接收时,产生总线Fault:1. 取指令2. 数据读/写3. 在中断进程开始的压栈4. 中断进程结束时的出栈5. 当处理器开始中断句柄序列时,读一个中断向量地址,欲使能总线fault服务例程,需要在NVIC的“系统Handler控制及状态寄存器”中置位BUSFAULTEN

7、A位。发生了总线fault后,可通过NVIC中的“总线fault状态寄存器”(BFSR)确定产生fault的场合。,21,总线错误状态寄存器(0xE000ED29),(2) 内存管理错误常见的内存管理错误包括: 访问了所有MPU regions覆盖范围之外的地址 访问了没有存储器与之对应的空地址 往只读region写数据 用户级下访问了只允许在特权级下访问的地址,22,内存管理错误寄存器MFSR(0xE000ED28),(3) 用法错误可以引起用法错误的有:执行了协处理器指令。Cortex-M3本身并不支持协处理器,但是通过fault异常机制,可以建立一套“软件模拟”的机制,来执行一段程序模拟

8、协处理器的功能,从而可以方便地在其它Cortex处理器间移植。 执行了未定义的指令。同上一点的道理,亦可以软件模拟未定义指令的功能。 尝试进入ARM状态。因为CM3不支持ARM状态,所以用法fault会在切换时产生。软件可以利用此机制来测试某处理器是否支持ARM状态。 无效的中断返回(LR中包含了无效/错误的值) 使用多重加载/存储指令时,地址没有对齐。 另外,可以让CM3在遇到除数为零的时候,以及遇到未对齐访问的时候也产生用法fault。在NVIC中有两个控制位分别与它们对应。通过设置这两个控制位,就可以激活它们。,23,NVIC提供一个用法错误寄存器 (UFSR) 使得用法错误异常程序能够

9、确定错误的原因。,用法错误寄存器(0xE000ED2A),24,(4) 硬Fault可以引起硬件错误的有:用法错误,总线错误,内存管理错误获取向量时产生的总线错误,硬件错误寄存器(0xE000ED2C),25,如何处理错误在一个真实运行的系统中,在检查到错误的原因后,软件需要决定下一步要做什么。一些错误处理办法:复位 通过设置NVIC“应用程序中断及复位控制寄存器”中的VECTRESET位,将只复位处理器内核而不复位其它片上设施。恢复 解决产生fault的问题。例如,如果程序尝试访问了协处理器,可以通过一个协处理器的软件模拟器来解决此问题。 中止 如果系统运行了一个RTOS,则相关的任务可以被

10、终结或者重新开始。,26,7.1.6 SVC 和PendSVSVC (系统服务调用) :用于产生系统函数的调用请求。,27,使用SVC 指令产生SVC SVC 0x3 ; Call SVC function 3,28,PendSV (挂起的系统调用) :用于在不同任务之间切换(上下文切换)。可以像普通的中断一样被悬起。,两个任务间通过SysTick 轮转调度的简单模式,29,发生IRQ 时上下文切换的问题,30,PendSV异常会自动延迟上下文切换的请求,直到其它的ISR都完成了处理后才执行PendSV异常。一般需要把PendSV编程为最低优先级的异常。,1. 任务A呼叫SVC来请求任务切换(

11、例如,等待某些工作完成) 2. OS接收到请求,做好上下文切换的准备,并且悬起一个PendSV异常。 3. 当CPU退出SVC后,它立即进入PendSV,从而执行上下文切换。 4. 当PendSV执行完毕后,将返回到任务B,同时进入线程模式。 5. 发生了一个中断,并且中断服务程序开始执行 6. 在ISR执行过程中,发生SysTick异常,并且抢占了该ISR。 7. OS执行必要的操作,然后悬起PendSV异常以作好上下文切换的准备。 8. 当SysTick退出后,回到先前被抢占的ISR中,ISR继续执行 9. ISR执行完毕并退出后,PendSV服务例程开始执行,并且在里面执行上下文切换 1

12、0. 当PendSV执行完毕后,回到任务A,同时系统再次进入线程模式。,31,7.2.1 NVIC 概述NVIC:Nested Vectored Interrupt ControllerNVIC 支持1 到240 外部中断输入和一个 不可屏蔽中断 (NMI) 输入。NVIC 可以通过内存地址0xE000E000访问。大多数中断控制/状态寄存器只能够在特权模式下访问(例外:软件触发中断寄存器可以在用户级下访问以产生软件中断)。所有的中断控制状态寄存器均可按字半字字节的方式访问。,32,7.2 NVIC 和中断控制,7.2.2 基本中断配置每个外部中断有一些相应的寄存器,包括:1. 使能和清除使能

13、寄存器2. 设置挂起和清除挂起寄存器3. 优先级寄存器4. 活动状态寄存器下列寄存器也可以影响中断处理1. 异常屏蔽寄存器(PRIMASK, FAULTMASK以及BASEPRI) 2. 向量表偏移寄存器3. 软件触发中断寄存器4. 优先级分组位段,33,34,7.2.3 中断使能和清使能中断的使能与除能分别使用各自的寄存器来独立控制:CM3中可以有240对使能位除能位(SETENA位/CLRENA位)。欲使能一个中断,写1到对应SETENA的位中;欲除能一个中断,写1到对应的CLRENA位中。如果往它们中写0,则不会有任何效果。SETENA: 0xE000E100-0xE000E11CCLR

14、ENA: 0xE000E180-0xE000E19C,35,SETENA/CLRENA寄存器族,36,7.2.4 中断挂起和清除如果一个中断发生,但是不能够立刻执行,它将被挂起。中断挂起状态 可以通过设置中断挂起(SETPEND) 和清除挂起(CLRPEND) 寄存器来控制。SETPEND: 0xE000E200-0xE000E21 CLRPEND: 0xE000E280-0xE000E29C,37,优先级每个外部中断都有一个对应的优先级寄存器,每个寄存器占用8位,但是CM3允许只使用最高3位。,中断优先级控制寄存器(0xE000E400-0xE000E4EF),38,活动状态每一个外部中断都

15、有一个活动状态位。当处理器开始执行中断处理程序时,该位设置为1;在中断返回时清零。,中断活动状态寄存器(0xE000E300-0xE000E31C),39,PRIMASK 和 FAULTMASK 特殊功能寄存器 PRIMASK(1bit)用于除能在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。该寄存器可以通过使用MRS和MSR命令来编程控制。关中断: MOV R0, #1 MSR PRIMASK, R0 ; Write 1 to PRIMASK to disable all interrupts开中断: MOV R0, #0 MSR PRIMAS

16、K, R0 ; Write 0 to PRIMASK to allow interruptsFAULTMASK寄存器通过将当前的优先级改为-1(置1)来除能所有异常。FAULTMASK 会在异常退出时自动清零。,40,BASEPRI特殊功能寄存器BASEPRI 寄存器(最多9bits)能够屏蔽优先级小于特定值的中断。屏蔽不高于0x60的中断: MOV R0, #0x60 MSR BASEPRI, R0 ; Disable interrupts with priority 0x60-0xFF取消对中断的屏蔽: MOV R0, #0x0 MSR BASEPRI, R0 ; Turn off BAS

17、EPRI masking,41,BASEPRI寄存器可通过BASEPRI_MAX 名称进行访问:使用BASEPRI时,可以任意设置新的优先级阈值;使用BASEPRI_MAX时只允许新的优先级阈值比原来的那个在数值上更小,也就是说,只能一次次地扩大掩蔽范围,反之则不行。 MOV R0, #0x60 MSR BASEPRI_MAX, R0 ; Disable interrupts with priority 0x60, 0x61,., etc MOV R0, #0xF0 MSR BASEPRI_MAX, R0 ; This write will be ignored because ; it is

18、 lower level than 0x60 MOV R0, #0x40 MSR BASEPRI_MAX, R0 ; This write is allowed and change ; the masking level to 0x40,42,其它异常的配置寄存器用法异常、内存管理异常和总线异常通过系统处理控制和状态寄存器使能。,系统处理控制和状态寄存器 (0xE000ED24),43,(Continued),44,中断控制和状态寄存器(0xE000ED04),45,7.2.5 中断建立过程示例中断设置步骤:1. 设置优先级组寄存器。2. 如果需要重定位向量表,将硬件故障和NMI处理例程复制

19、到一个新的矢量表位置。3. 设置矢量表偏移寄存器,使之指向新的向量表。4. 为该中断建立中断向量。5. 设置中断优先级。6. 使能中断。,46,LDR R0, =0xE000ED0C ; 应用程序中断及复位控制寄存器LDR R1, =0x05FA0500 ; 使用优先级组5 (2/6) STR R1, R0 ; 设置优先级组. MOV R4, #8 ; ROM中的向量表LDR R5, =(NEW_VECT_TABLE+8) LDMIA R4!, R0-R1 ; 读取NMI和硬fault的向量STMIA R5!, R0-R1 ; 拷贝它们的向量到新表中,. LDR R0, =0xE000ED08

20、 ; 向量表偏移量寄存器的地址LDR R1, =NEW_VECT_TABLE STR R1, R0 ; 把向量表重定位. LDR R0, =IRQ7_Handler ; 取得IRQ #7服务例程的入口地址LDR R1, =0xE000ED08 ; 向量表偏移量寄存器的地址LDR R1, R1 ADD R1, R1,#(4*(7+16); 计算IRQ #7服务例程的入口地址STR R0, R1 ; 在向量表中写入IRQ #7服务例程的入口地址. LDR R0, =0xE000E400 ; 外部中断优先级寄存器阵列的基地址MOV R1, #0xC0 STRB R1, R0,#7 ; 把IRQ #7

21、的优先级设置为0xC0 . LDR R0, =0xE000E100 ; SETEN寄存器的地址MOV R1, #(17) ; 置位IRQ #7的使能位STR R1, R0 ; 使能IRQ #7,47,7.2.6 软件中断软件中断:通过软件编程的方法产生的中断。通过以下方式触发:置位SETPEND寄存器或者,置位软件触发中断寄存器(STIR),软件触发中断寄存器(0xE000EF00),系统异常(NMI, faults, PendSV等等)不能被该寄存器挂起,48,7.2.7 系统定时器系统定时器(SYSTICK)与NVIC集成在一起,能够用于产生一个SYSTICK 异常。系统定时器由四个寄存器控制。,SYSTICK 控制和状态寄存器(0xE000E010),49,50,SYSTICK 重载寄存器 (0xE000E014),SYSTICK 当前值寄存器 (0xE000E018),SYSTICK 校验值寄存器 (0xE000E01C),51,- THE END -,52,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报