gibt es eine Möglichkeit in einer loop() welche bewusst mittels while(1){...} auf keinen Fall verlassen wird den Stackpointer sinnvoll um ein paar Bytes nach oben zu setzen um für memaloc noch ein paar Bytes freizuschaufeln?
Mit Serial.Print(SP); habe ich mir die Adresse anzeigen lassen und die liegt direkt am Anfang in der loop() bei 2778.
Höchst Möglicher Wert ist ja 2816 (256Byte I/O+2560Byte SRAM).
Aber bei einer Korrektur auf z. B. 2782 fehlen dann doch wieder ein paar Bytes für eine Funktion welche memaloc aufruft.
Wird im Stack ganz oben noch was anderes als Rücksprungadressen und gepushte Register gespeichert was bei Änderung des SP dann memaloc beeinflusst oder wie könnte man da vor gehen?
Hallo,
so eine Software könnte man auch als "Klingonen-Software" bezeichnen.
Aussage klingonischer Softwareentwickler: -- "Jeder Nutzer wird Furcht und Achtung vor dieser Software haben. Laßt die Software los! Laßt sie los, auf daß die Nutzer wie die Hunde fliehen, die sie sind." --
Viele Grüße Manfred
Der Sketch verwendet 480 Bytes (1%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 2.039 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Arduino leerer Rumpf.
Der Sketch verwendet 134 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, 2.048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Verzicht auf Loop und Setup
2 Byte ist übrigens nicht richtig...
Da fehlen dir noch eine ganze menge Push in der Rechnung.
Auf setup() kann ich nicht verzichten da sonst die Anbindung an GLEdiator nicht mehr geht wegen fehlendem Serial-Support (32u4, USB-Serial).
Auf loop() könnte ich verzichten aber das ist dann auch wegen setup() wieder egal.
OK, da es tatsächlich nur die letzten 2 Bytes sind die man den Stack nach oben setzen könnte wenn die loop() nie verlassen wird habe ich das jetzt anders gelöst.
Es geht um die Neopixel-Library, updateLenght.
Da ich von einem "Setup-Modus" diese Funktion aufrufte und diese dann malloc wo dann wieder was auf den Stack kam war unter Umständen nicht mehr genügend frei.
Habe die paar Zeilen von updateLenght in die aufrufende Funktion kopiert und angepasst und nun klappt es.
Die meisten privaten Variablen habe ich sowieso schon auf public gesetzt und kann dadurch über die Neopixel-Klasse darauf zugreifen und ändern.
Muss halt noch beobachten ob sich was dadurch beeinflusst.
Haribo68:
Es geht um die Neopixel-Library, updateLenght.
Da ich von einem "Setup-Modus" diese Funktion aufrufte und diese dann malloc wo dann wieder was auf den Stack kam war unter Umständen nicht mehr genügend frei.
Habe die paar Zeilen von updateLenght in die aufrufende Funktion kopiert und angepasst und nun klappt es.
Ich kann mir nicht vorstellen updateLength benutzen zu wollen.
Ich weiss vorher wie lang meine LED Kette ist, das ändert sich nicht.
Na ja, ich sehe schon einen Unterschied zwischen mir der das ganze programmiert - zumindest versuch ichs^^ - oder einem der kein Arduino-IDE hat sich das hinnagelt und dann mittels FB die Anzahl der LEDs und was weis ich noch einstellt.
Was du da gezeigt hast, könnte durchaus die Initialisierung lokaler Variablen sein,
oder das Retten der Registerinhalte, die jetzt die neuen Variablen darstellen,
die würde ich nicht zum loop-Funktions-Overhead zählen.
Mein Beispiel ist durchaus nicht-trivial, benutzt halt nur keine lokalen Variablen.
Wenn die benutzt werden kommt ein kleiner Stack-Frame zu den eigentlichen Variablen hinzu,
mit einem einfachen ret ist es dann nicht mehr getan.
Einen direkten Zusammenhang zwischen Variablentypen (byte/int/long) habe ich nicht sehen können.
Ist aber auch völlig egal, wenn die paar Byte bei einem malloc fehlen,
ist der Rechner zu klein, oder man hat etwas falsch gemacht.