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

lar*_*ein 3 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);
Run Code Online (Sandbox Code Playgroud)

我期望与作业数量成正比。但是结果是这样。

循环差异-分配0:14

循环差异-分配1:16

循环差异-分配2:18

循环差异-分配3:20

循环差异-分配4:22

为什么这样的结果?

Gui*_*ean 5

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

您可以在此处看到它可能提供的装配。

每个分配都包含一个mov和一个,str因此是两个组装说明。但是即使由于流水线,缓存策略等原因,即使知道执行的汇编指令也不一定总能得出精确的循环数。

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

但是,此处要测量的代码可能没有多大意义(分配多个值,而在两者之间不做任何事情-除非i是寄存器)。