跳转到内容

Hempl/计时器

来自维基教科书,开放世界中的开放书籍

硬件视图

[编辑 | 编辑源代码]

AT32UC3A 具有三个 16 位倒计时计时器,可以以三种不同的频率运行,彼此独立。当它们设置为以高频率运行时,计时精度更高,但最长的可能延迟更短。

只有一小部分时钟频率可用,这些频率从 16.5MHz 的 PBA 总线频率下降。

除数 时钟频率 最长延迟
PBA/2 8.25 MHz 7.94 毫秒
PBA/8 2.0625 MHz 31.77 毫秒
PBA/32 515.625 kHz 0.127 秒
PBA/128 128.906 kHz 0.508 秒

除了这四种选择之外,芯片还提供从外部 32768Hz 实时精度晶体运行任何计时器的功能。从 1.3.2 版本开始的 Mizar32 板有该组件 (X2) 的空间,可以在其中安装。

软件视图

[编辑 | 编辑源代码]

Hempl 提供了一个 timer 库来访问实时计数器。

三种计时器

[编辑 | 编辑源代码]

硬件计时器

[编辑 | 编辑源代码]

可以使用计时器 ID 01 直接访问前两个硬件计时器。Hempl 使用 16.5MHz 的 PBA 频率,默认情况下,时钟速率设置为最低可用频率 128906Hz,计时精度约为百万分之一秒,最大延迟略高于半秒。

可以使用第一个计时器实现等待十分之一秒的方法如下:

(tmr-delay 0 100000)

这些可用于实现高精度短延迟。

对于前两个计时器中的任何一个,您可以设置比默认的 129kHz 更高的时钟速率。但是,如上表所示,仅支持四个值,其中 PBA 频率 = 16.5MHz。其他值将设置算术上最接近的可用频率。

以下示例将计时器 1 设置为最高可能的计时精度,最大延迟为 7.94 毫秒:

(prinl (tmr-setclock 1 10000000) )

上面的代码将 8250000 作为输出打印。

虚拟计时器

[编辑 | 编辑源代码]

无法直接访问第三个硬件计时器,而是使用它来生成四个“虚拟计时器”,它们的计时器 ID 为 tmr-virt-0tmr-virt-3。这些具有较低的滴答频率和精度——每秒十次——但可用于创建最长 35 分钟的整数 eLua 或 142 年的浮点 eLua 延迟。

(tmr-delay tmr-virt-0 5000000) # Wait for five seconds

这些用于实现较低精度的较长延迟,但无法更改虚拟计时器的时钟速率。

系统计时器

[编辑 | 编辑源代码]

从 20120123 固件版本开始,存在第三种计时器机制,即系统计时器 tmr.SYS_TIMER,其精度为百万分之一秒,可用于提供高达 35 分钟的整数 Lua 和高达 142 年的浮点 Lua 高精度延迟和计时,但您无法更改系统计时器的时钟频率,并且它不能用于生成中断(见下文)。

计时器操作

[编辑 | 编辑源代码]

所有三种计时器都可用于使您的程序等待指定的时间,如上面的示例所示。延迟的精度和可用的最大延迟取决于使用的计时器类型。通常,系统计时器最适合所有类型的延迟,因为它具有高精度并且可以执行长时间延迟。

测量时间

[编辑 | 编辑源代码]

有时,了解自某个先前时刻起经过了多少时间可能很有用,例如,测量代码的速度,或者当您需要在经过一定时间后做出某些决策,但还需要在等待时执行其他操作时。

此示例通过在控制台中打印“Go!”来测量人们的反应时间,然后查看他们需要多长时间才能按下键以进行响应。我们将为此使用系统计时器。

当然,如果您在它说 Go!之前按下 Enter,它会说您的反应非常快。

在 PicoLisp 中

# A reaction timer in picolisp
 
(de reaction-timer ()
   (prinl "Welcome to the reaction timer. When I say Go!, enter a character.")
   (prinl "Press q [Enter] to quit.")
   (setq
      timer *tmr-sys-timer*
      answer "" )
   (until (=T answer)
      (println "Ready?")
      # Wait for a random time from 2 to 5 seconds
      (tmr-delay timer (+ 2000000 (rand 1 3000000)))
      (println "Go!")
      (setq
         start-time (tmr-read timer)
         answer (read) # wait for them to enter any character
         end-time (tmr-read timer) )

请注意:您也可以从我们在 github 上的示例存储库中下载上面的代码 reaction.l

计时器中断

[编辑 | 编辑源代码]

请注意:目前 PicoLisp 不支持中断处理。请参见 问题 #12

进一步阅读

[编辑 | 编辑源代码]
华夏公益教科书