我想测试STM32上单个函数的运行时间。我能找到的唯一东西是 SysTick_Handler
。然而,那是一个定期的中断,而我需要获取时间间隔,例如:
long t1 = mcu_clock();
sleep(20);
long t2 = mcu_clock();
long diff = (t2 - t1);
我尝试使用 C 的 clock()
函数,但它无法正常工作并且总是返回 -1
。 我该怎么做呢?
我想测试STM32上单个函数的运行时间。我能找到的唯一东西是 SysTick_Handler
。然而,那是一个定期的中断,而我需要获取时间间隔,例如:
long t1 = mcu_clock();
sleep(20);
long t2 = mcu_clock();
long diff = (t2 - t1);
我尝试使用 C 的 clock()
函数,但它无法正常工作并且总是返回 -1
。 我该怎么做呢?
首先,在启动时启用循环计数器:
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
然后,您可以访问其值:
unsigned long t1 = DWT->CYCCNT;
/* do something */
unsigned long t2 = DWT->CYCCNT;
unsigned long diff = t2 - t1;
它计算了经过的CPU周期,您需要将它除以CPU时钟频率以获得秒为单位的值。
由于它是一个32位的值,在更高的时钟频率下它可能会很快溢出,例如在216 MHz下约19.88秒。
int millis = HAL_GetTick();
SysTick_Handler
中递增一个变量并查询该变量。 - Bence Kaulics