Cortex-M3的异常处理

Cortex-M3的异常处理

ID:36393157

大小:1.90 MB

页数:53页

时间:2019-05-09

Cortex-M3的异常处理_第1页
Cortex-M3的异常处理_第2页
Cortex-M3的异常处理_第3页
Cortex-M3的异常处理_第4页
Cortex-M3的异常处理_第5页
资源描述:

《Cortex-M3的异常处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第四章Cortex-M3的异常处理Cortex-M3的一些特性(一)处理器状态的自动保存和恢复;中断向量表读取与处理器状态保存并行处理;支持尾链技术,当处理背靠背的中断时,不需在两个中断服务子程序之间进行入栈和出栈操作;可动态重设中断优先级;NVIC和Cortex-M3处理器核紧密耦合,可尽早处理中断,尤其是晚到的高优先级中断;Cortex-M3的一些特性(二)中断的数目可以配置,从1到240;为Handler和Thread模式分别提供独立的栈和访问特权等级;ISR调用采用C/C++标准ARM体系结构

2、过程调用标准(AAPCS);可屏蔽优先级以支持临界区。这些特性提高了处理异常的效率并降低了时间的延迟。4.1异常的类型4.2异常的优先级4.3异常处理4.4复位过程4.5多堆栈的设置4.6Abort模式4.1异常的类型Cortex-M3处理器将复位、不可屏蔽中断、外部中断、故障都统一为异常。故障(fault)是指令执行时由于错误的条件所导致的异常。同步故障是指当指令产生错误时就同时报告错误。异步故障则是指当指令产生错误时无法保证同时报告错误。4.2异常的优先级NVIC支持通过软件设置优先级。通过写中断

3、优先级寄存器的PRI_N字段可以设置优先级,范围为0~255。通过软件设置的优先级权限高于硬件优先级。但通过软件设置的优先级对复位、不可屏蔽中断和硬故障没有影响。当多个中断具有相同的优先级时,拥有最小中断号的挂起中断优先执行。优先级分组NVIC支持优先级分组。通过设定应用中断和复位控制寄存器中的PRIGROUP字段,可以将PRI_N字段分成两部分:抢占优先级和次要优先级。抢占优先级可认为是优先级分组,当多个挂起的异常具有相同的抢占优先级时,次要优先级就起作用。当两个挂起的异常具有完全相同的优先级时,硬

4、件位置编号低的异常优先被激活。优先级分组异常处理中与优先级相关的操作异常激活等级当没有异常发生时,处理器处在Thread模式。当进入中断处理(ISR)或故障处理激活时,处理器将进入Handler模式。不同类型异常处理所对应的处理器工作模式、访问级别以及栈的使用是有所不同的,也就是激活等级不同。不同激活等级下的特权和栈异常转换异常子类转换4.3异常处理当处理器处理异常发生时,会将PC、处理器状态寄存器、r0-r3、r12,LR等8个寄存器的信息依次保存到堆栈指针SP所指之处。4.3异常处理如果NVIC配

5、置控制寄存器的STKALIGN位已经被设置,则在压栈之前会插入一个额外的字。从ISR返回后,处理器将自动从栈中弹出8个寄存器。中断返回是通过LR寄存器传递数据,故ISR可以是通常的c/c++函数,而且不需要修饰符。处理器进入ISR前执行的操作步骤在处理器不同情况下进入异常处理ISR的过程中断进入及处理流程图抢占处理流程4.3.2异常处理的退出当从异常中返回时,处理器可能:尾链到一个已挂起的异常:该异常比栈中所有异常的优先级都高;返回到最近一个已压栈的ISR:没有挂起的异常,或是栈中最高优先级的异常比挂

6、起的最高优先级异常具有更高的优先级;返回到Thread模式:没有异常已经挂起或位于栈中。异常退出操作异常返回在ISR中可用以下指令将值0xFFFFFFFX加载到PC,以发生异常返回:POP/LDM,载入PC;LDR,PC作为目的地址;BX,使用任何寄存器进行跳转。当采用这种方法返回时,写入到PC的值被截取,并且作为EXC_RETURN的值。异常返回行为异常返回在Thread模式下,如果通过其他任何指令或者从向量表将EXC_RETURN的值载入PC,则就将该值看成是地址,而非一个特殊的值。该地址区

7、间被定义为不可执行区间,并导致一个内存管理故障。中断返回流程图4.4复位过程4.4.1向量表异常处理程序的入口地址组成向量表,每个入口地址占用4个字节,向量表位于零地址处;在向量表的0处必须放置main栈的栈顶地址,也就是MSP的初值;复位、NMI和硬fault的优先级是固定的。4.4.1向量表在向量表的位置0处,必须包含以下4个值:main栈顶地址MSP;复位程序的入口地址;非屏蔽中断(NMI)ISR的入口地址;硬故障ISR的入口地址。一个完整向量表的例子:一个完整向量表的例子:4.4.2启动过程正

8、常情况,系统复位之后按下页表所示步骤启动一个C/C++程序在运行时先完成最初的三步,然后调用main()。复位服务子程序用来启动应用程序和允许中断。系统复位之后的启动步骤系统复位之后的启动步骤(续)复位服务子程序在中断处理完成后,有三种方式可调用复位服务子程序:(通过例子说明)例1,纯粹Sleep-on-exit的复位服务子程序(复位程序不进行主循环);例2,带有通过WFI(WaitForInterrupt)选择睡眠模式的复位服务子程序;例3,选定的Sl

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。