c - ARM M4 每周期指令 (IPC) 计数器

标签 c arm performancecounter cortex-m3 cortex-m

我想计算在 ARM cortex-M4(或 cortex-M3)处理器上执行的每个周期的指令数。

它需要的是:我要分析的代码的指令数(在运行时执行)和代码执行所需的周期数

1 - 周期数

使用循环计数器非常简单直接。

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

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

void start_timer(){
    *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter
}

void stop_timer(){
    *DWT_CONTROL = *DWT_CONTROL | 0 ; // disable the counter    
}

unsigned int getCycles(){
    return *DWT_CYCCNT;
}

main(){
    ....
    reset_timer(); //reset timer
    start_timer(); //start timer
    //Code to profile
    ...
    myFunction();
    ...
    stop_timer(); //stop timer
    numCycles = getCycles(); //read number of cycles 
    ...
}

2 - 指令数

我在网上找到了一些文档来统计arm cortex-M3和cortex-M4(link)执行的指令数:

  # instructions = CYCCNT - CPICNT - EXCCNT - SLEEPCNT - LSUCNT + FOLDCNT

他们提到的寄存器记录在案here (从第 11-13 页开始)这些是访问它们的内存地址:

DWT_CYCCNT   = 0xE0001004
DWT_CONTROL  = 0xE0001000
SCB_DEMCR    = 0xE000EDFC
DWT_CPICNT   = 0xE0001008
DWT_EXCCNT   = 0xE000100C
DWT_SLEEPCNT = 0xE0001010
DWT_LSUCNT   = 0xE0001014
DWT_FOLDCNT  = 0xE0001018

DWT_CONTROL 寄存器用于启用计数器,尤其是记录在案的循环计数器 here .

但是,当我试图将所有这些放在一起来计算每个周期执行的指令数时,我没有成功。

Here有一个关于如何从 gdb 使用它们的小指南。

不容易的是有些寄存器是 8 位寄存器(DWT_CPICNT、DWT_EXCCNT、DWT_SLEEPCNT、DWT_LSUCNT、DWT_FOLDCNT),当它们溢出时会触发事件。我没有找到收集该事件的方法。没有代码片段可以解释如何执行此操作或适用于此的中断例程。

此外,似乎在这些寄存器的地址上使用 gdb 的观察点不起作用。当寄存器更改值时,gdb 无法停止。例如。在 DWT_LSUCNT 上:

(gdb) watch *0xE0001014

更新:我找到了这个 project在 GitHub 上解释如何使用 DWT、ITM 和 ETM 单位。但我没有检查它是否有效!我会发布更新。

知道如何使用它们吗?

谢谢!

最佳答案

您提供的代码示例在清除启用位时存在问题。您应该使用“AND”而不是“OR”清除该位:

*DWT_CONTROL = *DWT_CONTROL & 0xFFFFFFFE ; // disable the counter by clearing the enable bit

关于c - ARM M4 每周期指令 (IPC) 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610019/

相关文章:

c - 排列 C 数组中的元素,因此没有间隙

c - 轻量级 IP : Buffer not freeing

c - ARM GDB 无法仅在 Linux 上访问内存

arm - SPI 模式下 microSD 卡初始化。 ACMD41 始终返回 0x01

c - ARM Cortex-M 内存访问

c - 如何使程序在 C 语言中处理不同的文本文件

c - 为什么访问数组中的元素需要常数时间?

azure - OMS 逻辑磁盘性能计数器不存在磁盘实例名称

c# - WMI 性能计数器查询问题

memory - 硬件性能计数器用于统计操作系统的访问次数