ARM异常处理(1):异常类型、优先级分组和异常向量表

news2024/11/19 7:42:05

本系列文章将以Cortex-M3内核为例,对ARM的异常(exception)进行分析。


文章目录

  • 1 异常类型
  • 2 优先级
  • 3 向量表

1 异常类型

Cortex-M3提供了一个功能丰富的异常体系结构,它支持很多系统异常和外部中断。异常编号1-15表示系统异常,16及以上表示外部中断输入。大多数异常具有可编程优先级,少数具有固定优先级。

Exception NumberException TypePriorityDescription
1Reset-3(Highest)Reset
2NMI-2Nonmaskable interrupt(external NMI input)
3Hard fault-1如果其它具体的fault handler没有使能,所有的fault都会归为Hard fault
4MemManage fault可编程内存管理错误;MPU(内存保护单元)非法操作或访问了非法地址
5Bus fault可编程总线错误,当AHB接口收到了bus slave的错误响应(指令预取时出错称为prefetch abort,数据访问时出错称为data abort)
6Usage fault可编程程序中的错误或访问coprocesser(协处理器)
7-10Reserved--
11SVC可编程Supervisor Call
12Debug monitor可编程代码断点、watch window的变量断点和外部调试请求时触发
13Reserved--
14PendSV可编程Pendable Service Call
15SYSTICK可编程System Tick Timer
16External Interrupt #0可编程-
17External Interrupt #1可编程-
-
255External Interrupt #239可编程-
  • 前三个异常为负优先级,表示他们的优先级高于其它所有异常

当前正在运行的异常可以通过特殊寄存器IPSR(Interrupt Program Status Register)或者NVIC中断控制状态寄存器(Nested Vectored Interrupt Controllers Interrupt Control State Register)中的VECTACTIVE字段来查看。

  • 这里的中断号指的是对Cortex-M3 NVIC的中断输入,在实际的微控制器或SoC中,外部中断输入引脚编号可能与NVIC中的输入编号不同,比如External Interrupt #0External Interrupt #1可能会分配给片上外设,剩下的再分配给外部,需查询具体芯片的数据手册

当一个使能的异常产生但不能被立即执行的时候(比如有一个更高优先级的中断服务程序正在处理),它会被挂起(有一个例外:当发生这种情况后,可能会触发Hard fault,具体细节参考 ARM v7-M Architecture Application Level Reference Manual)。也就是说NVIC的挂起寄存器将保存这个异常请求,直到该异常可以被处理为止。

  • 即使请求中断的源撤销了这个请求,产生的异常也还是会被处理。

2 优先级

异常是否可以执行以及何时执行与异常的优先级有关,高优先级异常可以抢占低优先级异常。Cortex-M3支持三种固定的最高优先级(Reset/NMI/Hard Fault)和最大256级的可编程优先级(最多128级抢占,因为还分为抢占优先级和子优先级)。但不同的芯片支持的数量不一样,因为Cortex-M3允许设计师通过删除优先级配置寄存器的LSB来减少支持的优先级层数。

  • 例:如果芯片仅允许三位优先级,则读0-4位将返回0,写0-4位的任何数值都将被忽略
    在这里插入图片描述
    芯片支持更多的优先级就意味着芯片内部的门电路就更多,从而增加功耗。对于Cortex-M3来说,允许设置的最低优先级层数为8层(3位)。

问:为什么是删除寄存器的LSB而不是MSB

答:方便移植到其它设备,这样具有4位优先级配置寄存器的设备可以直接移植到具有3位优先级配置寄存器的设备上。如果删除MSB,则移植过后可能产生会优先级反转。


优先级寄存器AIRCR(Application Interrupt and Reset Control Register)分为两个部分,前半部分是抢占优先级(preempt priority),后半部分是子优先级(subpriority)。首先来看看AIRCR寄存器中的字段:
在这里插入图片描述

BitsNameTypeReset ValueDescription
31:16VECTKEYR/W-访问密钥,必须写为0x05FA,否则对该寄存器的写操作将被忽略
15ENDIANNESSR-1为大端,0为小端,只能在复位后改变
10:8PRIGROUPR/W-优先级分组
2SYSRESETREQW-通过访问芯片控制逻辑来产生一个复位
1VECTCLRACTIVEW-清除所有异常的激活状态信息,通常用在debug或OS中以允许系统从错误中恢复
0VECTRESETW-复位Cortex-M3处理器(除debug部分外),但不会复位处理器外围的电路

对于PRIGROUP来说,有8个分组,如下表所示:

Priority Group抢占优先级子优先级
0Bit [7:1]Bit [0]
1Bit [7:2]Bit [1:0]
2Bit [7:3]Bit [2:0]
3Bit [7:4]Bit [3:0]
4Bit [7:5]Bit [4:0]
5Bit [7:6]Bit [5:0]
6Bit [7:7]Bit [6:0]
7NoneBit [7:0]

抢占优先级决定一个中断可以在另一个中断处理程序执行时产生,子优先级仅在抢占优先级相同时使用。当分组为0时,抢占优先级有128级;当分组为7时,异常之间不会发生抢占,除非发生硬件错误(负优先级的异常)。


例:芯片允许三位优先级,优先级分组为5
在这里插入图片描述


3 向量表

    当异常发生时,Cortex-M3需要知道异常处理程序的地址并执行,而异常处理函数的地址保存在内存中的向量表中。默认情况下,该向量表保存在0地址处。

AddressException NumberValue(Word Size)
0x00000000-MSP初始值
0x000000041Reset Vector(PC的初始值)
0x000000082NMI中断处理函数地址
0x0000000C3Hard fault中断处理函数地址
其它中断处理函数的地址

    0地址一般为boot程序,它不能在运行时期修改。但是,向量表可以被重定位到其它内存位置或RAM中,这样我们就可以在运行时期修改。这是通过设置NVIC寄存器中的vector table offset regiser来实现的,如下表所示:

BitsNAMETypeReset ValueDecription
29TBLBASER/W0向量表基地址在code(0)还是RAM(1)
28:7TBLOFFR/W0向量表在code或RAM中的偏移

这个offset应该与向量表的大小对齐。

  • 由于在boot过程中也可能会发生NMIHard fault异常,而其它的异常只要不使能就不会产生,所以这两个向量表也需要写入零地址。当boot结束后,可以将SRAM中的一段内存定义为新的向量表的基地址

例:我们有32个中断向量,加上系统默认的16个异常共48个。首先要2字节对齐到64,接着一个向量表地址占4字节,即最后这个偏移量应该设置为256(0x100)。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0116 查找算法 Day5

剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该…

2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%

1、2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%新榜讯 12月2日,快手电商发布《2022快手电商短视频运营白皮书》。白皮书数据显示,2022年4-6月,随着平台商家对短视频渠道的认知提升,挂车短视频生产量不断…

【人脸识别】MVFace:一个优于CosFace和ArcFace的人脸识别损失

论文题目:《Mis-classifified Vector Guided Softmax Loss for Face Recognition》 论文地址:https://arxiv.org/pdf/1912.00833v1.pdf 代码地址:http://www.cbsr.ia.ac.cn/users/xiaobowang/ 1.背景 迄今为止,提出了几种基于mar…

Hashing to elliptic curve算法改进

1. 引言 前序博客有: ECDSA VS Schnorr signature VS BLS signature 第3节“BLS签名” 私钥pkpkpk,对应的公钥为PpkGPpk\times GPpkG。待签名消息mmm。 BLS signature的签名流程为: 1)通过H(m)H(m)H(m)将消息mmm映射为point o…

计算机毕业论文java毕业设计选题源代码javaweb企业门户网站官网

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《javaweb企业门户网站》该项目采用技术:jsp servlet mysqljdbccssjsjQuery等相关技术,项目含有源码、文档、配套开发软件…

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件②

👨‍🎓👨‍🎓博主:发量不足 个人简介:耐心,自信来源于你强大的思想和知识基础!! 📑📑本期更新内容:安装Hadoop、配置Hadoop 配置文件…

手把手教你SSM整合(包教包会)

SSM整合 步骤&#xff08;七步&#xff09; 新建maven项目&#xff0c;添加依赖 可以选择根据模版创建maven项目 <dependencies><!--spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&…

OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)

使用OpenCV调整图像大小。要调整图像的大小&#xff0c;可以根据每个轴&#xff08;高度和宽度&#xff09;进行缩放&#xff0c;考虑指定的缩放因素&#xff0c;或者只需设置所需的高度和宽度。 调整图像大小时&#xff1a; 如果想在调整后的图像中保持相同的宽高比&#xf…

Redis 7.0 源码调试环境搭建与源码导读技巧

天下武功&#xff0c;无坚不摧&#xff0c;唯快不破&#xff01;我的名字叫 Redis&#xff0c;全称是 Remote Dictionary Server。 有人说&#xff0c;组 CP&#xff0c;除了要了解她外&#xff0c;还要给机会让她了解你。 那么&#xff0c;作为开发工程师的你&#xff0c;是否…

物联网设备带你进入物联网时代,轻松实现数据互联互通

物联网这一词&#xff0c;我们在生活和工作中时常会接触到&#xff0c;但如果要问大家什么是物联网设备&#xff1f;物联网设备有哪些&#xff1f;很多人应该没有一个详细的概念。那么什么是物联网设备呢&#xff1f;物联网设备是指能够连接无线网络&#xff0c;并具有数据传输…

【电力系统经济调度】多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现与算例创新】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

计算机网络复习笔记——运输层

计算机网络复习笔记——运输层 概述 在计算机网络中进行通信的真正实体是位于通信两端主机中的进程 运输层的不同端口对应不同的进程 根据应用需求不同&#xff0c;运输层为应用层提供两种不同的运输协议&#xff0c;面向连接的TCP和无连接的UDP协议 运输层端口号、复用与…

CSS-盒子模型-内容,边框,内边距,外边距,(合并,塌陷情况)

CSS-盒子模型-内容&#xff0c;边框&#xff0c;内边距&#xff0c;外边距&#xff0c;(合并&#xff0c;塌陷情况) 目标&#xff1a;能够认识 盒子模型的组成 &#xff0c;****能够掌握盒子模型 边框、内边距、外边距 的****设置方法 学习路径&#xff1a; 1. 盒子模型的介绍 …

RK3588开发板的性能参数、功耗及功能特点|飞凌动态讲解

内容来源&#xff1a;飞凌嵌入式官网-www.forlinx.com2021年12月16日第六届瑞芯微开发者大会上&#xff0c;瑞芯微发布了全新一代旗舰处理器——RK3588。 相较前一代产品&#xff0c;RK3588的性能提高20%~30%&#xff01;同时采用新一代8nm制程工艺&#xff0c;也将大幅度降低功…

超级菜鸟怎么学习数据分析?

超级菜鸟如何学习数据分析&#xff0c;如何有效的成长为专业高手。 这个问题跟把大象放进冰箱是一个道理。 菜鸟成为超级高手是只需要四个步骤&#xff0c;直接上干货。 快速上手&#xff1a;可以简单、低门槛的上手学习与使用&#xff0c;快速入门 快速上手数据分析无非就是选…

Logstash:运用 Elasticsearch filter 来丰富地理数据

我们知道丰富数据对于很多的应用来说非常重要。这涉及到访问不同的表格&#xff0c;并进行搜索匹配。找到最为相近的结果并进行丰富数据。针对 Elasticsearh 来说&#xff0c;我们可以通过 enrich processor来进行丰富。你可以阅读我之前的文章来了解更多&#xff1a; Elastics…

git commit -m 撤销操作

1. 撤销本次commit-m操作 返回到add成功状态 git reset --soft HEAD^ 2.撤销本次commitadd 返回本地未提交状态 git reset --hard HEAD^ HEAD^ 表示上一个版本&#xff0c;即上一次的commit&#xff0c;几个^代表几次提交&#xff0c;如果回滚两次就是HEAD^^。 也可以写成HEAD…

代码随想录算法训练营第五十五天| LeetCode392. 判断子序列、LeetCode115. 不同的子序列

一、LeetCode392. 判断子序列 1&#xff1a;题目描述&#xff08;392. 判断子序列&#xff09; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新…

SSAT Essay 类写作 - 五步法

从去年起&#xff0c; SSAT 写作转向重点考察critical thinking的考察&#xff0c;SSAT middle 由2篇Story 题目转为一篇Story和一篇Essay, SSAT upper 由 1篇Story 和1 篇Essay 转为 2 篇Essay。这就意味着写好Essay 是SSAT 写作的必备能力。 Essay 写作的要求 体现Critica…

uniapp 实现在线签合同/签名/信息认证(无插件依赖)

最近项目接到一个新的需求&#xff0c;需要对接一个可以在线签合同的的功能&#xff0c;知道需要后马上开干&#xff0c;经过一番斗争&#xff0c;终于终于下班啦 开个玩笑&#xff0c;废话不多说&#xff0c;直接上代码&#xff0c;因为代码是直接项目中搬出来的&#xff0c;没…