mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik finde den fehler nicht!


Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programm/Source Code?

Autor: duauchda (Gast)
Datum:

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

Autor: egberto (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duauchda (Gast)
Datum:

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

Autor: duauchda (Gast)
Datum:

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

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib doch mal wenigstens ein Beispiel für eine eingefügte Zeile...

Autor: duauchda (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt denn deine Entwicklungsumgebung dazu, wieviel Ram belegt ist?

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

Oliver

Autor: duauchda (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: laki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du
deine variablien global oder lokal definiert

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: duauchda (Gast)
Datum:

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

Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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].

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
funtionX()
{
  CLI(); // Interrupts sperren
  [...]
  SEI(); // Interrupts freigeben

}

ISR()
{
 funktionX();
}

So genug Arbeit für die Glaskugel für heut ;-)

Autor: Marco Beffa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duauchda (Gast)
Datum:

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

Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias
Wie kann ich denn den Stack vergrößern?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay dann fang ich mal an zu optimieren!

Autor: duauchda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.