rtimer可以滿足精準定時的需要,但是沒有常見的next指針來掛接后續節點, 為了減少rtimer中斷掛接一個rtimer結構是不錯的做法,大多數定時器位寬為16位,因此rtimer的頻率必須小于30kHz。
一.rtimer用途
Contiki系統引入rtimer可以滿足精準定時的需要,一些對時間極為敏感的模塊(如MAC協議)依賴于rtimer。和etimer的粗粒度(常見為100Hz)不同,rtimer是細粒度(常見為10kHz)定時器。根據經驗,細粒度定時器如果中斷頻繁特別容易消耗CPU資源,為此contiki設計rtimer時盡可能地減少中斷,大部分應用場合為讀取定時器計數值。
二.數據結構
Rtimer的數據結構如圖1所示,time賦值為下一次定時器超時中斷的時刻點,func是定時器超時中斷的回調函數,ptr是傳遞給回調函數的數據指針。
從圖1發現,rtimer沒有常見的next指針來掛接后續節點,確實,contiki為了減少rtimer中斷的爆發只能掛接一個rtimer結構,如圖2所示。如果同時掛接2個或以上的rtimer結構,那么最新掛接的有效,其它的rtimer結構將丟失,即圖3的解釋。
這種只能掛接1個rtimer的機制使設計很簡單,并且硬件定時器中斷只在需要的時候才爆發,極大降低了CPU負荷。當然,它也帶來一個限制,只能串行使用rtimer定時器的中斷回調功能,即不具備排隊功能。
三.rtimer中斷時序
圖4展示了rtimer的中斷時序,當調用rtimer_arch_schedule()時,它設置rtimer定時器的中斷間隔時長timeout,中斷服務程序rtimer_irq_handler會調用rtimer-》callback()回調函數。
需要特別注意2點:中斷只允許發生一次,即rtimer_arch_schedule()使能中斷,而rtimer_irq_handler()禁止中斷;rtimer-》callback()是在中斷狀態下運行,特別注意防止競態錯誤,例如,調用process_poll()合法,調用process_post()非法。
四.rtimer移植
有了上述rtimer的理論,再來移植rtimer就比較容易了,即,基于MCU實現rtimer-arch.c和rtimer-arch.h。
需要特別注意,大多數定時器(尤其是8位MCU)位寬為16位,即MAX=65535,而MAC協議往往需要1秒以上的定時周期,因此rtimer的頻率必須小于30kHz。一個比較好的數值是10kHz,它既可以保證比較好的精度(間隔為100us),又具備6.5秒的滿量程,這可以適應大多數的應用需要。
另外,大多數應用需要隨機撤銷和重啟動rtimer,它可以通過添加2個函數來實現:rtimer_arch_disable_irq()和rtimer_arch_enable_irq()。
-
定時器
+關注
關注
23文章
3241瀏覽量
114482
發布評論請先 登錄
相關推薦
評論