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 或闪存)等...
你可以看到here它可能给出的程序集。
每个赋值包含一个 mov
和一个 str
所以两个汇编指令。但是即使知道执行的汇编指令也不能总是推断出精确的周期数,因为流水线、缓存策略等...
最后,获得有效数字的唯一方法是测量一部分代码,就像您所做的那样。
然而,您在这里测量的代码可能没有多大意义(分配多个值,中间不做任何事情 - 除非 i
是一个寄存器)。
我使用 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
是一个寄存器)。