在沒有時間的情況下多任務是不是不好的做法
同時處理一些資源,例如一些事情,在這里有一些非常感謝的幫助,我終于掌握了如何對微進行多任務處理。大多數(shù)示例使用millis()方法進行非阻塞編程。然而,即使
解答動態(tài)
};
與通常情況一樣,答案是:這取決于。
通常是非阻塞編程,當您在每個循環(huán)上只做很短的事情時。什么是短的取決于具體情況,也就是說,你還想做什么。例如:你在每個環(huán)路上讀取一個模擬值。analogRead()大約需要100us(參考)。我假設,你的傳感器值是相當慢的(所以信號超過150的時間會相當長)。同時,您正在使用digitalRead()讀取一個按鈕。讀取大約需要3.6us(參考)。因此,總的來說,您有一個-150us的循環(huán)(包括開銷和loop()迭代)。但是你想要捕捉的事件-按下按鈕-將在100毫秒的范圍內,這是一個比你的循環(huán)()的總時間大667倍的因子(當沒有事件發(fā)生時)。因此,對于最短的事件(按下按鈕),所有讀取都可以被認為是非阻塞的。(盡管您仍然可以通過if語句中的代碼進行阻塞。這是你調查)
假設,你沒有一個按鈕,但一個數(shù)字信號,你想感測脈沖下降到80us。那么你的analogRead()將花費太長時間,你可能會錯過一個脈沖事件。在這種情況下,analogRead()可能被認為是阻塞的。因此,要檢查您是否真的在使用非阻塞代碼,您需要捫心自問:我是否給了每個代碼部分足夠的時間來正確執(zhí)行并捕獲所有預期的事件?如果是,那么您是非阻塞的。如果不是,那么您就是blocking.
作為一個旁注:通常輪詢被描述為不好的,但它實際上取決于具體情況。在您的例子中,您按順序輪詢輸入,因此每個輸入都以loop()運行的相同(總)速率輪詢。你什么也不做,為什么不使用輪詢來降低處理時間呢?節(jié)省的時間在微上使用得再好不過了(與PC不同,在PC上,節(jié)省的CPU時間可以分配給不同的程序)。
如果電池電量不足,則應考慮讓微盡可能多地睡眠,不要過多地輪詢傳感器。另外,Arduino core庫沒有提供管理睡眠的工具,但是一些第三方庫可用于此目的。
如果您的項目使用主電源,則沒有必要增加睡眠管理的復雜性。除非你的傳感器真的很慢,否則在每個循環(huán)迭代中輪詢它們通常是好的。具體來說,對于一個按鈕,Bounce2庫的文檔說明應該在每次循環(huán)迭代時調用button update方法。- End
免責聲明:
本頁內容僅代表作者本人意見,若因此產生任何糾紛由作者本人負責,概與琴島網(wǎng)公司無關。本頁內容僅供參考,請您根據(jù)自身實際情況謹慎操作。尤其涉及您或第三方利益等事項,請咨詢專業(yè)人士處理。