我有一些與arduino有關的任務,但其中一個需要很長時間,所以我想用線程同時運行它們。 我有一個Arduino兆豐Arduino是否支持線程?
[更新] 最後四年後,我可以在我的arduino巨型安裝FreeRTOS。這裏是link
我有一些與arduino有關的任務,但其中一個需要很長時間,所以我想用線程同時運行它們。 我有一個Arduino兆豐Arduino是否支持線程?
[更新] 最後四年後,我可以在我的arduino巨型安裝FreeRTOS。這裏是link
總之:沒有。 但你可以給它在鏡頭: http://www.kwartzlab.ca/2010/09/arduino-multi-threading-librar/
以前的答案是正確的,但是,Arduino的一般運行相當快,所以如果你掌握好火候你的代碼,它可以或多或少地同時完成的任務。
最好的做法是讓自己的功能,避免把太多的實際代碼在默認無效循環
還沒有,但我一直使用這個庫,具有大項目: https://github.com/ivanseidel/ArduinoThread
我的地方Timer中斷內的回調,以及voilá!你對Arduino的運行僞線程...
不是真正的線程,但TimedActions是一個很好的選擇,對於許多應用
http://playground.arduino.cc/Code/TimedAction#Example
當然,如果一個任務塊時,其他人也,而線程可以讓一個任務,凍結和其他人將繼續...
只是爲了讓這個主題更加完整:也有protothreads(如果我沒記錯的情侶字節),它具有非常小的內存佔用,並保留變量本地線程;非常方便和節省時間(更少的有限狀態機 - >更易讀的代碼)。
例子和代碼: arduino-class/ProtoThreads wiki
只是爲了讓你知道什麼樣的結果,你可能會想到:串行通信@ 153K6波特率與線程:狀態二極管閃爍,計時,請求的功能評價,IO處理和邏輯全部在atmega328上。
您可以使用arduinos
它是專爲Arduino的環境。特點:
我使用它時,我需要在執行舊的命令時從藍牙/網絡/串行接收新的命令,而舊命令會延遲它們。 一個線程的服務器線程執行以下循環:
while (1) {
while ((n = Serial.read()) != -1) {
// do something with n, like filling a buffer
if (command_was_received) {
arduinos_create(command_func, arg);
}
}
arduinos_yield(); // context switch to other threads
}
另一種是命令線程來執行命令:
int command_func(void* arg) {
// move some servos
arduinos_delay(1000); // wait for them to move
// move some more servos
}
不,你不能,但你可以使用定時器中斷。
我不能同意這一點:「最好的做法是製作你自己的函數,並避免在默認的void循環中放入太多真實的代碼」 - 代碼是在循環中還是在你的代碼中並不重要自己的函數,如果它從循環中調用*,它幾乎與時序相同(加上一個微小的函數調用開銷) –
@MartinThompson我不認爲他是在寫計時器。我認爲他是指功能性組織,事實上,稍後重新安排代碼(例如,稍後將TimedAction或ArduinoThread添加到相同的代碼中)會更實用。 – FrancescoMM
@FrancescoMM:謝謝 - 我沒有這樣讀過,但現在你提到它,這可能就是OP的意思!我想通過我提到第一句「時機」。 –