繁体   English   中英

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

[英]STM32 - DWT cycle count is differrent from my prediction

我使用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或Flash)执行代码的位置等...

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM