跳轉到內容

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 微秒生成一次中斷。
華夏公益教科書