跳轉到內容

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

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書