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

news2024/10/5 12:34:15


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


文章目录

    • 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为开发者提供了关于程序为何停止的直接线索,是调试过程中不可或缺的资源。

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

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

相关文章

【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-05-13 1…

盘他系列——oj!!!

1.Openjudge 网站: OpenJudge 2.洛谷 网站: 首页 - 洛谷 | 计算机科学教育新生态 3.环球OJ 网站: QOJ - QOJ.ac 4. 北京大学 OJ:Welcome To PKU JudgeOnline 5.自由OJ 网站: https://loj.ac/ 6.炼码 网站:LintCode 炼码 8.力扣 网站: 力扣 9.晴练网首页 - 晴练网

安科瑞AIM-D100-ES光伏储能系统直流绝缘监测仪

概述 AIM-D100-ES 型直流绝缘监测仪主要用于在线监测直流不接地系统正负极对地绝缘电阻,当绝缘电阻低于设定值时,能发出预警和报警信号。 产品可测 100-1500V 的直流系统,可应用于储能直流系统、电动汽车充电装置、UPS 供电系统、光伏直流系…

第十一届蓝桥杯大赛软件类决赛 Java C 组

文章目录 发现宝藏【考生须知】试题 A: 美丽的 2试题 B: 合数个数试题 C: 扩散试题 D: 阶乘约数试题 E: 本质上升序列试题 F 天干地支试题 G 皮亚诺曲线距离试题 H 蓝肽子序列试题 I: 画廊试题 J 答疑 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&a…

本地运行《使用AMD上的SentenceTransformers构建语义搜索》

Building semantic search with SentenceTransformers on AMD — ROCm Blogs 这篇博客解释了如何在Sentence Compression数据集上训练SentenceTransformers模型来执行语义搜索。使用BERT基础模型(不区分大小写)作为基础的变换器,并应用Huggi…

家居分类的添加、修改、逻辑删除和批量删除

文章目录 1.逻辑删除家居分类1.将之前的docker数据库换成云数据库2.树形控件增加添加和删除按钮1.找到控件2.粘贴四个属性到<el-tree 属性>3.粘贴两个span到<el-tree>标签里4.代码5.效果6.方法区新增两个方法处理添加和删除分类7.输出查看一下信息8.要求节点等级小…

Spring AI项目Open AI绘画开发指导

Spring AI项目创建 Spring AI简介创建Spring AI项目配置项目pom和application文件controller接口开发运行测试 Spring AI简介 Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则&#xff08;如可移植性和模块化设计&#xff09;应用于 AI&#xff0c;并推广…

自作聪明的AI? —— 信息处理和传递误区

一、背景 在人与人的信息传递中有一个重要问题——由于传递人主观处理不当&#xff0c;导致信息失真或产生误导。在沟通交流中&#xff0c;确实存在“自作聪明”的现象&#xff0c;即传递人在转述或解释信息时&#xff0c;根据自己对信息的理解、经验以及个人意图进行了过多的…

SpringSecurity6实现动态权限,rememberMe、OAuth2.0授权登录,退出登录等功能

本文章对应视频可在B站查看SpringSecurity6对应视频教程&#xff0c;记得三连哦&#xff0c;这对我很重要呢&#xff01; 温馨提示&#xff1a;视频与文章相辅相成&#xff0c;结合学习效果更强哦&#xff01; 系列文章链接 1、初识SpringSecurity&#xff0c;认识主流Java权限…

AI+文旅|当智慧遇见风景,感受文旅新体验

今年的五一假期,公众出游热度持续升温&#xff0c;全国多地景区再现“人山人海”&#xff0c;在这样的背景下&#xff0c;促使文旅行业不断通过数字化手段&#xff0c;提升旅游体验质量、探索新的服务方式&#xff0c;AI技术的加入为旅游业带来了革命性的变化。智能导游、智能推…

FOTS:一种用于机器人操作技能Sim2Real学习的快速光学触觉仿真器

类 GelSight的视触觉传感器具有高分辨率和低制造成本的优势&#xff0c;但是在与现实中的物体进行频繁接触时易受磨损。而触觉仿真器可大幅降低硬件成本&#xff0c;同时为后续技能学习任务提供仿真训练环境。为此&#xff0c;来自东南大学自动化学院的钱堃副教授研究团队和伦敦…

大厂常见算法50题-两数相加

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法总结 题目 解法 定义一个节点pre&#xff0c;用于初始化结果链表的头部&#xff0c;cur指向pre&#xff0c;它将在遍历过程中用于构建新的链表。初始化进位变…

基于单片机的直流电机测速装置研究与设计

摘要: 基于单片机的直流电机测速装置采用了对直流电机的中枢供电回路串联取样电阻的方式实现对电机转速的精确实时测量。系统由滤波电路、信号放大电路、单片机控制电路以及稳压电源等功能模块电路构成。工作过程中高频磁环作为载体&#xff0c;利用电磁感应的基本原理对直流电…

使用Flask部署Web应用:从入门到精通

文章目录 第一部分&#xff1a;准备工作第二部分&#xff1a;部署Flask应用到AWS部署到AWS Lambda 第三部分&#xff1a;部署Flask应用到腾讯云服务器部署到腾讯云服务器 第四部分&#xff1a;优化和扩展结论 在现代软件开发中&#xff0c;Web应用的部署是一个至关重要的环节。…

面试题:调整数字顺序,使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分 算法1&#xff1a; 利用快速排序的一次划分思想&#xff0c;从2端往中间遍历 时间复杂度&#x…

【漏洞复现】泛微OA E-Cology ResourceServlet文件读取漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology ResourceServlet存在任意文件读取漏洞&#xff0c;允许未经授权的用户…

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看&#xff1a;网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的&#xff0c;距离矢量型协议是边算边…

【java-数据结构14-双向链表的增删查改2】

上一篇文章中&#xff0c;我们已经对双向链表进行一些基本操作&#xff0c;本篇文章我们继续通过对链表的增删查改来加深对链表的理解~同时有任何不懂的地方可以在评论区留言讨论&#xff0c;也可以私信小编~觉得小编写的还可以的可以留个关注支持一下~话不多说正片开始~ 注意…

「JavaEE」多线程案例分析3:线程池

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程池 &#x1f349;简介&#x1f349;标准库中的线程池&#x1f349;Executors&#x1f349;实现一个简单的线程池 &#x1f349;简介…

初始Django

初始Django 一、Django的历史 ​ Django 是从真实世界的应用中成长起来的&#xff0c;它是由堪萨斯&#xff08;Kansas&#xff09;州 Lawrence 城中的一个网络开发小组编写的。它诞生于 2003 年秋天&#xff0c;那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和…