[英]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.