|
一些ARM Cortex-M内核实现了DWT(数据观察点和跟踪)单元,该单元有一个很好的功能,在内部可以计算执行周期。 DWT通常在大多数Cortex-M3、M4和M7器件上都已经实现了,包括如恩智浦的Kinetis或LPC器件。
概览 执行分析工具,如SEGGER SystemView,使用DWT来测量代码执行所用的时间。 这篇文章主要介绍如何直接从应用程序代码使用,或启用周期计数并且在调试时进行监视。
寄存器和访问函数 DWT通常在Cortex-M3或更高版本中实现,但Cortex-M0(+)没有实现改功能。 要使用该功能,需要访问几个调试寄存器。 您可以使用CMSIS-Core头文件来实现此目的,但由于在不使用CMSIS-Core的情况时只有很少的寄存器,因此需要下面我将要使用的定义: - /* DWT (Data Watchpoint and Trace) registers, only exists on ARM Cortex with a DWT unit */
- #define KIN1_DWT_CONTROL (*((volatile uint32_t*)0xE0001000))
- /*!< DWT Control register */
- #define KIN1_DWT_CYCCNTENA_BIT (1UL<<0)
- /*!< CYCCNTENA bit in DWT_CONTROL register */
- #define KIN1_DWT_CYCCNT (*((volatile uint32_t*)0xE0001004))
- /*!< DWT Cycle Counter register */
- #define KIN1_DEMCR (*((volatile uint32_t*)0xE000EDFC))
- /*!< DEMCR: Debug Exception and Monitor Control Register */
- #define KIN1_TRCENA_BIT (1UL<<24)
- /*!< Trace enable bit in DEMCR register */
复制代码
为了使用这些寄存器,我已经定义了一组“类似函数”的宏,可以在应用程序代码中使用: - #define KIN1_InitCycleCounter() \
- KIN1_DEMCR |= KIN1_TRCENA_BIT
- /*!< TRCENA: Enable trace and debug block DEMCR (Debug Exception and Monitor Control Register */
-
- #define KIN1_ResetCycleCounter() \
- KIN1_DWT_CYCCNT = 0
- /*!< Reset cycle counter */
-
- #define KIN1_EnableCycleCounter() \
- KIN1_DWT_CONTROL |= KIN1_DWT_CYCCNTENA_BIT
- /*!< Enable cycle counter */
-
- #define KIN1_DisableCycleCounter() \
- KIN1_DWT_CONTROL &= ~KIN1_DWT_CYCCNTENA_BIT
- /*!< Disable cycle counter */
-
- #define KIN1_GetCycleCounter() \
- KIN1_DWT_CYCCNT
- /*!< Read cycle counter register */
复制代码
典型用法 要使用周期计数功能,必须配置和启用DWT。 如果使用调试器连接到目标,则DWT通常已经由调试器启用。 要使得它在没有活动的调试会话下工作正常,必须首先在代码中进行初始化。 - uint32_t cycles; /* number of cycles */
-
- KIN1_InitCycleCounter(); /* enable DWT hardware */
- KIN1_ResetCycleCounter(); /* reset cycle counter */
- KIN1_EnableCycleCounter(); /* start counting */
- foo(); /* call function and count cycles */
- cycles = KIN1_GetCycleCounter(); /* get cycle counter */
- KIN1_DisableCycleCounter(); /* disable counting if not used any more */
复制代码
周期计数器 在调试会话期间监视周期计数器很容易实现:在“Expressions”视图中添加以下表达式: - (*((volatile uint32_t*)0xE0001004))
复制代码
通过这样,视图就可以显示当前的周期计数器了:
总结 如果您正在使用的ARM Cortex-M具有DWT功能,那么可以使用周期计数器来测量执行代码所花费的周期。这种方式可以用于延迟循环或者测量执行时间。
参考连接: ■ DEMCR寄存器:http://infocenter.arm.com/help/i ... 0337e/CEGHJDCF.html ■ DWT寄存器: http://infocenter.arm.com/help/i ... 0439b/BABJFFGJ.html ■ DWT控制寄存器:http://infocenter.arm.com/help/i ... 37e/ch11s05s01.html |