Verschiedene Controller, verschiedene Größen

Hallo,

ich habe mir ein Programm ohne es zu ändern bis auf die Portnummern vom Arduino Nano zum Arduino Leonardo bzw. Leonardo micro geändert. Das Programm läuft wie bisher auch, allerdings ist das slebige beim Leonardo ca. 3,5K größer als beim Nano. Auch die Variablen werden ziemlich aufgebläht so dass ca. 140 mehr RRAM genutzt wird. Kann man selber bestimmen was beim kompillieren alles mit einbezogen wird?

Vielen Dank schon mal

Nein. Beim Leonardo / Micro wird die USB-Verwaltung in den Code eingebaut, weil die USB-Verbindung im ATmega32U4 gemacht wird und nicht in einem getrennten IC. Grüße Uwe

Ja. bei einem "optimierenden Compiler" läuft es so:

Eingebaut wird das, was verwendet wird.

Wenn Du millis() und micros() und andere Funktionen verwendest, dann wird deren Code im fertigen Programm enthalten sein. Sonst nicht.

Und wenn Du "Serial" verwendest, dann wird der Code für Hardware-Serial mit ins Programm eingebaut.

Und hier gibt es einen Unterschied zwischen solchen Boards, die einen USB-Serial-Chip auf dem Board haben und den Boards wie Leonardo und Micro, die das nicht haben: Bei den Boards Leonardo und Micro wird bei Verwendung von Serial stattdessen ein spezieller USB-Serial Treiber eingebunden, denn die haben ein ganz anderes Handling für Serial.

jurs: Eingebaut wird das, was verwendet wird.

Und wenn Du "Serial" verwendest, dann wird der Code für Hardware-Serial mit ins Programm eingebaut.

Wenn ich einen neuen Sketch mache ohne einer einzigen Programmzeile, also nur void setup(){} und void loop(){} wird beim Leonardo sehr viel mehr reingehauen.

Arduino Nano: Der Sketch verwendet 444 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes. Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Arduino Leonardo (micro): Der Sketch verwendet 3624 Bytes (12%) des Programmspeicherplatzes. Das Maximum sind 28672 Bytes. Globale Variablen verwenden 148 Bytes (5%) des dynamischen Speichers, 2412 Bytes für lokale Variablen verbleiben. Das Maximum sind 2560 Bytes.

Was hat der Leonardo micro von Pololu mehr, der ja sogar kleiner ist, als der Nano? Was steckt in den fast 3,2KB? Brauch ich das? Kann ich den ohne diesem nicht mehr flashen? Der Bootloader ist ja auch schon doppelt so groß. Habe mich für den Leonardo wegen mehr RAM entschieden und jetzt wird mir inkl. Bootloader fast 8KB vom Flash weggenommen :-(

Haribo68: Was steckt in den fast 3,2KB? Brauch ich das?

Darin steckt das ganze USB-Handling Gedöns des Controllers.

Hast Du mal probiert, ein nacktes Programm mit main() Funktion anstelle von setup() und loop() hochzuladen.

Also beispielsweise das hier:

int main()
{
    while (1)
    {

    }
}

Dann sollte das USB-Treibergeraffel vom 32U4 außer Gefecht gesetzt sein. Und die "normale" Uploadmöglichkeit über das USB-Kabel womöglich gleich mit dazu, und Du müßtesdann mit einer Wiederbelebungsaktion, etwa Upload mit manuellem Reset, oder Srduino as ISP erstmal wieder einen "normalen Sketch mit USB-Treibergeraffel draufbekommen, bevor die normale Uploadfunktionalität wieder funktioniert.

Was ist da der Unterschied zwischden Nano und Leonardo/Micro?

OK, da ist dann keiner mehr. Aber wie bringe ich dann die Arduino-IDE dazu main() zu starten? Muss ich dann die initialisierungen der Libraries selbst durchführen? Weil mit main() statt setup() und loop() entsteht etwas weniger Code. Habe mit Arduino erst vor 4 Wochen angefangen und kenne noch nicht alle Details.

Aber wie bringe ich dann die Arduino-IDE dazu main() zu starten?

Es gibt immer eine Main. Entweder deine eigene, oder die der Arduinoumgebung. Sie wird nicht von der IDE gestartet. Sondern vom Prozessor selber.

Muss ich dann die initialisierungen der Libraries selbst durchführen?

Dann bist du für ALLES selber verantwortlich.

Habe es gerade mit dem Nano getestet und hochgeladen und es funtzt. Im groben sieht das so aus:

int main() { init(); //zur initialisierung der Librarys und Ports etc. ... andere Initialisierungen ... Start: ... Programmablauf ... goto Start; }

Das ganze kompilliert für den Leonardo ist dann fast die selbe Flashgröße und vorallem die selbe RAM-Größe wie für den Nano. Für den Leonardo micro lade ich das morgen mal hoch. Bin gespannt, ob der sich danach wieder flashen läßt. Eigentlich müsste ja im Bootloader USB-Support mit drin sein.

Habt mir sehr geholfen, Danke euch.

Grüße Andi

jurs: Darin steckt das ganze USB-Handling Gedöns des Controllers.

Hast Du mal probiert, ein nacktes Programm mit main() Funktion anstelle von setup() und loop() hochzuladen.

Also beispielsweise das hier:

int main()
{
    while (1)
    {

    } }



Dann sollte das USB-Treibergeraffel vom 32U4 außer Gefecht gesetzt sein.
Und die "normale" Uploadmöglichkeit über das USB-Kabel womöglich gleich mit dazu, und Du müßtesdann mit einer Wiederbelebungsaktion, etwa Upload mit manuellem Reset, oder Srduino as ISP erstmal wieder einen "normalen Sketch mit USB-Treibergeraffel draufbekommen, bevor die normale Uploadfunktionalität wieder funktioniert.

Funktioniert da der Bootloader überhaupt noch? oder blockiert man da den Arduino für zukünftige Upload über USB. Grüße Uwe

uwefed:
Funktioniert da der Bootloader überhaupt noch? oder blockiert man da den Arduino für zukünftige Upload über USB.
Grüße Uwe

Der Bootloader funktioniert immer, der wird ja nicht überschrieben.

Konnte es natürlich nicht erwarten und habe es gerade probiert.
Wenn man die Main-Prozedur selber macht fehlen anscheinend die ISRs um über einen Softreset vom Arduino-IDE in den Bootloader zu kommen.
Habe einen Taster an Reset und GND gehängt. Wenn man Hochlädt und die IDE zeigt nach dem kompilieren an das hoch geladen wird drückt man den Taster bis die LED auf dem Board blinkt dann klappt das.
Zuvor sollte man vorher im Menü ermitteln auf welchem COM-Port der Leonardo verbunden ist und das schnell auswählen.
Es ist zwar etwas unkomfortabler aber 3500Byte kleinerer Programmcode und ca. 120Bytes weniger RAM-Bedarf ist es mir Wert.

Grüße
Andi