【问题标题】:How to get the precise time of the consumption function by using SYSTICK timer?如何使用SYSTICK定时器获取消费函数的精确时间?
【发布时间】:2014-10-14 12:31:19
【问题描述】:

据我所知,SYSTICK Timer 是一个 24 位递减计数器。现在,我需要知道 memcpy 函数的精确消耗时间。假设我设置 SysTick->RELOAD = 511,会出现以下两种情况。

定义: 1. 一个循环意味着 511 到 0 必须完成。 2. 两个或多个循环表示 511 到 0, 511 到 0, ... , 511 到 0, 511 到 i, i in [0, 511]。

案例1:偏移量小或正常,所以memcpy会在一个周期内完成。

案例 2:偏移量很大,例如16K。所以 memcpy 将在两个或更多周期内完成。

如何获得“循环”?

【问题讨论】:

  • 要么使用更大的重载,要么启用中断并增加其中的其他变量(不会那么精确,但是通过足够高的重载,你不会注意到差异......或者你可以估计由新的柜台)

标签: arm stm32 cortex-m


【解决方案1】:

See the documentation

SysTick 有 24 位计数器,RELOAD@0xE000E014 和 CURRENT@0xE000E018。没有什么比RELOAD=0x00FFFFFF; call_the_func(); unsigned diff = RELOAD-CURRENT 更简单的了。

如果需要,启用中断并配置SysTick_Handler() 以增加一些其他值(以获得更大的范围)。然后可以计算my_global*(RELOAD-few) + (RELOAD-CURRENT)

我将 SysTick 用于 10 毫秒计时器 - 只是每 10 毫秒递增一次全局计数器(从中断开始),并观察与启动时存储的值的差异;)

【讨论】:

  • 它也会翻转,beg=current,do stuff,end=current,diff=(beg-end)&0xFFFFFF,只要你停留在一个周期内(或检测到翻转)跨度>
  • @dwelch:当然,就像我的计时器一样,但同时存储全局计数器和SysTick->CURRENT,然后计算差异(无论在什么时间段,10 毫秒的全局计数器都会在一年多后翻转)。
  • 当然。我的意思是你可以初始化一次计时器,不再碰它,通过比较差异而不是开始 - 现在尽可能多地使用它。
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多