Hallo,
ich arbeite an einer USB Kommunikation für einen AT90USB162 mit dem LUFA
USB Stack. Nachdem ich den Datenempfang überarbeitet habe, ist das
Programm nach der USB Initialisierung immer wieder zum Start zurück
gesprungen, anstatt zur naechsten Zeile nach dem Initialisierungsaufruf.
Woran kann das liegen?
mfg
Bernhart
das die Returnadresse am Stack überschrieben wird habe ich mir auch
schon gedacht, das seltsame ist ja nur, dass der veraenderte code nichts
mit der initialisierung zu tun hat.
der watchdog in der main-Routine vor dem Aufruf der USB initialisierung
deaktiviert.
ich habe dafür eigentlich keine isr geschrieben, aber im lufa stack
könnte da etwas enthalten sein. wie kann ich den tatsaechlichen fehler
denn finden?
82,3% des SRAM sind verbraucht.
Wie groß ist denn der Stack der die Rückkehradressen speichert? Ich
liege doch richtig, dass das ein FILA Speicher ist? Also wie ein Stapel
Teller. Ein Stack halt. Dabei würde die 9 Rückkehradresse bei 8
Speicherplaetzen verworfen werden.
Seltsamerweise kehrt das Programm bis zur ersten Aufgerufenen Subroutine
zurück. Dann faengt der µC von vorne an anstatt zur letzten
Absprungadresse zu gehen.
Mir ist gerade die Idee gekommen im Hauptprogramm ein Label MAIN
einzufügen und dann aus der Subroutine am Ende der Subroutine ein goto
MAIN einzufügen, aber das wird vom Compiler wegopimiert.
ich hab keine ahnung warum, aber jetzt springt das programm richtig.
kanns sein, dass der compiler durch die optimierung durcheinanderkommt
wo der die variablen ablegt?
> in wie fern soll das den Fehler beheben?
Du hast (bzw. hattest) höchstwahrscheinlich (jetzt praktisch bestätigt)
einen Pufferüberlauf, im Speziellen eine Begegnung der dritten Art von
Heap und Stack. Dadurch wird (wurde) vermutlich der "letzte" Stackframe
beschädigt mit dem Ergebnis dass das return ins Nirvana springt.
80% belegter RAM sind definitiv zu viel, da hieße es höllisch aufpassen,
was vor sich geht - und jedes Byte einzeln zählen. Deswegen vermeidet
man das einfach B-)
Ergo: Schaufel mehr RAM frei, sonst gibts bald wieder einen Zusammenstoß
- und der ist dann möglicherweise nicht so einfach zu finden.
Bernhart schrieb:> kanns sein, dass der compiler durch die optimierung durcheinanderkommt> wo der die variablen ablegt?
Sorry, aber 99% aller postulierten Compilerfehler sitzen vor dem
Bildschirm. Ja, es gibt sie und hier im Forum wurden auch schon welche
gefunden. Aber ohne konkrete Anhaltspunkte den Compiler beschuldigen
weil man selber nicht durchblickt, das ist nicht angebracht.
A. K. schrieb:> Sorry, aber 99% aller postulierten Compilerfehler sitzen vor dem> Bildschirm. Ja, es gibt sie und hier im Forum wurden auch schon welche> gefunden. Aber ohne konkrete Anhaltspunkte den Compiler beschuldigen> weil man selber nicht durchblickt, das ist nicht angebracht.
Tut mir leid, aber als C Programmierer der neu auf AVR ist darf ich wohl
einen Fehler im Compiler annehmen. Da ist einem nicht von Anfang an klar
das bei 80 % RAM Auslastung Fehler auftreten können.
Jedenfalls würde ich gerne wissen, wie ich den verfügbaren RAM ganz
nutzen kann, bzw. mehr davon?
Bernhart schrieb:> Tut mir leid, aber als C Programmierer der neu auf AVR ist darf ich wohl> einen Fehler im Compiler annehmen.
Gerade dann ist es besonders unwahrscheinlich, daß der Fehler beim
Compiler zu suchen ist.
> Da ist einem nicht von Anfang an klar das bei 80 % RAM Auslastung Fehler> auftreten können.>> Jedenfalls würde ich gerne wissen, wie ich den verfügbaren RAM ganz> nutzen kann, bzw. mehr davon?
Du hast offensichtlich das Problem noch gar nicht verstanden.
Dein Programm verhält sich so komisch, weil du bereits mehr nutzt, als
eigentlich vorhanden ist.
Bernhart schrieb:> 82,3% des SRAM sind verbraucht.>> Wie groß ist denn der Stack der die Rückkehradressen speichert?
So groß wie nötig. Der Stack fängt defaultmäßig am Ende des RAM an und
wächst dann nach unten, zur Not auch in den schon durch Variablen
belegten Teil des RAM. Der speichert übrigens nicht nur
Rücksprungadressen.
> Ich liege doch richtig, dass das ein FILA Speicher ist? Also wie ein> Stapel Teller. Ein Stack halt.
Ähm, ja, der Stack ist ein Stack ;-)
"FILA" kenne ich aber nur als Turnschuh-Marke. Den Stack kenne ich als
"LIFO" ("Last In, First Out).
> Dabei würde die 9 Rückkehradresse bei 8 Speicherplaetzen verworfen> werden.
Es wird nichts verworfen. Bei einem Funktionsaufruf wird die
Rücksprungadresse gespeichert, PUNKT.
Genauer: Die Adresse der nächsten Instruktion wird der Stelle im RAM
gespeichert, auf die der Stackpointer zeigt. Dann wird der Stackpointer
dekrementiert.
Bernhart schrieb:> Tut mir leid, aber als C Programmierer der neu auf AVR ist darf ich wohl> einen Fehler im Compiler annehmen.
Nein. Du darfst einen Fehler im Compiler annehmen, wenn du anhand
des generierten Assemblercodes nachgewiesen hast, dass es einer ist.
Bis du dazu in der Lage bist, gilt für den Compiler aus deiner Sicht
erst einmal durchweg die Unschuldsvermutung.
> Da ist einem nicht von Anfang an klar> das bei 80 % RAM Auslastung Fehler auftreten können.
Das mit den 80 % ist auch nur 'ne Hausnummer. Bei einem Controller
mit wenig RAM kann die Zahl noch darunter liegen, wenn du einen
ATmega1284 oder ATmega128RFA1 mit 16 KiB SRAM hast, kannst du
vermutlich problemlos weit über 90 % bereits statisch belegen, ohne
dass der Platz für den Stack zu knapp wird.
> Jedenfalls würde ich gerne wissen, wie ich den verfügbaren RAM ganz> nutzen kann, bzw. mehr davon?
Du hast bereits mehr benutzt, als du RAM hast. Neben dem statisch
belegten RAM benötigst du noch welchen für den Stack. Das Unangenehme
am Stack aber ist, dass der sich einfach den Platz nimmt, den er
braucht, der fragt nicht, ob an dieser Stelle schon eine Variable
liegt (weil er es einfach nicht weiß). Eine derartige Kollision lässt
sich nur auf größeren Maschinen erkennen, die eine Speicherverwaltung
in ihrer Hardware haben, aber derart kleine Controller haben das nicht.
Du musst also einfach mal analysieren, was bei dir übermäßig viel RAM
beansprucht, sowohl statisch (also bei den 83 %, die da angezeigt
werden) als auch auf dem Stack. Die erste Vermutung wäre mal, dass
du einen Haufen string literals benutzt, die aufgrund der Harvard-
Architektur (und der vom Standard geforderten Kompatibilität eines
solchen string literals mit dem Typ "char *" und den entsprechenden
Funktionen wir strcpy() etc.) im RAM landen. In jedem besseren AVR-
Tutorial wird dir erklärt, was man tun muss, um diese aus dem RAM
zu verbannen, sodass sie nur noch Flash-ROM benötigen (den sie jetzt
natürlich auch noch brauchen).
nein, ich verwende keinen einzigen String. ca 30 % des RAMs belegt der
LUFA USB Stack. Die 5 % sind für einen 8 Bit 16 Kanal LED Dimmer und die
restlichen 48 % waeren für automatisches Faden der LEDs in beliebiger
Geschwindigkeit unabhaengig von einander. Aber das bedarf sowiso noch
einiger Optimierungsarbeit. Der Fehler ist aufgetreten, als ich die
Funktion von 1 LED auf alle 16 umgeschrieben habe. Diese LED Show
befindet sich noch im Entwicklungsstadium und ist erst zu 70% fertig.
Als Controller verwende ich den AT90USB162 mit 512 Byte RAM.
Wie groß ist denn in der Regel der Stack? in welchem Speicherbereich des
RAMs befindet der sich für gewöhnlich?
Bernhart schrieb:> Wie groß ist denn in der Regel der Stack?
Bei AVR:
Der Rest, der nicht für statische Variablen
(globale + lokale static) genutzt wird - gemeinsam mit dem Heap.
Bei PCs: je nach OS.
Wieviel Stack dein Programm benötigt, hat damit erstmal
gar nichts zu tun.
Wenn es funktionieren soll, muß der benötigte Stack kleiner sein
als der vorhandene.
> in welchem Speicherbereich des> RAMs befindet der sich für gewöhnlich?
Oben im freien Rest.
Ich würde dir empfehlen den folgenden Artikel hier durchzulesen:
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc
zur Not auch zweimal. Du kannst dein Problem nicht lösen, solange du
nicht genau darüber bescheid weisst.
Ich habe bei einem Ähnlichen Problem mit einem Timer-Interrupt den
verfügbaren Speicher periodisch abgefragt und auf RS232 ausgegeben, dann
einfach mal rumgespielt, und geschaut wieviel Speicher noch frei ist.
Bernhart schrieb:> Wie groß ist denn in der Regel der Stack? in welchem Speicherbereich des> RAMs befindet der sich für gewöhnlich?
Die Mühe, dir das zu erklären, habe ich mir nicht gemacht, damit du es
nicht liest.
Wie groß ist denn Dein data-Bereich? Dort befindet sich das größte
Einsparpotenzial, üblicherweise in Form initialisierter Variablen, die
nie geändert werden, sondern konstant sind.
Bernhart schrieb:> Tut mir leid, aber als C Programmierer der neu auf AVR ist darf ich wohl> einen Fehler im Compiler annehmen.
Annehmen darfst Du alles; ausgeschlossen ist es ja nicht.
Veröffentlichen wird es nur ein C-Programmierer, der eher nicht nur bei
AVRs Anfänger ist. Das Netz ist voll von Compilerfehlern, bei denen die
Fehlerursache zwischen Tastatur und Rückenlehne zu finden war (zu ca.
99,9%). Nach einiger Zeit lokalisiert man die Fehlerquelle von selbst
dort und sieht das als normalen Teil des Debugging.
Hc Zimmerer schrieb:> Annehmen darfst Du alles; ausgeschlossen ist es ja nicht.> Veröffentlichen wird es nur ein C-Programmierer, der eher nicht nur bei> AVRs Anfänger ist. Das Netz ist voll von Compilerfehlern, bei denen die> Fehlerursache zwischen Tastatur und Rückenlehne zu finden war (zu ca.> 99,9%). Nach einiger Zeit lokalisiert man die Fehlerquelle von selbst> dort und sieht das als normalen Teil des Debugging.
Am Anfang habe ich auch einen Fehlervon mir vermutet, aber als ich den
Assamblercode gesehen habe, habe ich gewusst, dass der Fehler nicht
direkt dem Codestück kommt, bei dem er Auftritt. Bei der Programmierung
auf Betriebssystem Basis muss man sich über so etwas ja eher wenig
gedanken machen.
Aber dass 20 % des RAMs für den Stack und den HEAP drauf gehen finde ich
schon eher viel. Das Meiste wird vermutlich eh der Heap verbrauchen.
> Aber dass 20 % des RAMs für den Stack und den HEAP drauf gehen finde ich> schon eher viel.
Das sind ca. 100 Bytes.
> Das Meiste wird vermutlich eh der Heap verbrauchen.
Kannst du auf dynamischen Speicher nicht verzichten?
@ Rolf Magnus:
Danke für die Info, das 20% von 512 ca. 100 ist haette ich mir nicht
denken können.
Ich brauche für meinen Code gar keinen dynamischen Speicher. Ich
vermute, dass der LUFA USB Stack aber etwas brauchen könnte.
juchu, was täten wir nur ohne die ganzen Anfänger, die die vielen Bugs
in den Compilern finden!?! Nicht auszudenken, wenn die alle unentdeckt
blieben, weil nur Profis den Compiler benutzten...
delicious_cake schrieb:> Danke für die Info, das 20% von 512 ca. 100 ist haette ich mir nicht> denken können.
Wenn man aus der PC-Ecke kommt, wo der Speicher typischerweise mehrere
Millionen Mal so groß ist, denkt man evtl. in anderen Dimensionen. Ich
wollte nur sicher sein, daß dir bewußt ist, wie viel diese 20%
eigentlich sind.
> Ich brauche für meinen Code gar keinen dynamischen Speicher. Ich> vermute, dass der LUFA USB Stack aber etwas brauchen könnte.
Das sollte sich ja einfach rausfinden lassen. Für den Stack alleine
wären 20% schon sehr viel, außer wenn du sehr tiefe Aufrufhierarchien
oder viele lokale Variablen hast. Ungünstig implementierte ISRs können
auch viel Stack brauchen.
Hc Zimmerer schrieb:> Wie groß ist denn Dein data-Bereich?
der Databereich hat 43% Auslastung. Es sollen aber noch einige
funktionen dazu kommen. Kanns durch eine hohe Auslastung des Data
Bereichs auch zu Problemen kommen?
Rolf Magnus schrieb:> Das sollte sich ja einfach rausfinden lassen. Für den Stack alleine> wären 20% schon sehr viel, außer wenn du sehr tiefe Aufrufhierarchien> oder viele lokale Variablen hast. Ungünstig implementierte ISRs können> auch viel Stack brauchen.
Wenn ich mich richtig erinnere, sichert avr-gcc bei einem ISR Aufruf
sämtliche Register auf dem Stack, dazu noch das Statusregister.
Ausserdem liegt die Rücksprungadresse noch drauf, ich komme auf 35
Bytes.
Vlt. verwendest du auch nested interrupts, z.B. weil das Abholen eines
empfangenen Byte sehr zeitkritisch ist? Würde zwar nicht vermuten, dass
das beim Initialisieren der LUFA Bibliothek zuschlägt... Oder doch?
Verwendest du das avr-gcc/avr-libc Gespann?
> der Databereich hat 43% Auslastung. Es sollen aber noch einige> funktionen dazu kommen. Kanns durch eine hohe Auslastung des Data> Bereichs auch zu Problemen kommen?
Nö. Program Memory und RAM sind komplett getrennte Adressräume.
Wie andere schon erwähnt haben: Kannst du mehr RAM freischaufeln, indem
du strings in das flash memory verschiebst? Das avr-libc Manual enthält
ein Kapitel eigens über dieses Thema, RTFM. :)
Tom M. schrieb:> Wenn ich mich richtig erinnere, sichert avr-gcc bei einem ISR Aufruf> sämtliche Register auf dem Stack, dazu noch das Statusregister.
Nein, er sichert erst einmal nur die, die von der ISR zerstört
werden. Wenn allerdings in der ISR noch externe Funktionen gerufen
werden, sichert der Compiler alle die Register, die laut ABI von
den gerufenen Funktionen zerstört werden dürfen (und wenn diese
Funktionen noch weitere Register brauchen, die sie laut ABI nicht
zerstören dürfen, dann sichern sie diese Register selbst nochmal).
Tom M. schrieb:>> der Databereich hat 43% Auslastung. Es sollen aber noch einige>> funktionen dazu kommen. Kanns durch eine hohe Auslastung des Data>> Bereichs auch zu Problemen kommen?>> Nö. Program Memory und RAM sind komplett getrennte Adressräume.
Doch. Es geht um Data. Dieser Bereich wird beim Programmstart vom
Flash ins SRam kopiert, ist also ein Adressraum, der von keinem von
beidem getrennt ist.
An den TE: Hast Du denn initialisierte Variable, die sich nie ändern
(Beispiel wäre ein Array aus konstanten Werten)? 43% Data ist nicht
wenig, frisst viel SRam und legt den Verdacht nahe, dass es sich um
solche Konstanten handelt.
Falls ja, freunde Dich mal mit <avr/pgmspace.h> an.
Hc Zimmerer schrieb:> An den TE: Hast Du denn initialisierte Variable, die sich nie ändern> (Beispiel wäre ein Array aus konstanten Werten)? 43% Data ist nicht> wenig, frisst viel SRam und legt den Verdacht nahe, dass es sich um> solche Konstanten handelt.>> Falls ja, freunde Dich mal mit <avr/pgmspace.h> an.
alle Konstanten sind bei mir von Anfang an als defines implementiert.
Und der PWM Table zum LED Faden efindet sich ebenfalls von Anfang an im
Flash memory.
Wie ich die Größe des Data-Bereichs verringern kann, habe ich mir noch
nicht überlegt. Aber mir ist eingefallen, dass für jede einzelne Bool
Variable ein ganzes Byte verbraucht wird. Wenn ich die Bool Variablen zu
wirklichen Bools umschreibe die nur mehr true und false sein können,
spare ich bestimmt an die 100 Byte Sram ein.
Wie ich das umsetzen kann weiß ich bereits. Dann habe ich aber immer nur
8 Variablen pro Byte. Hat jemand vielleicht schon einen Vorschlag wie
ich das Umsetzen kann, dass eine beliebige Anzahl an Bools in einer
Variable steht die wie ein Array ansprechbar ist. Ich arbeite mit sehr
vielen solcher Arrays und die beliebige Definition der Größe waere sehr
angenehm. Ich habe an eine unitxx_t Variable gedacht, bei der man die
Größe selbst festlegen kann. Halt leider nur bis 64. Ich haette es aber
gerne bis 256.
delicious_cake schrieb:> Wie ich das umsetzen kann weiß ich bereits. Dann habe ich aber immer nur> 8 Variablen pro Byte.
Mehr wirst du auch nicht hinkriegen.
Dein ein Byte hat nun mal nicht mehr als 8 Bit.
> Hat jemand vielleicht schon einen Vorschlag wie> ich das Umsetzen kann, dass eine beliebige Anzahl an Bools in einer> Variable steht die wie ein Array ansprechbar ist.
Musst du dir selber schreiben.
So schwer ist das nicht.
Du hast 185 Mieter, die in einer Strasse wohnen und jeder Mieter hat
eine Nummer.
Jeweils 8 Mieter wohnen in einem Haus. Die Häuser sind durchnummeriert
und die Mieter in einem Haus sind ebenfalls durchnummerert.
Wenn du etwas vom Mieter 89 willst:
* In welchem Haus wohnt er?
* Wie ist die Nummer des Mieters innerhalb des Hauses?
Division (/) und Rest einer Division (%) sind deine Freunde.
delicious_cake schrieb:> Aber mir ist eingefallen, dass für jede einzelne Bool> Variable ein ganzes Byte verbraucht wird. Wenn ich die Bool Variablen zu> wirklichen Bools umschreibe die nur mehr true und false sein können,> spare ich bestimmt an die 100 Byte Sram ein.
Hast du wirklich über 100 bool-Variablen in deinem Programm, die
gleichzeitig im Ram existieren müssen?
delicious_cake schrieb:> alle Konstanten sind bei mir von Anfang an als defines implementiert.> Und der PWM Table zum LED Faden efindet sich ebenfalls von Anfang an im> Flash memory.
Kannst du mal zeigen, wie deine defines sicherstellen, daß da keine
Konstanten im Ram liegen, und den Codeteil mit der PWM-Tabelle im Flash?
Oliver
Oliver schrieb:> Hast du wirklich über 100 bool-Variablen in deinem Programm, die> gleichzeitig im Ram existieren müssen?
wo sollen die bools denn sonst liegen? eine aendert den zustand z.B. mit
31,25 Hz. wenn ich die im eeprom ablege oder im flash dann bin ich
ziehmlich schnell bei 100.000 (eeprom) bzw. 10.000 (flash) schreibzyklen
angekommen. und dann geht nix mehr auf der adresse. die anderen andern
sich höchsten jede sekunde einmal.
Oliver schrieb:> Kannst du mal zeigen, wie deine defines sicherstellen, daß da keine> Konstanten im Ram liegen, und den Codeteil mit der PWM-Tabelle im Flash?
1
//selbsterstellter PWM Tabelle
2
uint8_tpwm_time[256]PROGMEM=
3
4
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
5
1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
6
2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,
7
3,3,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,
8
5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,8,
9
8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,11,
10
11,11,11,12,12,12,12,13,13,13,14,14,14,
11
14,15,15,15,16,16,17,17,17,18,18,18,19,
12
19,20,20,21,21,21,22,22,23,23,24,24,25,
13
26,26,27,27,28,28,29,30,30,31,32,32,33,
14
34,35,35,36,37,38,39,39,40,41,42,43,44,
15
45,46,47,48,49,50,51,52,53,55,56,57,58,
16
60,61,62,64,65,66,68,69,71,72,74,76,77,
17
79,81,83,84,86,88,90,92,94,96,98,100,103,
18
105,107,109,112,114,117,119,122,125,127,
19
130,133,136,139,142,145,148,152,155,158,
20
162,165,169,173,177,180,184,189,193,197,
21
201,206,210,215,219,224,229,234,239,245,250,255};
22
23
#define EE_LED_VALUE_ADDR 100 // eeprom byte address where the brightness-settings will be saved
24
#define EE_FADE_TIME 100+PWM_CHANNELS // eeprom byte address where the settings will be saved
OK.
Um LUFA USB-Stack wirst du jetzt nichts ändern können.
Der wird auch ein paar Bytes für Zwischenpuffer benötigen, etc.
Wenn du nur den USB-Stack mit an Bord hast, wieviel SRAM hast du dann
nocht frei.
Ich kann mir nämlich ehrlich gesagt auch nicht vorstellen, wo man bei
der Aufgabenstellung "16 LED unabhängig voneinander faden" so dermassen
viele boolsche Variablen braucht. Was um Himmels willen treibst du da?
42% von 512 Bytes sind immerhin 220 Bytes. Und das für 16 popelige LED?
delicious_cake schrieb:> Oliver schrieb:>> Hast du wirklich über 100 bool-Variablen in deinem Programm, die>> gleichzeitig im Ram existieren müssen?>> wo sollen die bools denn sonst liegen?
Lol.. die Antwort klingt etwa wie:
"Hast du wirklich einen Elefanten in deiner Garage?"
"Ja natürlich. Wo soll ich den denn sonst lassen?"
Karl heinz Buchegger schrieb:> 42% von 512 Bytes sind immerhin 220 Bytes. Und das für 16 popelige LED?
ich weiß nicht wie oft ich schon gesagt habe, dass noch nicht fertig
bin. erst kommen alle funktionen rein, dann wird optimiert. und wenn
zwischen drin ein Fehler auftauch wird der gleich behoben. Nur mit dem
RAM Problem habe ich nicht so schnell gerechnet. Jetzt muss ich halt
schon vorher etwas aufraeumen.
delicious_cake schrieb:> Jetzt muss ich halt> schon vorher etwas aufraeumen.
Oder zum Entwickeln einen größeren Controller nehmen. Wenn du den
ältlichen ATmega8 durch den moderneren ATmega88 ablöst, kannst du
nach oben mittlerweile bis zu einem ATmega328 gehen, der dann auch
2 KiB SRAM hat.
delicious_cake schrieb:> Karl heinz Buchegger schrieb:>> 42% von 512 Bytes sind immerhin 220 Bytes. Und das für 16 popelige LED?>> ich weiß nicht wie oft ich schon gesagt habe, dass noch nicht fertig> bin.
Dann ist es doch noch schlimmer!
Verstehst du das nicht?
Du musst dir schon auch jetzt ein wenig Gedanken darüber machen, wieviel
Speicher du wofür benötigen darfst und wenn du über dem Limit bist,
musst du frühzeitig reagieren.
> erst kommen alle funktionen rein, dann wird optimiert.
In deinem Fall gehts noch gar nicht um Optimieren im klassischen Sinne.
Es geht schlicht und ergreifend darum, dass du (anscheinend) durch dein
sorgloses Vorgehen schon jetzt deine vorhandenen Resourcen
überschreitest. Und da muss die Frage gestattet sein, wofür für jede LED
ca 13 Bytes an FadingInfo benötigt werden.
Wer umzieht muss sich im Vorfeld schon ein wenig Gedanken darüber
machen, wie er sein Hab und Gut transportieren will. Macht er das erst
am Tag des Umzugs, wenn seine Kumpel schon bereit stehen, dann muss er
sich gefallen lassen, sich nicht ausreichend vorbereitet zu haben.
Sich hinzustellen und zu sagen: Ich hab zwar Schwierigkeiten mit meiner
Couch, aber macht ja nichts, bin ja noch nicht fertig, kommt ja eh noch
die Küche dazu, das ist der falsche Weg. Die Probleme werden nicht
kleiner, wenn man noch mehr Funktionalität draufpackt.
Wenn ich mich aber so dunkel an einen anderen Thread von dir erinnere,
denn vermute ich mal, dass von den 13 Bytes ein nicht unerheblicher Teil
für 2 oder 3 float Variablen drauf geht.
@ Karl heinz Buchegger:
das ist mir alles klar. deshalb bringe ich jetzt ja alles in ordnung
bevor ich mich an weiter sachen wage. Dass mir der Speicher ausgehen
könnte, wenn die fading funktion so wie sie ist/war fertig ist, dessen
war ich mir bewusst. Aber von 80% RAM "Grenze" konnte ich doch nichts
ahnen, wenn man mit so etwas noch nie zu tun hatte. immoment ist das
faden so aufgebaut, dass sie für bis zu 64 LEDs verwendet werden kann.
mein µC hat halt nur nicht so viele IOs und ich verwende sie für 16. So
sehe ich einerseits was ich verbessern muss und andererseits lerne ich
probleme zu beheben.