finde den fehler nicht!

Gast #872546
Lesenswert?
• ▲
▼
Hallo Leute, da mir schon mal hier sehr geholfen wurde, hoffe ich auch 
heute wieder auf Unterstützung.
Ich habe ein sehr komisches Problem: Mein Programm läuft tadellos. Doch 
wenn ich noch eine Zeile hinzufüge Macht der Mikrocontroller nicht mehr 
das was er machen soll! Es ist auch egal was ich für eine Zeile einfüge. 
Ich benutze unter anderem einen externen Quarz, der den Mikrocontroller 
taktet. Nach einer
Zeit t springt er in mein Programm. Wenn ich jetzt aber noch eine Zeile 
einfüge springt er zwar wieder rein taktet auch weiter aber es passiert 
nichts mehr. Das bedeutet, dass eine Ausgabe vor der eingefügten Zeile 
auch nicht mehr ausgeführt wird. Wie kann das sein? Nehme ich die Zeile 
wieder heraus ist alles in Ordnung. Hat jemand vielleicht eine Idee? 
Kann es ein Timingproblem sein? Ich benutze unter anderem solche 
Zeitverzögerer _delay_ms() (Ich programmiere in C) Wäre für jeden Tipp 
dankbar
Danke im voraus!
Gast #872641
Lesenswert?
• ▲
▼
Wenn da steht: data xx byte (66% full), dann bedeutet das, daß 66% des 
Rams schon mit globalen oder statischen Variablen belegt sind, bevor 
dein Programm auch nur eine Zeile ausgeführt hat. Wenn da jetzt noch 
größere lokale arrays oder tief geschachtelte Funktionsaufrufe 
hinzukommen, wird es halt eng.

Oliver
Gast #872665
Lesenswert?
• ▲
▼
Bei mir steht folgendes
Program:   12050 bytes (73.5% Full)
Data:        234 bytes (22.9% Full)
aber vielleicht habe ich schon eine Lösung gefunden! werde es morgen 
ausprobieren. vielen dank für die hilfe!
#872698
Lesenswert?
• ▲
▼
duauchda wrote:
> hab sie alle unter int main() angelegt!

Ich hätte das nie gedacht, dass ich sowas mal sagen würde.
Aber: Zieh die Variablen aus dem main() mal raus auf die
Ebene der globalen Variablen.
Ansonsten ist die Angabe der SRAM-Belegung lediglich Schall und Rauch.
Gast #872721
Lesenswert?
• ▲
▼
Entwicklungsumgebung (Compiler?)

Beim ICC-AVR Compiler gibt es so eine unscheinbare Einstellung für den
"Return" Stack. Der Compiler verwaltet zwei Stacks (macht gcc und Co 
glaub auch so). Auf dem "Return" Stack werden nur die Rücksprungadressen 
abgelegt und Variablen auf dem "Datenstack". Wenn du Funktionen benutzt 
wie printf(), die viele Unterprogrammaufrufe oder evtl. sogar rekursiv 
sind, dann muss die
Größe des Return-Stacks angepasst werden!

Tut man das nicht, dann rennt einem das Programm ins Nirvana....

Beim ICC gibt es auch eine Stack-Check Funktion. Ist zwar nicht absolut 
sicher, aber es hilft manchmal das Problem einzugrenzen.

Ein anderer Fehlertyp, der einem passieren kann ist z.B.
1
funtionX()
2
{
3
  CLI(); // Interrupts sperren
4
  [...]
5
  SEI(); // Interrupts freigeben
6

7
}
8

9
ISR()
10
{
11
 funktionX();
12
}

So genug Arbeit für die Glaskugel für heut ;-)
Gast #872722
Lesenswert?
• ▲
▼
Hallo!

Ich hatte vor gewisser Zeit ein änhliches Problem:

Ab einer gewissen Grösse funktionierte mein Code nicht mehr. Sobald ich 
also eine Zeile hinzufügte ging nichts, aber auch garnichts mehr. (Nicht 
mal LED Sign of Life). Die Zeile konnte wie bei dir beliebig sein.

Das Problem lag dann beim meinem Eeprom Emulator. Der war auf ne zu 
kleine Grösse eingestellt und sobald ich diese überschritten hatte ging 
nichts mehr.

Ich würde bei dir auf ein ähnlich geartetes Speicherproblem schliessen. 
Da es ja egal ist, welche Zeile du einfügst, muss es zwangläufig 
irgendetwas mit der Codegrösse zu tun haben.

Grüsse
Gast #873259
Lesenswert?
• ▲
▼
>Hab die Variablen mal globalisiert und es sind 90.8% belegt. Ist das zu
viel?

Jaaaaaa :-)

>Wie kann ich denn den Stack vergrößern?

Gar nicht. Beim avr-gcc nimmt der sowieso schon allen Platz ein, der 
verfügbar ist.

Oliver
Gast #873379
Lesenswert?
• ▲
▼
Ich wollte mich noch mal bei allen bedanken! Der Fehler ist gefunden! Es 
war so wie ihr gesagt habt. Habe die Variablen optimiert und jetzt 
funktioniert es
ohne probleme! Bis jetzt zumindestens
vielen dank noch mal

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren