題:
Arduino中一次性執行的代碼
apnorton
2014-02-13 08:56:19 UTC
view on stackexchange narkive permalink

問題::如果我希望每次Arduino啟動僅執行一次代碼,該在哪裡放置代碼?

背景:我傾向於使用我的代碼Arduino執行應在每個加電週期執行一次的任務。 (例如,我的機器人每次打開時都只應向前驅動一次 ,否則,它可能會從桌子上掉下來。)

標準Arduino IDE “模板”由 loop() setup()函數組成。 setup 代碼每個電源循環運行一次,並且 loop 每次完成循環都會重新啟動。

我看到兩種編碼方法“ 1次任務:“

方法1:“循環一次”

  void setup(){//執行安裝程序} void loop(){//執行任務(1); //永遠重複,以防止函數重新啟動}  

方法2:“僅設置”

  void setup(){//執行設置//執行任務} void循環(){//不執行任何操作 

更詳細的問題形式:這些方法是從硬件中“更好”的一種嗎? /軟件意義? (例如,關於 setup 函數的任何“特殊”之處,例如它只能運行這麼長的時間?)
並且,如果從硬件/軟件角度來看它們相同,是否存在? Arduino社區中針對這些情況的“最佳實踐”或標準代碼編寫方式?

在http://arduino.stackexchange.com/questions/188/what-happens-when-i-call-exit-from-my-program中討論了`exit'命令的某些用法。
六 答案:
Connor Wolf
2014-02-13 18:43:07 UTC
view on stackexchange narkive permalink

您的問題讓我有些困惑。您詢問要在哪裡放置“每次啟動一次”設置功能,然後討論設置功能。 這就是設置功能的目的。

因此,一次性設置功能將包含在設置功能中。

FWIW,如果您查看調用 setup loop 函數的文件:

  #include <Arduino.h>int main(void){ init();#if define(USBCON)USBDevice.attach();#endif setup();對於(;;){loop();如果(serialEventRun)serialEventRun(); } return 0;}  

對於所有意圖和目的,這兩個選項是完全相同的。不管哪種方式,您都會得到一個空的繁忙等待循環。坦白地說,我希望這兩個不同的選項無論如何都可能發出相同的機器代碼,所以整個事情都是沒有問題的。

注意:
if(serialEventRun)serialEventRun( ); 似乎是一種允許您附加在接收到串行數據時調用的函數的功能,但是如果您未在您的函數中定義 void serialEvent(){} 代碼,它將完全編譯出來,不會出現在生成的機器代碼中。

接受尚未(最高)投票的答案感到很奇怪。但是,看到`main()`函數定義確實對我的問題很有幫助。 (並且,您確實使用`setup`而不是`loop`表示與小組的共識)。謝謝您的幫助。
@anorton-如有疑問,請看底下。我發現arduino平台可方便地進行原型製作,但很大程度上只是樣板代碼。了解它的工作方式對決定如何設計某些東西很有幫助。
Steven10172
2014-02-13 10:40:08 UTC
view on stackexchange narkive permalink

我通常會使用方法2,但最終會這樣做:

  void setup(){//執行安裝程序//執行任務init(); //執行啟動初始化步驟} void init(){//執行啟動任務} void loop(){//執行循環代碼}  

使用上述設置,代碼更加井井有條。

迄今為止最好的答案+1,謝謝您,我救了我!
Matthew G.
2014-02-13 09:41:08 UTC
view on stackexchange narkive permalink

我強烈希望使用方法2。如果您打算添加代碼來處理輸入,輸出等,那麼使用方法2則很容易-只需填寫 loop(),但需要重新製作/方法1中重構。

TheDoctor
2014-02-13 10:01:09 UTC
view on stackexchange narkive permalink

設置功能沒有時間限制。我更喜歡方法2,因為循環可以用以後需要的內容填充。

sachleen
2014-02-13 10:23:37 UTC
view on stackexchange narkive permalink

絕對可以使用方法二。這就是設置功能的目的。它也更容易閱讀。 loop()中的任何內容都意味著它將循環運行。

jfpoilpret
2014-02-13 12:24:45 UTC
view on stackexchange narkive permalink

與其他大多數答案一樣,我會使用方法2。

但是我會盡量避免通過Arduino庫調用空的 loop()

編輯:

不過,正如一些評論指出的那樣,在中使用 delay() > loop()不會改變功耗。

因此,如果您想在 setup()運行後降低功耗,則可以可以查看本文,該文章顯示瞭如何處理Arduino草圖中的睡眠模式。它不僅可以讓Atmel進入睡眠狀態,而且如果您想使用睡眠模式,那是一本好書(簡單)。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...