2012-12-22 56 views
15

我有一些與arduino有關的任務,但其中一個需要很長時間,所以我想用線程同時運行它們。 我有一個Arduino兆豐Arduino是否支持線程?

[更新] 最後四年後,我可以在我的arduino巨型安裝FreeRTOS。這裏是link

回答

0

以前的答案是正確的,但是,Arduino的一般運行相當快,所以如果你掌握好火候你的代碼,它可以或多或少地同時完成的任務。

最好的做法是讓自己的功能,避免把太多的實際代碼在默認無效循環

+7

我不能同意這一點:「最好的做法是製作你自己的函數,並避免在默認的void循環中放入太多真實的代碼」 - 代碼是在循環中還是在你的代碼中並不重要自己的函數,如果它從循環中調用*,它幾乎與時序相同(加上一個微小的函數調用開銷) –

+2

@MartinThompson我不認爲他是在寫計時器。我認爲他是指功能性組織,事實上,稍後重新安排代碼(例如,稍後將TimedAction或ArduinoThread添加到相同的代碼中)會更實用。 – FrancescoMM

+1

@FrancescoMM:謝謝 - 我沒有這樣讀過,但現在你提到它,這可能就是OP的意思!我想通過我提到第一句「時機」。 –

4

只是爲了讓這個主題更加完整:也有protothreads(如果我沒記錯的情侶字節),它具有非常小的內存佔用,並保留變量本地線程;非常方便和節省時間(更少的有限狀態機 - >更易讀的代碼)。

例子和代碼: arduino-class/ProtoThreads wiki

只是爲了讓你知道什麼樣的結果,你可能會想到:串行通信@ 153K6波特率與線程:狀態二極管閃爍,計時,請求的功能評價,IO處理和邏輯全部在atm​​ega328上。

0

您可以使用arduinos

它是專爲Arduino的環境。特點:

  • 只有靜態分配(沒有的malloc /新)推遲執行
  • 支持上下文切換實現信號燈
  • 重量輕,CPU和內存

我使用它時,我需要在執行舊的命令時從藍牙/網絡/串行接收新的命令,而舊命令會延遲它們。 一個線程的服務器線程執行以下循環:

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 
} 
0

不,你不能,但你可以使用定時器中斷。