[erledigt] Zwei Fragen zur avr-libc

Hallo allerseits!

Bis vorhin war ich mir noch sicher, dass die avr-libc kein new() und delete() kennt. Was in meinen Augen der Grund schlechthin dafür war, dass es für Arduino die STL nicht gibt.

Nunja ... new() und delete() scheint es aber zu geben, nur halt nicht in der Doku. Und jetzt frage ich mich:

  • Wo kann ich mich über Neuigkeiten zur avr-libc informieren? Gibt es eine Seite, auf der Änderungen/Erweiterungen bekannt gemacht werden? Das wäre eine Seite, die ich zumindest ab und zu mal überfliegen würde.
  • Wieso gibt es die STL nicht auch für Arduino? Oder gibt es sie, nur nicht in der Doku?

Danke vorweg!

Gregor

https://www.nongnu.org/avr-libc/

Zur STL: Es hat Hunger. Man bekommt die dynamische Speicherverwaltung nicht genügend unter Kontrolle. Das führt dann evtl. zu plötzlichem Versagen, nach tagelanger Laufzeit, wegen fragmentiertem Heap. Solche Fehler findet man nicht/kaum, und kann man nicht/kaum beheben. Auf AVR mit 2K Ram macht das alles keinen Sinn.

Auch sind die Exceptions u.U. sehr Ressourcen fressend und mit dem obrigen Problem behaftet. Darum sind sie für AVRs deaktiviert (kannst du in der boards.txt aktivieren)

new und delete werden von der Arduino Software selbst implementiert. Siehe new.h/new.cpp:

void *operator new(size_t size) {
  return malloc(size);
}

void *operator new[](size_t size) {
  return malloc(size);
}

void operator delete(void * ptr) {
  free(ptr);
}

void operator delete[](void * ptr) {
  free(ptr);
}

Bei der STL kommen es auch auf die Container an. Einfache Container wie ein Vektor oder eine Liste sind auch auf kleinen Arduinos u.U. ok. Aber für kompliziertere Container wie Maps braucht man mehr als 2kB

Vielen Dank Euch beiden!

Ich dachte, dass die avr-libc maßgeblich für das ist, was man programmieren kann. Da scheint es aber noch allerlei anderen Kram zu geben.

Nunja … ich stehe darauf, mein Hirn zu benutzen. Zumindest derzeit scheint es noch lernfähig zu sein :slight_smile:

Gruß

Gregor