c - STM32 - DWT 周期计数与我的预测不同

标签 c arm stm32 cortex-m

我使用 DWT->CYCCNT 检查了核心周期计数。但与我的预测不同。能告诉我原因吗?

我的设备是 STM32 NUCLEO-L476RG。 我只是检查 DWT->CYCCNT。并且只改变了整数赋值的次数。

  m_nStart = DWT->CYCCNT;  
  m_nStop = DWT->CYCCNT;
  printf("Cycle diff - assign 0 : %lu\n", m_nStop - m_nStart);

  m_nStart = DWT->CYCCNT;  
  i = 10;
  m_nStop = DWT->CYCCNT;
  printf("Cycle diff - assign 1 : %lu\n", m_nStop - m_nStart); 

  m_nStart = DWT->CYCCNT;  
  i = 10;
  i = 20;
  m_nStop = DWT->CYCCNT;
  printf("Cycle diff - assign 2 : %lu\n", m_nStop - m_nStart); 

  m_nStart = DWT->CYCCNT;  
  i = 10;
  i = 20;
  i = 30;
  m_nStop = DWT->CYCCNT;
  printf("Cycle diff - assign 3 : %lu\n", m_nStop - m_nStart); 

  m_nStart = DWT->CYCCNT;  
  i = 10;
  i = 20;
  i = 30;
  i = 40;
  m_nStop = DWT->CYCCNT;
  printf("Cycle diff - assign 4 : %lu\n", m_nStop - m_nStart);

我期望与分配的数量成正比。 但结果是这样的。

循环差异 - 分配 0 : 14

循环差异 - 分配 1 : 16

循环差异 - 分配 2 : 18

循环差异 - 分配 3 : 20

循环差异 - 分配 4 : 22

为什么会有这样的结果?

最佳答案

很难预测在 ARM Cortex 上执行一行 C 代码所需的周期数。这取决于编译器、您设置的优化级别、您声明变量的方式、是否启用缓存、代码从何处执行(RAM 或闪存)等...

可以看到here可能提供的程序集。

每个赋值都包含一个mov 和一个str 所以两个汇编指令。但是,由于流水线、缓存策略等原因,即使知道执行的汇编指令也并不总是能够推断出精确的周期数......

最后,获得有效数字的唯一方法是测量一部分代码,就像您所做的那样。

然而,您在这里测量的代码可能没有多大意义(分配多个值,中间不做任何事情 - 除非 i 是一个寄存器)。

关于c - STM32 - DWT 周期计数与我的预测不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57572653/

相关文章:

c - lstat() st_blocks 输出错误值

c - 将 ARM asm 反编译回 C

ios - R9 在 iOS 2.x ABI 中的使用?

debugging - 如何使用 OpenOCD 同时与两 block STM32 板通信?

c - STM32f3 - 多个ADC

c - 数值稳定正向替换

c - libpng.lib 中的链接器错误 "unresolved external symbol __imp___iob_func"

c - Valgrind 中的读取大小无效

android - SQLcipher(不同版本)在一个平台上工作,但在另一个平台上崩溃

c - 如何将堆栈对齐到 SRAM 的末尾?