当前位置: 首页 > news >正文

【Cortex-M3权威指南】学习笔记4 - 异常

目录

    • 实现 CM3
      • 流水线
      • CM3 详细框图
      • CM3 总线接口
      • 总线连接模板
    • 异常
      • 异常类型
      • 优先级定义
        • 优先级组
      • 向量表
      • 中断输入于挂起
        • NMI
        • 中断挂起
      • Fault 类异常
        • 总线 faults
        • 存储器管理 faults
        • 用法 faults
      • SVC 与 PendSV

实现 CM3


流水线

在这里插入图片描述

CM3 处理器使用 3 级流水线,分别是:取指,解码和执行

CM3 有时候会一次取出两个 16 位指令(合计 32 位指令),先处理一个然后等一个周期后再处理下一个

处于对 Thumb 兼容性考虑,取 PC 时,会返回当前指令地址+4 值

处理器内核预取单元有一个指令缓冲区,让后续执行的指令在这里排队


CM3 详细框图

在这里插入图片描述

缩写含义
NVIC嵌套向量中断控制器
SYSTICK Timer一个简易的周期定时器,用于提供时基,亦被操作系统所使用
MPU存储器保护单元(可选)
CM3BusMatrix内部的 AHB 互连
AHB to APB把 AHB 转换为 APB 的总线桥
SW-DP/SWJ-DP串行线调试端口/串行线 JTAG 调试端口。通过串行线调试协议或者是传统的 JTAG 协议(专用于 SWJ-DP),都可以用于实现与调试接口的连接
AHB-AP AHB访问端口,它把串行线/SWJ 接口的命令转换成 AHB 数据传送
ETM嵌入式跟踪宏单元(可选组件),调试用。 用于处理指令跟踪
DWT数据观察点及跟踪单元,调试用。这是一个处理数据观察点功能的模块
ITM仪器化跟踪宏单元
TPIU跟踪单元的接口单元。所有跟踪单元发出的调试信息都要先送给它,它再转发给外部跟踪捕获硬件的
FPB Flash地址重载及断点单元
ROM 表一个小的查找表,其中存储了配置信息

CM3 处理器中各个重要模块介绍:

  1. CM3Core:CPU
  2. NVIC:支持中断嵌套,向量中断机制可以在中断发生时,自动取出对应服务例程的入口地址
  3. SysTick 定时器:在 NVIC 内部实现,可以每隔一定时间产生中断,即便系统睡眠也可以工作
  4. 存储器保护单元:把存储器划分为多个区进行保护
  5. BusMatrix:CM3 总线核心,通过他让数据在不同总线间传输
  6. AHB to APB Bridge:总线桥,把多个 APB 设备连接到私有外设总线
  7. SW-DP/SWJ-DP:串行调试
  8. AHB-AP:无
  9. ETM 嵌入式跟踪宏单元:实时指令跟踪,
  10. DWT 数据观察点及跟踪单元:通过其设置数据观察点
  11. ITM 仪器化追踪宏单元:无
  12. FPB:提供 flash 地址重载与断点功能

CM3 总线接口

I-Code 总线 一条 32 位总线,进行取指操作

D-Code 总线 一条 32 位总线,进行数据访问操作,连接到该总线的设备不需要支持非对齐访问

系统总线 负责数据传送,他们都是对齐的

外部私有外设总线 基于 APB 协议的 32 为总线,负责私有外设访问

调试访问端口总线 专用于挂接调试接口


总线连接模板

在这里插入图片描述


异常


异常类型

编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断

中断不等于异常

15 个可用的系统异常表
在这里插入图片描述


优先级定义

优先级的数值越小,则优先级越高。
CM3 支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常

三个特殊的系统异常:复位,NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常


CM3 还把 256 级优先级按位分成高低两段,分别称为抢占优先级和子优先级

NVIC 中有一个寄存器保存优先级组,他把优先级分为两段:
MSB 所在的位段对应抢占优先级; LSB 所在的位段对应子优先级


优先级组

CM3 支持 8 个不同的中断优先级,通常被分成 4 个优先级组

CM3 中断优先级组分配的四种主流方式:

Preemptive Priority Grouping (0 位抢占优先级组)
这种模式下,优先级分组被禁用,所有中断的优先级都是唯一的。优先级值高的中断总是可以打断正在执行的优先级值低的中断。这是最简单的中断优先级模式,但在复杂的应用中可能不够灵活。

No Preemptive Priority Grouping (4 位抢占优先级组)
这种模式下,中断被分为 4 个优先级组,每组内有 2 个优先级。每个组的中断不会互相打断,但是一个组内的高优先级中断可以打断低优先级中断。这提供了一定程度的分层和优先级控制。

Priority Grouping (3 位抢占优先级组)
这种模式下,中断被分为 8 个优先级组,每组内有 1 个优先级。这意味着每个中断都有唯一的优先级,没有中断会被其他中断完全屏蔽。这提供了更精细的优先级控制,但在复杂应用中可能需要更多的配置。

Priority Grouping (2 位抢占优先级组)
这种模式下,中断被分为 16 个优先级组,每组内有 1 个优先级。与上述模式相比,这种模式提供了更大的灵活性,但配置会更加复杂。


向量表

Cortex-M3 处理器使用中断向量表来管理不同中断的入口地址。
中断向量表是一个存储了中断处理程序地址的数组,每个元素对应一个特定的中断号。
当中断发生时,处理器会根据中断号从向量表中读取对应的地址,然后跳转到相应的中断处理程序。

中断向量表通常位于内存的起始地址处。向量表中的每个元素都是一个 4 字节(32 位)的地址,指向对应中断的处理程序

可以在 SRAM 中开出一块空间用于存储向量表


中断输入于挂起

NMI

NMI(Non-Maskable Interrupt,非屏蔽中断)是一种特殊类型的中断,在嵌入式系统中常用于处理一些紧急和重要的事件。与普通的可屏蔽中断不同,NMI 是无法被屏蔽或阻止的中断,即使处理器处于屏蔽中断状态(例如,全局中断被禁用),NMI 仍然可以触发。

当 NMI 发生时,处理器会跳转到 NMI 处理程序的入口地址执行相应的操作


中断挂起

在这里插入图片描述

中断输入脚置位有效后,他就被挂起,此时无法撤销中断请求
若在中断得到响应前消除挂起状态,则中断被取消

中断服务例程开始执行时,其挂起状态会被硬件自动清除

中断源一直维持中断请求信号,则该中断再完成一轮服务历程后又会被立刻赋予挂起状态进行下一轮
中断源以脉冲的形式发送 N 多个中断请求信号,最终只会接受一个


Fault 类异常

总线 faults

该 fault 可能产生的情况:

  1. 当 AHB 接口上正在传送数据时,回复了一个错误信号
  2. 在处理器启动中断服务序列(sequence)后读取向量时
  3. 中断处理起始阶段的堆栈 PUSH 动作
  4. 中断处理收尾阶段的堆栈 POP 动作

总线 fault 一旦检测到更高优先级异常,就会先执行后者,自己就挂起

总线 fault 是被某同级或更高优先级异常的服务例程引发的,则会变成硬 fault,使得最后执行的是硬 fault 的服务例程

欲使能总线 fault 服务例程前,总线 fault 服务例程的入口地址必须已经在向量表中配置好


总线 fault 状态寄存器(BFSR) 位于 NVIC 内部,可以找出产生 fault 的原因


存储器管理 faults

触发该 faults 的原因有如下四点:

  • 访问了所有 MPU regions 覆盖范围之外的地址
  • 访问了没有存储器与之对应的空地址
  • 往只读 region 写数据
  • 用户级下访问了只允许在特权级下访问的地址

MemManage fault 被除能,则会上访成硬 faults
若该硬 faults 执行时又导致了 MemManage fault,则内核被锁定

MemManage fault 必须被使能才能正常响应


用法 faults

用法 faults 一个重要的功能是:
执行了协处理器指令。Cortex-M3 本身并不支持协处理器,但是通过 fault 异常机制,可以建立一套“软件模拟”的机制,来执行一段程序模拟协处理器的功能

其余功能以及使能除能啥的情况和存储器 faults 基本一致,在这里不做过多介绍

导致用法 faults 最常见的原因是:视图切入 ARM 状态


SVC 与 PendSV

OS 不允许用户直接操作硬件,故出现了对应的桥梁 SVC(系统服务调用)

SVC 可以这样定义:
操作系统提供系统服务函数,用户通过 SVC 对这些函数发出请求,并以此来间接控制硬件


SVC 异常可以通过执行 SVC 指令来产生;
SVC 指令需要一个立即数,充当系统调用代号


PendSV 和 SVC 作用一致,只不过他可以被挂起

PendSV 异常处理程序通常会保存当前任务的上下文,并加载下一个任务的上下文,从而实现任务切换

PendSV 的任务优先级较低,故可以被许多高优先级例程打断


相关文章:

【Cortex-M3权威指南】学习笔记4 - 异常

目录 实现 CM3流水线CM3 详细框图CM3 总线接口总线连接模板 异常异常类型优先级定义优先级组 向量表中断输入于挂起NMI中断挂起 Fault 类异常总线 faults存储器管理 faults用法 faults SVC 与 PendSV 实现 CM3 流水线 CM3 处理器使用 3 级流水线,分别是:…...

RISC-V(2)——特权级及特权指令集

目录 1. 特权级 2. 控制和状态寄存器(CSR) 2.1 分类 2.2 分析 1. 特权级 一个 RISC-V 硬件线程(hart)是运行在某个特权级上的,这个特权级被编码到一个或者多个 CSR(control and status register&a…...

Linux——常用命令大汇总(带你快速入门Linux)

纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.终端和shell命令解析器终端和shell命令解析器概述终端提示符的格式常用快捷键 二.Linux命令格式帮助文档:man 三.目录基础知识Wind…...

记录 使用 git 克隆仓库报错:Warning: Permanently added‘github.com’ to the .....(ssh )

解决方法: 1. 新建空文件夹->右键->点击 Git Bash Here2. 输入 cd C:3. 输入 cat ~/.ssh/id_rsa.pub4. 输入 ssh-keygen重复回车,生成一个矩形,则说明公钥已经生成了。重复步骤3,生成publickey,右键…...

kafka---- zookeeper集群搭建

1.准备工作: ##准备3个节点,要求配置好主机名称,服务器之间系统时间保持一致 ##注意/etc/hostname 和/etc/hosts 配置主机名称(在这个里我准备Prac-zk-133, Prac-zk-134 , Prac-zk-135二节点) vim /etc/hosts #保证可以通过主机名互通 添加格式为IP 主…...

linux安装firefox

1.下载对应包 https://www.mozilla.org/en-US/firefox/all/#product-desktop-release 2. 挂载桌面链接(如果/usr/bin/firefox下有的话,先删除) ln -s /opt/firefox/firefox /usr/bin/firefox 3.执行以下命令,即可启动Firefox客户端: firefox...

【MySQL】基础语法总结

MySQL 基础语句 一、DDL 数据库定义语言 1.1CREATE 创建 1.1.1 创建数据库 语法结构 CREATE DATABASE database_name;示例 CREATE DATABASE demo;1.1.2 创建表 语法结构 CREATE TABLE 表名 (列1 数据类型,列2 数据类型,... );示例 CREATE TABLE new_user (id INT PRIMARY KE…...

【玩玩Vue】使用el-menu作为菜单时,通过一二级路由控制菜单高亮

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、Vue路由二、路由一级控制高亮(常用)1.vue中路由文件2.网址样式3.Vue文件4.$route的内容 三、路由二级控制高亮…...

9.2 【C语言】使用结构体数组

一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据),如果有10个学生需要参加运算,显然应该用数组,这就是结构体数组。 9.2.1 定义结构体数组 例9.3 有三个候选人,每个选民只…...

leetcode原题: 最小值、最大数字

题目1:最小值 给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差 示例: 输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出:3&…...

Prompt2Model: Generating Deployable Models from Natural Language Instructions

本文是LLM系列文章,针对《 Prompt2Model: Generating Deployable Models from Natural Language Instructions》的翻译。 Prompt2Model:从自然语言指令生成可部署模型 摘要1 引言2 Prompt2Model框架3 参考实现4 实验设置5 实验结果6 讨论与结论不足道德…...

前端埋点 sendBeacon 替代方式

看英文文档真的很重要 sendBeacon 限制比较多, 容易跨域, 跨域时候还必须指定请求头, 不能使用通配符来解决跨域 文档地址 文档里面说 fetch 其实可以代替 sendBeacon 原文: Note: For use cases that need the ability to send requests with methods other than POST, or …...

面试官问我MySQL和MariaDB的联系和区别,这我能不知道?

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…...

1.网络空间搜素引擎

网络空间搜素引擎 https://cybermap.kaspersky.com/cn 世界所以带有ip的网络设备互联组成的空间叫做网络空间 地址 :shodan.io 简介 : 这句话还是有点东西得 。 区别: 平常得搜素引擎主要搜网页,shadan可以搜所以带有ip地址…...

《安富莱嵌入式周报》第321期:开源12导联便携心电仪,PCB AI设计,150M示波器差分探头,谷歌全栈环境IDX,微软在Excel推出Python

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1ju4y1D7A8/ 《安富莱嵌入式周报》第321期:开源12导…...

前端开发必备的网站

前端开发必备的网站及官网 说明: 这里记录了我本人平时开发所用到的网站,对我还是有帮助的,后续会接着补充进来,一方面是为了记录,另一方面也可以帮助到大家… 网站名称及描述网址Elememt-ui (组件库)Elememt-ui&…...

Java运行时jar时终端输出的中文日志是乱码

运行Jar时在控制台输出的中文日志全是乱码,这是因为cmd/bash默认的编码是GBK,只要把cmd的编码改成UTF-8即可 两种方式修改:临时修改和注册表永久修改 临时修改 只对当前的cmd页面有效,关闭后重新打开都会恢复成GBK, 打开cmd&am…...

Vue框架--Vue中el和data的两种写法

data与el的2种写法 1.el有2种写法 (1).new Vue时候配置el属性。 (2).先创建Vue实例,随后再通过vm.$mount(#root)指定el的值。 2.data有2种写法 (1).对象式 (2).函数式 如何选择:目前哪种写法都可以,以后学习到组件时&#xff…...

【数据结构】 二叉树面试题讲解->贰

文章目录 🌏引言🎄[二叉树遍历](https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking)🐱‍👤题目描述&#…...

C和SystemVerilog联合仿真

想要联合仿真一个c程序和verilog表示的硬件&#xff0c;可以用如下方法&#xff08;DPI&#xff09;&#xff1a; 先写一个.c文件funcs.c #include <stdio.h> #include "svdpi.h"extern int sayHello();void something() {printf("something\n");s…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...