Forum: Mikrocontroller und Digitale Elektronik finde den fehler nicht!


von duauchda (Gast)


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!

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Programm/Source Code?

von duauchda (Gast)


Lesenswert?

Hallo Sascha!
Ich darf den Code leider nicht online Stellen und er beträgt jetzt 
mindestens auch an die 30 Seiten!

von egberto (Gast)


Lesenswert?

<Glaskugel-Mode ON> klingt nach Pufferüberlauf - an 0-Terminierung von 
Strings usw. gedacht?<Glaskugel-Mode OFF>

von Karl H. (kbuchegg)


Lesenswert?

Könnte auch ein Stack Overflow sein.
Zuviele Variablen, die irgendwann mit dem Stack kollidieren.

Aber ohne Code kann man das nur schwer sagen.

von Oliver (Gast)


Lesenswert?

>Ich darf den Code leider nicht online Stellen und er beträgt jetzt
>mindestens auch an die 30 Seiten!

Das, und die Fehlerbeschreibung, deuten auf einen Stack-Overflow hin.

Oliver

von duauchda (Gast)


Lesenswert?

Hallo Karl
Ich benutze viele Variablen! Wenn das der Fehler wäre, was könnte man 
dagegen tuen?

von duauchda (Gast)


Lesenswert?

Hallo egberto
Ich habe eigentlich immer darauf geachtet! Aber vielleicht hab ich mal 
was übersehen, werde gleich mal auf die Suche gehen!

von A. F. (artur-f) Benutzerseite


Lesenswert?

Gib doch mal wenigstens ein Beispiel für eine eingefügte Zeile...

von duauchda (Gast)


Lesenswert?

wenn ich z.B. diese Zeile einfüge fangen probleme an!
while((mmc_write_daten(biom,archiv))!=0);

von Oliver (Gast)


Lesenswert?

Was sagt denn deine Entwicklungsumgebung dazu, wieviel Ram belegt ist?

Und falls das nicht auch geheim ist: Welcher Prozessor wird verwendet?

Oliver

von duauchda (Gast)


Lesenswert?

Ich benutze einen Atmega162! Und es ist noch ein drittel des 
Speicherbereichs frei! Laut AVR Studio

von Oliver (Gast)


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

von duauchda (Gast)


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!

von laki (Gast)


Lesenswert?

hast du
deine variablien global oder lokal definiert

von Εrnst B. (ernst)


Lesenswert?

> Data:        234 bytes (22.9% Full)

Kann eigentlich nicht stimmen, ausser du hast deine MMC-Routinen dazu 
gebracht, ohne zumindest einen Sektor-Buffer zu arbeiten.
Oder legst du den auf dem Stack an?

von duauchda (Gast)


Lesenswert?

hab sie alle unter int main() angelegt!
mache morgen weiter muss jetzt leider aufhören!

von duauchda (Gast)


Lesenswert?

ich packe die daten in eine string und diesen lege ich auf die mmc 
karte.
die größe des array ist somit uint8_t array[512].

von Karl H. (kbuchegg)


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.

von Matthias (Gast)


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 ;-)

von Marco Beffa (Gast)


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

von duauchda (Gast)


Lesenswert?

Hallo Karl
Hab die Variablen mal globalisiert und es sind 90.8% belegt. Ist das zu 
viel?

von duauchda (Gast)


Lesenswert?

Hallo Matthias
Wie kann ich denn den Stack vergrößern?

von Oliver (Gast)


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

von duauchda (Gast)


Lesenswert?

okay dann fang ich mal an zu optimieren!

von duauchda (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.