Can some one please explain why is there a While(True); at the end of this program?

code:

/*

  Arduino Programs Blink

  This sketch demonstrates the Keyboard library.

  For Leonardo and Due boards only.

  When you connect pin 2 to ground, it creates a new window with a key

  combination (CTRL-N), then types in the Blink sketch, then auto-formats the

  text using another key combination (CTRL-T), then uploads the sketch to the

  currently selected Arduino using a final key combination (CTRL-U).

  Circuit:

  - Arduino Leonardo, Micro, Due, LilyPad USB, or Yún

  - wire to connect D2 to ground

  created 5 Mar 2012

  modified 29 Mar 2012

  by Tom Igoe

  modified 3 May 2014

  by Scott Fitzgerald

  This example is in the public domain.

  http://www.arduino.cc/en/Tutorial/KeyboardReprogram

*/

#include "Keyboard.h"

// use this option for OSX.
// Comment it out if using Windows or Linux:
char ctrlKey = KEY_LEFT_GUI;
// use this option for Windows and Linux.
// leave commented out if using OSX:
//  char ctrlKey = KEY_LEFT_CTRL;

void setup() {

  // make pin 2 an input and turn on the pull-up resistor so it goes high unless

  // connected to ground:

  pinMode(2, INPUT_PULLUP);

  // initialize control over the keyboard:

  Keyboard.begin();
}

void loop() {

  while (digitalRead(2) == HIGH) {

    // do nothing until pin 2 goes low

    delay(500);

  }

  delay(1000);

  // new document:

  Keyboard.press(ctrlKey);

  Keyboard.press('n');

  delay(100);

  Keyboard.releaseAll();

  // wait for new window to open:

  delay(1000);

  // versions of the Arduino IDE after 1.5 pre-populate new sketches with

  // setup() and loop() functions let's clear the window before typing anything new

  // select all

  Keyboard.press(ctrlKey);

  Keyboard.press('a');

  delay(500);

  Keyboard.releaseAll();

  // delete the selected text

  Keyboard.write(KEY_BACKSPACE);

  delay(500);

  // Type out "blink":

  Keyboard.println("void setup() {");

  Keyboard.println("pinMode(13, OUTPUT);");

  Keyboard.println("}");

  Keyboard.println();

  Keyboard.println("void loop() {");

  Keyboard.println("digitalWrite(13, HIGH);");

  Keyboard.print("delay(3000);");

  // 3000 ms is too long. Delete it:

  for (int keystrokes = 0; keystrokes < 6; keystrokes++) {

    delay(500);

    Keyboard.write(KEY_BACKSPACE);

  }

  // make it 1000 instead:

  Keyboard.println("1000);");

  Keyboard.println("digitalWrite(13, LOW);");

  Keyboard.println("delay(1000);");

  Keyboard.println("}");

  // tidy up:

  Keyboard.press(ctrlKey);

  Keyboard.press('t');

  delay(100);

  Keyboard.releaseAll();

  delay(3000);

  // upload code:

  Keyboard.press(ctrlKey);

  Keyboard.press('u');

  delay(100);

  Keyboard.releaseAll();

  // wait for the sweet oblivion of reprogramming:

  while (true);
}





ORIGINAL CODE LINK:

https://www.arduino.cc/en/Tutorial/BuiltInExamples/KeyboardReprogram

Doesn't this explain it? They just want the code to run once, not keep repeating. This could also be accomplished by putting all that code in setup() rather than loop()

Means, forever.
This means that the loop function will essentially run only once.

If this is what the programmer wanted, then all of the code should have simply been in setup().

The processor never "stops" (in normal operation).

And if you follow the standard Arduino programming practices you have a main loop that runs over-and-over forever.

I'm not sure what happens when an Arduino program "ends" (if you don't make a an infinite main-loop) but the compiler probably adds some machine-language code to run NOP (no operation) in a loop until the processor is reset. That's effectively the same thing as while(true) and it might be exactly the same thing.

If your on a computer with an operating system the operating system determines what's done when a program ends (or is closed). Your PC is probably running LOTS of NOP instructions MOST of the time.

Most Windows programs also have a continuous loop that runs forever until the program is closed. It's usually looping and checking for a mouse click or keypress if it's not doing anything else.

YOU don't make the main() function. That is part of the Arduino structure that is provided. It simply calls loop() forever. There is no end.

I'm still trying to figure out what happens if you use exit() in a sketch.

1 Like

Apparently, that does terminate main() since this

void setup()
{
  Serial.begin(9600);
  Serial.println("Ready");
}

void loop()
{
  Serial.println("Loop");
  delay(3000);
  exit(1);
}

Produces this output (only 1 time through loop)

Ready
Loop

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.