2017-04-03 120 views
0

我想開發一個contiki代碼片段,我需要等待傳感器輸出三秒鐘。儘管在開發時這聽起來可能聽起來很像傳感器,但我想模擬人類可讀速度下的行爲,因此我需要將計時器設置爲3秒。Contiki在幾秒鐘內延遲

contiki定時器library是不錯的documented並有一個很好的系列的例子,提到了定時器的創建,設置和重置。但是,如果我有一個像下面的代碼:

timer_set(&transducerOutputWaitTimer); 
bool if_blk_executed; 
if(timer_expired(&&transducerOutputWaitTimer)){ 
    if_blk_executed = true; 
    //do something 
} 
if(if_blk_executed) 
    printf("Sunrise"); 
else 
    printf("It is not dawned yet"); 

現在到期不立即設置計時器後觸發。所以if塊永遠不會被執行。實際上它永遠不會黎明。

現在有兩種方法可以讓系統等待。一,通過在計時器上添加一個while循環,如下所示: while(!timer_expired(& & transducerOutputWaitTimer)){}; //做某事

或 cpu_delay_usecs {mytimerdur_in_secs * 10^6 *}; //做某事

我沒有看到任何一種方法都很優雅。當一個人浪費CPU週期時,另一個人執行不必要的大計算。

有沒有更好的方法?我知道,時鐘

附加到這個問題的有以下兩種:

  1. 我怎樣才能觸發一個半自助旅遊旅行社protothread從另一個?如果我可以做到這一點,我可以得到中斷,導致transducerOutput調用一個可以觸發etimer並處理事件的進程。

  2. CPU延遲究竟意味着什麼?這是否意味着整個CPU時鐘週期在給定的持續時間內被阻止?如果是,那麼系統中當前運行的其他進程如何受到影響?

更新 更新1:雖然方法不起作用。代碼可能進入無限循環。 更新2:在設置我的計時器後,我嘗試了clock_delay(3 * CLOCK_SECOND)方法。有效。但是,在這種情況下,爲什麼我需要定時器方法呢?

更新3(這改變了答案的上下文中,因此加入此評論按照建議)

我的計時器需要以不同的空隙功能的處理之外使用。在這種情況下,我需要使用定時器()庫,而不是etimer(這是特定的一個過程。那麼,如何讓我的方法,以等待在這種情況下所需的時間?

+0

問題更新 –

回答

0

有幾個半自助旅遊旅行社內置計時器庫頂抽象 - 通常沒有必要用戶timer_t結構,而不是直接,也有事件計時器(struct etimer),這與半自助旅遊旅行社流程一起玩好,回調定時器(struct ctimer),兩者的內部。使用struct timer。對於API更少的RAM較少的選項,有第二個定時器(struct stimer)。最後,系統中有一個實時定時器(struct rtimer)。

example事件計時器的使用:設置和等待3秒鐘:

static struct etimer timer; 
etimer_set(&timer, 3 * CLOCK_SECOND); 
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); 

我怎樣才能觸發一個半自助旅遊旅行社protothread從另一個?

process_poll - 有關更多示例,請參閱過程API documentation

究竟是什麼CPU的延遲意味着什麼呢?

它的忙等待的形式。不要使用延時函數或其他形式的忙等待延誤超過微秒長 - 不節能,不允許其他進程運行,而在最壞的情況下監視可能會失效。

+0

我的計時器需要在不同的void函數的過程之外使用。在這種情況下,我需要使用timer()庫而不是etimer(這是特定於流程的。因此,在這種情況下如何讓我的方法等待所需時間?) –

+0

您應該更新問題這一要求 - 這是非常相關的,制約的答案簡短的回答是,半自助旅遊旅行社方法的收率在處理功能本身只支持你要麼需要有移動你的代碼或分開,在兩個功能:第一個將設置。等候,第二個將繼續等待後,使用'ctimer'將是很好的辦法如何做到這一點。 – kfx

+0

BTW,我如何獲得句柄到事件的來源是什麼?我說,我已經PROCESS_EVENT_EXITED。我怎麼知道這是退出的過程嗎?我可以從process.c或process.h庫獲取指針來執行此操作嗎?搜索了這兩個源文件,但無法完成。 –