跳转到内容

Alcor6L/eLua/tmr

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

此模块包含用于访问 eLua CPU 硬件定时器的函数。此外,如果启用了虚拟定时器(有关详细信息,请参阅此处和此处),则可以使用它们,就像使用“常规”(硬件)定时器一样,只有一个例外:您无法设置虚拟定时器的时钟(使用 tmr.setclock)。要将此模块与虚拟定时器一起使用,请将 tmr.VIRTx 指定为定时器 ID,而不是数字。例如,如果 eLua 映像配置为支持 4 个虚拟定时器,则可以使用 tmr.VIRT0tmr.VIRT3 作为定时器 ID 来访问它们。系统定时器也可以使用所有这些函数,方法是省略定时器 ID 或将其指定为 tmr.SYS_TIMER

此模块中以及 eLua 的其他部分(超时)中的所有“时间单位”(延迟、时间差异)都以微秒(μs)表示。但是,请记住,实际定时器分辨率取决于许多因素。例如,tmr.delay 函数很可能无法以您指定的精确时间(以 μs 为单位)延迟,因为实际延迟取决于许多变量,最重要的是定时器的基准时钟和定时器计数器寄存器的尺寸(在某些平台上为 32 位,在大多数平台上为 16 位,其他值不太常见)。为了确保您请求的延迟是可实现的,请使用 tmr.getmindelaytmr.getmaxdelay 分别获取定时器上可实现的最大和最小等待时间。即使您的延迟在这些限制范围内,此函数的精度仍然变化很大,主要取决于定时器基准时钟。如果平台上提供系统定时器,则强烈建议使用它,因为它可以消除上述问题。

tmr.delay

[编辑 | 编辑源代码]

等待指定时间段,然后返回。

tmr.delay( id, period )
  • id - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。
  • period - 等待时间(以 μs 为单位)。

读取定时器计数器寄存器。

counter = tmr.read( [id] )
  • id(可选) - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。如果未指定,则默认为 nil。

返回值

  • counter - 定时器计数器寄存器的值。

tmr.start

[编辑 | 编辑源代码]

启动指定的定时器。

counter = tmr.start( [id] )
  • id(可选) - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。如果未指定,则默认为 nil。

返回值

  • counter - 定时器启动时定时器计数器寄存器的值。

tmr.gettimediff

[编辑 | 编辑源代码]

计算两个定时器计数器值(通过调用 tmr.read 或 tmr.start 获取)之间的时间差。

delta = tmr.gettimediff( id, start, end )
  • id - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。
  • start - 初始计数器值。
  • end - 最终计数器值。

返回值

  • delta - 时间差(以 μs 为单位)。

startend 的顺序很重要。end 必须对应于在 start 之后发生的时间点。该函数知道如何处理单个定时器溢出条件(end 小于 start);如果定时器在 startend 之间溢出了 2 次或更多次,则此函数的结果将不正确。

tmr.getdiffnow

[编辑 | 编辑源代码]

计算过去(通过调用 tmr.read 或 tmr.start 获取)的计数器值与当前时间对应的计数器值之间的时间差。

delta = tmr.getdiffnow( id, start )
  • id - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。
  • start - 初始计数器值。

返回值:时间差(以 μs 为单位)。

tmr.getmindelay

[编辑 | 编辑源代码]

获取指定定时器上可实现的最小延迟。

mindelay = tmr.getmindelay( [id] )
  • id(可选) - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。如果未指定,则默认为 nil。

返回值

  • mindelay - 指定定时器上可实现的最小延迟(以 μs 为单位)。

tmr.getmaxdelay

[编辑 | 编辑源代码]

获取指定定时器上可实现的最大延迟。

maxdelay = tmr.getmaxdelay( [id] )
  • id(可选) - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。如果未指定,则默认为 nil。

返回值

  • maxdelay - 指定定时器上可实现的最大延迟(以 μs 为单位)。

tmr.setclock

[编辑 | 编辑源代码]

设置定时器时钟(用于递增定时器计数器寄存器的时钟)。

clock = tmr.setclock( id, clock )
  • id - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。
  • clock - 定时器时钟(以 Hz 为单位)。

返回值

  • clock - 设置在定时器上的实际时钟(以 Hz 为单位)。根据硬件,这可能与时钟参数的值不同。注意:此函数不适用于虚拟定时器或系统定时器。

tmr.getclock

[编辑 | 编辑源代码]

获取定时器时钟(用于递增定时器计数器寄存器的时钟)。

clock = tmr.getclock( [id] )
  • id(可选) - 定时器 ID。使用 nil 或 tmr.SYS_TIMER 指定系统定时器。如果未指定,则默认为 nil。

返回值

  • clock - 定时器时钟(以 Hz 为单位)。

tmr.set_match_int

[编辑 | 编辑源代码]

设置定时器匹配中断。仅在启用中断支持时可用,有关详细信息,请查看此处。

tmr.set_match_int( id, period, type )
  • id - 定时器 ID。如果为 nil,则默认为系统定时器(但请注意,这仅出于一致性原因,因为系统定时器无法生成中断)。
  • period - 中断周期(以微秒为单位)。将其设置为 0 将禁用定时器匹配中断。
  • type - tmr.INT_ONESHOT 用于在 period 微秒后生成单个中断,或 tmr.INT_CYCLIC 用于每 period 微秒生成一次中断。
华夏公益教科书