测量 Cortex m7 上的时钟周期数

2023-11-23

我一直在测量 Cortex m4 上的时钟周期计数,现在想在 Cortex m7 上进行测量。我使用的板子是STM32F746ZG。

对于 m4 一切都适用:

volatile unsigned int *DWT_CYCCNT;
volatile unsigned int *DWT_CONTROL;
volatile unsigned int *SCB_DEMCR;

void reset_cnt(){
    DWT_CYCCNT   = (volatile unsigned int *)0xE0001004; //address of the register
    DWT_CONTROL  = (volatile unsigned int *)0xE0001000; //address of the register
    SCB_DEMCR    = (volatile unsigned int *)0xE000EDFC; //address of the register
    *SCB_DEMCR   = *SCB_DEMCR | 0x01000000;
    *DWT_CYCCNT  = 0; // reset the counter
    *DWT_CONTROL = 0; 
}

void start_cnt(){
    *DWT_CONTROL = *DWT_CONTROL | 0x00000001 ; // enable the counter
}

void stop_cnt(){
     *DWT_CONTROL = *DWT_CONTROL & 0xFFFFFFFE ; // disable the counter    
}

unsigned int getCycles(){
    return *DWT_CYCCNT;
}

问题是,当我在 m7 上运行时,DWT_CTRL 寄存器没有更改,并且仍然是 0x40000000,而不是更改为 0x40000001,因此周期计数始终为零。从我在其他帖子中读到的内容来看,您似乎需要将 FP_LAR 寄存器设置为 0xC5ACCE55 才能更改 DWT_CTRL。

我添加了这些定义(已尝试下面的两个 FP_LAR_PTR 地址):

#define FP_LAR_PTR ((volatile unsigned int *) 0xe0000fb0) //according to reference
//#define FP_LAR_PTR ((volatile unsigned int *) 0xe0002fb0) //according to guy on the internet
// Lock Status Register lock status bit
#define DWT_LSR_SLK_Pos                1
#define DWT_LSR_SLK_Msk                (1UL << DWT_LSR_SLK_Pos)
// Lock Status Register lock availability bit
#define DWT_LSR_SLI_Pos                0
#define DWT_LSR_SLI_Msk                (1UL << DWT_LSR_SLI_Pos)
// Lock Access key, common for all
#define DWT_LAR_KEY                    0xC5ACCE55

和这个函数:

void dwt_access_enable(unsigned int ena){
    volatile unsigned int *LSR;
    LSR = (volatile unsigned int *) 0xe0000fb4;
    uint32_t lsr = *LSR;;
    //printf("LSR: %.8X - SLI MASK: %.8X\n", lsr, DWT_LSR_SLI_Msk);

    if ((lsr & DWT_LSR_SLI_Msk) != 0) {
        if (ena) {
            //printf("LSR: %.8X - SLKMASK: %.8X\n", lsr, DWT_LSR_SLK_Msk);
            if ((lsr & DWT_LSR_SLK_Msk) != 0) {    //locked: access need unlock
                *FP_LAR_PTR = DWT_LAR_KEY;
                printf("FP_LAR directly after change: 0x%.8X\n", *FP_LAR_PTR);
            }
        } else {
            if ((lsr & DWT_LSR_SLK_Msk) == 0) {   //unlocked
                *FP_LAR_PTR = 0;
                 //printf("FP_LAR directly after change: 0x%.8X\n", *FP_LAR_PTR);
            }
        }
    }
}

当我调用未注释的打印时,我得到 0xC5ACCE55,但是当我在函数返回后打印它时,我得到 0x00000000,我不知道为什么。我走在正确的道路上还是完全错误的?

编辑:我认为值得一提的是,我已经尝试过在函数中没有使用所有额外代码,并且只尝试更改 LAR 寄存器。

BR 古斯塔夫


再次查看文档,我现在非常怀疑 ARM TRM 中存在拼写错误或复制粘贴错误。 0xe0000fb0 被指定为 ITM_LAR、DWT_LAR 的地址andFP_LSR(与 *_LSR 等效)。由于所有其他 ITM 寄存器are在第 0xe0000000 页中,看起来非常像负责 Cortex-M7 文档该部分的人获取了 Cortex-M4 寄存器定义,将新的 LAR 和 LSR 添加到 ITM 页面,然后将它们复制到 DWT 和 FPB 页面更新名称但忽略更新地址。

我敢打赌你在无意中解锁了 ITM_LAR(或真正的 FP_LAR),而 DWT_LAR 实际上位于 0xe0001fb0.

编辑:dwelch

有人欠某人一顿晚餐。

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE000EDFC,0x01000000);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE0001000,0x40000001);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

PUT32(0xE0001FB0,0xC5ACCE55);
PUT32(0xE0001000,0x40000001);

hexstring(GET32(0xE0001FB4));
hexstring(GET32(0xE0001000));
hexstring(GET32(0xE0001004));
hexstring(GET32(0xE0001004));

output

00000000
00000000
00000000
00000000
00000003
40000000
00000000
00000000
00000003
40000000
00000000
00000000
00000001
40000001
0000774F
0000B311

TRM 中的表格看起来很有趣,正如其他文档所示,您将 0xFB0 和 0xFB4 添加到基础中,Cortex-M7 的 DWT 的其余部分是 0xE0001xxx,实际上,LAR 和 LSR 似乎吃了 0xE0001FB0 和 0xE0001FB4 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测量 Cortex m7 上的时钟周期数 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 我无法在 iOS 模拟器中删除启动画面图像

    我正在 SDK iOS 模拟器上测试我的应用程序 以确保它正常运行 首先 我决定删除闪屏图像 因为我认为我不想要这样的图像 当我再次运行我的应用程序时 它再次显示启动图像 我认为我有点困惑 所以我从引用中删除了该图像 并将图像从文件夹中删除
  • 如何在Python中将带有不带引号的键的字符串转换为字典

    我有一根绳子 a b c d e 请注意 字典条目的键未加引号 因此一个简单的eval a b c d e 如建议的上一个问题不起作用 将此字符串转换为字典的最方便的方法是什么 a b c d e 如果这是来自可信来源 不要将其用于一般用户
  • 如何从通知深层链接到 SwiftUI 中的屏幕?

    我正在尝试在我的应用程序中设置深层链接 我已经设置了应用程序以及推送通知 但是 我无法完成 AppDelegate 接收用户单击我想要深层链接到的屏幕的通知的最终链接 我基本上想从 AppDelegate 调用 viewRouter goT
  • Lifecycle @OnLifecycleEvent() 已弃用,您应该使用 LifecycleEventObserver 或 DefaultLifecycleObserver [重复]

    这个问题在这里已经有答案了 答案在底部 我认为这对你有用 生命周期事件观察者 Firstly 你应该实现这个 dependencies implementation androidx lifecycle lifecycle extensio
  • 错误:项目文件必须在引用列表中包含 .NET Framework 程序集“WindowsBase、PresentationCore、PresentationFramework”

    我在带有 C 的 Windows 窗体应用程序中使用 WPF 跟进问题 将一组实线 虚线笔添加到组合框 Error 项目文件必须在引用列表中包含 NET Framework 程序集 WindowsBase PresentationCore
  • MongoDB中聚合方法的返回类型是什么?

    我试图根据 mongo 的聚合方法获得一组结果 并根据返回值尝试在所有结果中添加一个属性 聚合方法为我提供了最高的数字 综合体中特定销售点一个月内的销售额 我想将属性 HighestSales 添加到它返回的那些文档中 我的查询是 var
  • 如何正确初始化全局变量? [复制]

    这个问题在这里已经有答案了 我正在编写一个小学生项目 并遇到了一个问题 我有一些全局变量 需要在一些源文件中使用它 但我收到错误对变量名的未定义引用 例如 我们创建三个源文件 tst1 h extern int global a void
  • mongo - 无法连接到服务器 127.0.0.1:27017

    我来自 riak 和 redis 在这些服务启动或交互方面我从未遇到过问题 这是 mongo 的一个普遍问题 我很无能 重新启动没有帮助 我是 mongo 新手 mongo MongoDB shell version 2 2 1 conne
  • AVFoundation 元数据对象类型

    我尝试使用 AVFoundation 来读取带有以下代码的条形码 但我不断收到以下错误 帮助说明原因将不胜感激 提前致谢 Create camera view session AVCaptureSession var layer self
  • Toopay/bootstrap-markdown 的预览按钮不起作用

    我正在用 symfony 创建一个表单 我的表单的一个字段是textarea我想通过使用让它看起来更好引导降价 根据文档 我设置了属性 data provide to markdown 如下图所示 form row form descrip
  • Rails 从 Helper 模块返回多个 content_tag

    我写了以下助手 def section to html block case block 0 downcase when paragraph block shift block each do value return content ta
  • 如何创建可变变量?

    我知道一些其他语言 比如PHP 支持 变量变量名 的概念 即字符串的内容可以用作变量名的一部分 我听说这通常是一个坏主意 但我认为它可以解决我在 Python 代码中遇到的一些问题 在Python中可以做这样的事情吗 会出现什么问题 If
  • 如何使“过期”的 Firebase 实例 ID 令牌失效

    AFAIK Firebase实例令牌将在以下4种情况下刷新 应用程序删除实例ID 应用程序已在新设备上恢复 用户卸载 重新安装应用程序 用户清除应用数据 假设用户使用令牌 A 作为他的 FCM 地址 每次登录应用程序时 他都会将令牌 A 以
  • “找不到 CFBundle/CFPlugIn 的可执行文件”错误

    找不到 CFBundle CFPlugIn 0x432bfa0 的可执行文件 未加载 在 CFBundle CFPlugIn 0x432bfa0 中找不到工厂 C5A4CE5B 0BB8 11D8 9D75 0003939615B6 的函数
  • jqGrid - 动态设置标题

    我有captionjqGrid 定义中的参数集 我想知道是否有一种方法可以根据情况动态设置它classjqGrid 插件所附加的表元素的属性 HTML 1 table class view table div div HTML 2 tabl
  • 在 Linux 机器上创建自解压 zip 存档

    由于许多我不会涉及的限制 我必须在 Linux 机器上创建一个自解压 ZIP 存档 生成的存档只能在 Windows 上执行 这是可能吗 如果是这样 什么工具可以完成这项工作 背景 当用户从我的 Linux 盒子下载安装包时 我需要使用某个
  • 如果在单独的类中定义异常子句,Camel 异常处理将不起作用

    我正在尝试构建一个具有多个骆驼路线的应用程序 这些路线在内部重用许多常见路线 因此 我尝试将路由分隔在几个不同的路由生成器类中 然后在需要的地方连接路由 例如 与发送电子邮件有关的所有路由都进入 EmailRouteBuilder 类 而处
  • 使用 Laravel (Localhost) 通过表单将文件发送到电子邮件

    Laravel 新手 所以要友善 哈哈 我的 mail php 配置是正确的 并且可以成功接收电子邮件以进行 gmail 的文本输入 但不确定如何完成文件任务 我希望得到一些帮助或参考链接 提前致谢 代码在routes php中 Route
  • iOS 8 CoreBluetooth 已弃用 RSSI 方法

    所以从阅读CBPeripheralDelegate文档 看来RSSI and peripheralDidUpdateRSSI error iOS 8 中已弃用 Xcode 警告 iOS 8 0 中已弃用 rssi 我注意到我的信号强度指示器
  • 测量 Cortex m7 上的时钟周期数

    我一直在测量 Cortex m4 上的时钟周期计数 现在想在 Cortex m7 上进行测量 我使用的板子是STM32F746ZG 对于 m4 一切都适用 volatile unsigned int DWT CYCCNT volatile