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