Fråga:
Kod för engångskörning i Arduino
apnorton
2014-02-13 08:56:19 UTC
view on stackexchange narkive permalink

Fråga: Var lägger jag in kod om jag bara vill att den ska köras en gång per Arduino-start?

Bakgrund: Jag brukar använda min Arduino för att utföra uppgifter som ska utföras en gång per kraftcykel. (Till exempel ska min robot bara köra framåt en gång varje gång jag slår på den - mer än så, och den kan falla av bordet.)

Standard Arduino IDE "mall" består av en loop () och en setup () -funktion. -inställning -koden körs en gång per effektcykel och -slingan startas om varje gång den är klar.

Jag ser två sätt att koda " 1 tidsuppgifter: "

Metod 1:" Loop once "

  void setup () {// do setup stuff} void loop () {// do task while (1); // Upprepa för alltid, förhindra att funktionen startar om}  

Metod 2: "Endast inställning"

  ogiltig inställning () {// gör inställningar // gör uppgift} ogiltig slinga () {// gör ingenting}  

Mer detaljerad form av fråga: Är en av dessa metoder "bättre" från en hårdvara / programvarukänsla? (t.ex. finns det något "speciellt" med funktionen setup , som att den bara kan köras så mycket tid?)
Och om de är desamma ur ett hårdvaru- / mjukvaruperspektiv, finns det en "bästa praxis" eller ett vanligt sätt att skriva kod för dessa situationer i Arduino-samhället?

Viss användning av kommandot 'exit' diskuteras i http://arduino.stackexchange.com/questions/188/what-happens-when-i-call-exit-from-my-program
Sex svar:
#1
+13
Connor Wolf
2014-02-13 18:43:07 UTC
view on stackexchange narkive permalink

Jag är förvirrad av din fråga. Du frågar var du vill lägga en gång per start-installationsfunktioner och diskuterar sedan installationsfunktionen. Det är vad installationsfunktionen är för.

Som sådan ingår engångsinställningsfunktionaliteten i installationsfunktionen.

FWIW, om du tittar i fil som ringer inställning och loop funktionerna:

  #include <Arduino.h>int main (void) { init (); # om definierad (USBCON) USBDevice.attach (); # endif setup (); för (;;) {loop (); if (serialEventRun) serialEventRun (); } return 0;}  

För alla ändamål är de två alternativen helt identiska. Hur som helst får du en tom upptagen-vänta slinga. Uppriktigt sagt skulle jag förvänta mig att de två olika alternativen antagligen kommer att avge samma maskinkod ändå, så det hela är ett problem.

Obs:
om (serialEventRun) serialEventRun ( ); verkar vara en möjlighet att låta dig bifoga en funktion som kallas vid mottagning av seriell data, men om du inte definierar en funktion ogiltig serialEvent () {} i din kod kommer den att sammanställas fullständigt och inte finnas i den producerade maskinkoden.

Det känns konstigt att acceptera ett svar som (ännu) inte är det högst röstade. Men att se definitionen av `main ()` -funktionen var till stor hjälp för min fråga. (Och du anger ett samförstånd med gruppen genom att använda "setup" istället för "loop"). Tack för din hjälp.
@anorton - När du är osäker, titta under täcket. Jag tycker att arduino-plattformen är bekväm för prototyper, men det är till stor del bara pannkodskod. Att förstå vad det gör kan vara oerhört hjälpsamt för att bestämma hur man arkitekterar något.
#2
+6
Steven10172
2014-02-13 10:40:08 UTC
view on stackexchange narkive permalink

Jag brukar gå med metod 2, men slutar göra det här:

  ogiltig inställning () {// göra inställnings saker // göra uppgift init (); // Gör startsteg för initialisering} ogiltig init () {// göra uppgifter vid start} ogiltig slinga () {// göra looping-kod}  

Med ovanstående inställning tillåter det min koden för att vara ännu mer organiserad.

det bästa svaret hittills +1, tack kille du räddade mig!
#3
+5
Matthew G.
2014-02-13 09:41:08 UTC
view on stackexchange narkive permalink

Jag föredrar starkt Metod 2. Om du någonsin planerar att lägga till kod för att hantera inmatning, utdata etc är det enkelt med metod 2 - fyll bara i loop () , men kräver omarbetning / refactoring i metod 1.

#4
+3
TheDoctor
2014-02-13 10:01:09 UTC
view on stackexchange narkive permalink

Det finns ingen tidsgräns för installationsfunktionen. Jag föredrar metod 2 eftersom slingan kan fyllas med vad du behöver senare.

#5
+1
sachleen
2014-02-13 10:23:37 UTC
view on stackexchange narkive permalink

Definitivt gå med metod två. Det är vad installationsfunktionen finns för. Det är mycket lättare att läsa också. Allt i -slingan () innebär att den kommer att köras i en slinga.

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

Som de flesta andra svar skulle jag gå efter metod 2.

Men jag skulle försöka undvika samtalet från Arduino-biblioteket till en tom -slinga () som gör att Atmel förbrukar "mycket" ström för ingenting.

Redigera:

Som vissa kommentarer dock påpekade använder vi delay () i loop () ändrar ingenting till strömförbrukning.

Därför, om du vill minska energiförbrukningen när din -inställning () har körts, kommer du att ha att spela med Atmel-vilolägen. Du kan ta en titt på den här artikeln som visar hur du hanterar vilolägen från dina Arduino-skisser; det gör mer än bara att sätta Atmel i vila men det är en bra (och enkel) läsning om du vill leka med vilolägen.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...