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

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】


请阅读【嵌入式开发学习必备专栏】


文章目录

    • Debug system registers
      • 中断控制状态寄存器(ICSR)
      • Debug Halting Control and Status Register, DHCSR
    • Debug 寄存器DCRSR与DCRDR
      • CPU 寄存器读操作
      • CPU 寄存器写操作
      • CPU 寄存器选择
      • CPU 寄存器读写示例
    • 调试故障状态寄存器(DFSR)

Debug system registers

在ARMv7架构中,调试功能通过一系列的系统控制块(System Control Block, SCB)寄存器来提供。这些寄存器不仅帮助开发者诊断程序运行中的错误,还提供了硬件故障的详细信息。以下是SCB中与调试相关的重要寄存器和标志位的介绍:

中断控制状态寄存器(ICSR)

ICSR 寄存器可在应用程序中用于:

  • 设置和清除系统异常的挂起状态,其中包括 SysTick、PendSV 和 NMI。
  • 通过读取 VECTACTIVE 可以确定当前执行的异常/中断编号。

另外,调试器还可利用该寄存器确定中断状态。VECTACTIVE 域和 IPSR 相同。

  • 中断控制和状态寄存器(SCB->ICSR,0xE000ED04)

在这里插入图片描述

debug 寄存器小结
在这里插入图片描述

Debug Halting Control and Status Register, DHCSR

在这里插入图片描述

  • C_DEBUGEN: Enables debug.
    启用调试。这只能由 AHB-AP 修改,而不是由软件修改。它在软件进行写入时将被忽略,软件不能设置或清除它。当写入 C_HALT 来暂停CPU时,内核必须向它写入 1。当外部debugger将该bit配置从0修改为1时 必须同时将 域 C_MASKINTS(bit[3])置0

  • C_Halt: Halts the core.
    暂停 cpu。当CPU停止时,该位自动设置。例如断点。此位在CPU reset 时清除。该位只能在 C_DEBUGEN 为 1 时写入,否则将被忽略。

    • 当设置该位为 1 时,且 C_DEBUGEN 置位时,将会将cpu halt住;
    • 当CPU 处于 debug state时,将该bit写0,将会退出 debug state。
  • C_STEP, bit[2]:单步调试使能bit。

  • C_MASKINTS, bit[3]:当debug 模式使能后,也即C_DEBUGEN 配置为1后,外部 debugger 可以通过配置该bit来屏蔽ysTick 和 外部其它中断。

  • C_SNAPSTALL, bit[5]:设置此位为1允许调试器请求不精确地进入调试状态。C_SNAPSTALL 提供了一种机制,通过它调试器可以请求处理器进入调试状态,而不需要等待具体的断点触发。这对于那些需要在特定条件下暂停处理器执行,但又不依赖于精确断点位置的调试场景特别有用。

当处理器执行加载(load)或存储(store)指令时,可能会遇到“阻塞”(stalled)的情况。这种情况通常发生于数据无法立即从内存中被访问时,例如因为缓存未命中(cache miss)、访问外设或者内存争用等原因。阻塞的加载或存储指令需要等待相关数据可用后才能完成其操作。下面详细介绍这一过程及其影响。可以通过配置C_SNAPSTALL 让 阻塞的 load 或者store强制结束。

  • S_REGRDY:
    调试内核寄存器选择器寄存器上的寄存器读/写可用。 为1表示最后一次传输完成。

  • S_HALT
    当 S_HALT 为高时,表示处于调试状态

  • S_SLEEP
    表示内核正在休眠.WFI、WFE 或 SLEEP-ON-EXIT, 必须使用 C_HALT 来获得控制权或等待中断唤醒。

  • S_LOCKUP:
    如果内核正在运行(未停止)并且存在锁定条件,则读取为 1。

  • S_RETIRE_ST: I表示自上次读取后指令已完成。 这是一个在读取时清除的粘性位。 这确定核心是否在加载/存储或获取时停止。

  • S_RESET_ST
    表示自从上次读取该位以来,内核已被复位或正在被复位。 这是一个在读取时清除的粘性位。 因此,读取两次并得到 1 然后 0 意味着它在过去被重置。 读取两次并获得 1 意味着它现在正在重置(仍然保持在重置状态)。

Debug 寄存器DCRSR与DCRDR

与调试功能有关的,还有NVIC中另外两个寄存器。它们分别是:调试内核寄存器选择者寄存器DCRSR),以及调试内核寄存器数据寄存器DCRDR)。调试器需要通过这两个寄存器来访问处理器的寄存器,并且只有在处理器停机时,才能使用这里的寄存器传送功能

DCRSR
在这里插入图片描述
DCRDR
在这里插入图片描述

CPU 寄存器读操作

使用DCRSRDCRDR这两个寄存器来读取内核的寄存器的内容,则必须按如下的顺序做:

  • 确定处理器已停机
  • DCRSR写数据来选择读CPU的哪个寄存器,其中bit[16]要为0,表示这是要读数据
  • 查询,直到DHCSR.S_REGRDY=1
  • 读取DCRDR以获取寄存器的内容

CPU 寄存器写操作

寄存器写操作的顺序与上面的类似:

  • 确定处理器已停机
  • DCRDR中写数据
  • DCRSR写数据来选择准备写CPU的哪个寄存器,其中bit[16]要为1,表示这是要写数据
  • 查询,直到DHCSR.S_REGRDY=1

NOTE: 使用DCRSR和DCRDR来访问寄存器,只适用于停机模式。

CPU 寄存器选择

DCRSR bit[16] 用标志是读操作还是写操作:

  • 0 Read
  • 1 Write

DCRSR bits[6:0] 用于选择要操作哪个寄存器:

  • 0b0000000-0b0001100:选择寄存器R0-R12
  • 0b0001101:选择寄存器 SP
  • 0b0001110:选择寄存器 LR
  • 0b0001111:DebugReturnAddress
  • 0b0010000:xPSR
  • 0b0010001:Main stack pointer, MSP
  • 0b0010010 Process stack pointer, PSP.
  • 0b0010100 Bits[31:24] CONTROL.
    • Bits[23:16] FAULTMASK.
    • Bits[15:8] BASEPRI.
    • Bits[7:0] PRIMASK.
  • 0b0100001:Floating-point Status and Control Register, FPSCR.

CPU 寄存器读写示例

写操作:

#define REGW_FLAG    BIT(16)
#define S_REGRDY     BIT(16)int cpu_reg_write(uint32_t reg, uint32_t val)
{uint32_t data, try = 5;mcu_write(DCRDR, val);mcu_write(DCRSR, REGW_FLGA | reg);mcu_read(DHCSR, &data);while ((data & S_REGRDY) == 0x0 && try) {log_warn("wait for transfer complete\n");try--;}if (!try) {log_err("write gpu mcu reg failed\n");return -1;}return 0;
}

读操作

uint32_t cpu_reg_read(uint32_t reg, uint32_t *pdata)
{uint32_t data, try = 5;mcu_write(DCRSR, reg);mcu_read(DHCSR, &data);while ((data & S_REGRDY) == 0x0 && try) {log_warn("wait for transfer complete\n");try--;}if (!try) {log_err("write gpu mcu reg failed\n");return -1;}mcu_read(DCRDR, pdata);return 0;
}

调试故障状态寄存器(DFSR)

DFSR(Debug Fault Status Register)是SCB的一部分,提供了与调试相关的故障信息。它指示了最后一次调试事件的原因,例如硬件断点触发或访问违例。DFSR寄存器包括以下几个关键字段:
在这里插入图片描述

  • HALTED:当处理器因调试请求而停止时,该位被设置。 C_HALT 和 C_STEP 请求都会触发该位置位。
  • BKPT:当执行到PFB中硬件断点时或者软件断点指令BKPT指令时,该位被设置。
  • DWTTRAP:当数据观察点和追踪(Data Watchpoint and Trace, DWT)单元检测到匹配事件时,该位被设置。
  • VCATCH:当向量捕捉事件发生时,该位被设置。
  • EXTERNAL:当由于外部调试请求而停止时,该位被设置。

DFSR为开发者提供了关于程序为何停止的直接线索,是调试过程中不可或缺的资源。

相关文章:

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器(ICSR)Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…...

深入解析C#中的async和await关键字

文章目录 一、异步编程的基本概念及其在C#中的实现二、async关键字的定义及其用法三、await关键字的定义及其用法示例代码:使用async和await编写一个简单的异步程序 四、async和await的优点注意事项 五、C#下async和await中常见问题汇总1. 异步方法中的await调用2. …...

【VUE.js】前端框架——未完成

基于脚手架创建前端工程 环境 当安装node.js时,它本身就携带有npm命令。(-v 查版本号)安装VUE CLI npm i vue/cli -g(全局) 创建 vue create 【project name】 镜像源解决方案 输入创建命令后,提示检查更…...

开源的文件压缩和解压缩软件7-Zip

7-Zip是一款开源的文件压缩和解压缩软件,它支持多种压缩格式,包括自有的7z格式以及常见的ZIP、RAR、TAR等格式。下面是对7-Zip的详细介绍,包括其功能特点、使用方法、优缺点等方面的内容。官网:7-Zip 1. 功能特点: 多…...

搜维尔科技:Patchwork 3D 新功能:爆炸视图动画

Patchwork 3D新功能:爆炸视图动画 为什么使用 Patchwork 3D? Patchwork 3D 软件有助于将 CAD 数据转换成真实感的 3D 模型以用于工业用途。 Patchwork 3D 可轻松进行实时渲染,有助于缩短设计周期,或者让您获得效果逼真的渲染图&…...

Redis——RedLock、Zookeeper及数据库实现分布式锁

在分布式系统中,实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤: 1. Redis的RedLock算法 Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式&#x…...

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议,大多数实验都是基于Windows下IIS,或者Linux下nginx搭建的Web服务,搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备,折腾起来…...

记录一次 vue2 前端项目整合过程

整合成功效果图 具体说明: 项目A是现在的vue2前端项目,项目B是一个开源的工作流前端,项目后端代码已经整合了,就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能,拷贝到自己对应的vue2项目里…...

物联网五层架构分析

物联网五层架构分析 随着科技的迅速发展,物联网(IoT)作为日常生活中不可或缺的一部分,已融入人们的生活和工作中。物联网五层架构,包括感知层、网络层、数据层、应用层和业务层,扮演着关键的角色。 感知层 …...

【Java EE】多线程(三)线程状态

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...

FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)

工具层 1.av_log 可以设置日志的级别,这个看看名字就明白了,也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…...

日志的基本用法

目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…...

什么是页分裂、页合并?

数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT)。 行数据,都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图: 在I…...

软件2班20240513

第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …...

嵌入式学习-时钟树

时钟树 时钟分类 时钟树框图 LSI与LSE HSI、HSE与PLL 系统时钟的产生 AHB、APBx的时钟配置 相关寄存器 寄存器部分的细节内容请参考手册。 相关库函数...

对博客系统基本功能进行自动化测试(Junit + Selenium)

环境搭建&#xff1a; 浏览器&#xff1a; 本次测试使用Chrome浏览器在jdk的bin目录下安装对应浏览器驱动&#xff08;尽量选择与浏览器版本相近的驱动&#xff09;chromedriver.storage.googleapis.com/index.htmlJunit依赖&#xff1a; <!-- https://mvnreposit…...

《换你来当爹》:AI驱动的养成游戏,探索虚拟亲子关系的新模式

AI技术如何重塑我们对游戏互动的认知 在人工智能技术的浪潮下&#xff0c;一款名为《换你来当爹》的AI养成游戏&#xff0c;以其创新的互动模式和个性化体验&#xff0c;吸引了游戏爱好者的目光。这款游戏利用了先进的LLM技术&#xff0c;通过AI实时生成剧情和图片&#xff0c…...

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…...

Linux系统编程:进程控制

1.进程创建 1.1 fork函数 fork&#xff08;&#xff09;通过复制调用进程来创建一个新进程。新进程称为子进程&#xff0c;是调用进程的精确副本 进程&#xff0c;但以下几点除外&#xff1a; 子进程有自己的PID&#xff0c;此PID与任何现有进程组的ID不匹配子进程的父进程ID…...

Android 异常开机半屏重启代码分析

Android 的稳定性是 Android 性能的一个重要指标&#xff0c;它也是 App 质量构建体系中最基本和最关键的一环&#xff1b;如果应用经常崩溃&#xff0c;或者关键功能不可用&#xff0c;那显然会对我们的留存产生重大影响所以为了保障应用的稳定性&#xff0c;我们首先应该树立…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...