Hi, ist sicher ne Kinderfrage, aber ich find dazu leider nix... Und zwar programmiere ich grad einen AT90CAN128 (=Atmega128+CAN?) in C bzw. dem AVR-Studio, der Code ist schon ziemlich groß, Variablen gibts sehr viele, allerdings nur Bytes und Words bzw. diese als Array. Jetzt stell ich gerade fest, dass eine Variable, die am Anfang mit einem Wert (0) initialisiert wird und ansonsten nicht verändert (soweit bin ich noch nicht), einfach ihren Wert ändert. Das stelle ich über ein Pin fest, an das die Variable ausgegeben wird. Ursprünglich hab ich die Variable während dem Programmablauf initialisiert (=0) Wenn ich die Variable über ein Display ausgebe, ändert sich allerdings nichts mehr. Wenn ich die Variable bei der Variablendeklaration schon initialisiere, ändert sich auch nichts mehr. Jedoch "volatile" vor der Variablendeklaration zu setzen bringt keine Abhilfe. Wodurch kommt das bzw. wie kann ich es sicher unterbinden? Grüße, Tobias
Tobias B. schrieb: > Jetzt stell ich gerade fest, dass eine Variable, die am Anfang mit einem > Wert (0) initialisiert wird und ansonsten nicht verändert (soweit bin > ich noch nicht), > einfach ihren Wert ändert. Das stelle ich über ein Pin fest, an das die > Variable ausgegeben wird. Das ist Deine Idee. Der Sourcecode (den wir bisher nicht sehen konnten) zeigt aber etwas anderes.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
es geht um OUTP_LIMITER und die Variable wird sonst nirgends im Code verwendet... Letzte Funktion wird über eine Endlosschleife in der main() dauernd wiederholt
Gast
#1555464
Vielleicht reicht das SRAM nicht für alle globalen Variablen + Stack. Dann überschreibt der Stack die Variablen. AFAIK wird das nicht durch eine Fehlermeldung abgefangen. Pro ineinandergeschachtelten Funktionsaufruf wird auf dem Stack Platz für die Rücksprungadresse plus alle lokalen Variablen der Funktion benötigt. HTH Randy
Sowas dachte ich mir auch schon, nur zeigt der Compiler das nicht an (wie er es beim Atmega8 z.B tut.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Gast
#1555565
> Sowas dachte ich mir auch schon, nur zeigt der Compiler das nicht an > (wie er es beim Atmega8 z.B tut. ... > Data: 3190 bytes (77.9% Full) > (.data + .bss + .noinit) Tut er hier auch nicht. Die 3190 Bytes sind die Variablen die immer Speicher belegen (d.h. globale und static). Wie groß der Stack wird weiß der Complier nicht, das hängt ja davon ab wie tief verschachtelt die Funktionaufrufe stattfinden. Das stellt sich erst zur Laufzeit raus. AFAIK haben die AVRs keine (Hardware-)Logik eingebaut die überprüfen kann ob der Stack so groß geworden ist dass er in den Speicherbereich der globalen Variablen hineingewachen ist. Randy
Variablen, die aus unerfindlichen Gründen ihren Wert ändern, können auch ein Hinweis darauf sein, dass irgendwo ein Arrayzugriff in die Hose geht und du ausserhalb der definierten Arrayindizierung in das Array schreibst
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Dies ist eigentlich der häufigste Fall, dicht gefolgt vom Stacküberlauf, bei dem der Stack in den Variablenbereich hineinwächst.
Lag wohl an beidem... Hab nen String übergeben a eine Displayfunktion. String abgekürzt und jetzt funktioniert es. So muss ich wohl ein paar Arrays ins EEPROM auslagern bzw. drin lassen. Hatte bis jetzt das alle Daten beim Start aus dem EEPROM ins SRAM geladen, um bisschen Rechenzeit zu sparen. Danke für eure Hilfe!
Schau mal lieber erst mal nach, was du so an konstanten Strings im Programm hast, und stecke die ins Flash.
Tobias B. schrieb: > Lag wohl an beidem... > > Hab nen String übergeben a eine Displayfunktion. String abgekürzt und > jetzt funktioniert es. String, der in einem Array zwischengespeichert wird? Array zu klein dimensioniert? Das abschliessende \0 Zeichen nicht eingerechnet?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Ich bin mir nicht sicher was der Compiler hier macht, aber ich vermute, dass der String hier als Array an die Funktion übergeben wird. Glaube nicht dass der Compiler so clever ist, und die Zeichen einzeln aus dem Flash ausliest. Abgesehen davon ist der Platz im SRAM tatsächlich sehr begrenzt, daher werd ich ihn ausmisten müssen.
Problem erkannt und wie immer ists ganz einfach. Der Text geht aus dem Display hinaus... das stinkt verdächtig nach dem Array-Überlauf.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.