Re: Stacküberlauf, die 2. Kategorie: Programmierung (von Martin - 19.07.2006 15:03) | ||
Als Antwort auf Re: Stacküberlauf, die 2. von André H. - 19.07.2006 14:43 | ||
| ||
100% ACK Martin > So Erich, > > langsam reichts mir !! > So etwas, wie Netiquette sagt Dir sicher nichts. > Denn dann würdest Du nicht unzählige neue Threads zum selben Thema aufmachen. > Deshalb habe ich dieses Posting auch in einen vorhandenen Thread verschoben. > Jetzt können sich ein paar Kunden bei Dir bedanken, da� ihre Bestellungen > heute nichtmehr rausgehen, da ich im Forum posten mu�! > > Ich habe Dein gemailtes Programm gestern Abend auf eine Unit geladen. > Es lief über Nach auch am Morgen noch einwandfrei ohne irgendwelche �nderungen > der Geschwindigkeit, ohne irgendein Aufhängen oder anderer Dinge. > Hier nochmal Dein Programm: > > //------------ > thread main > //------------ > { > int i, bool; > string s; > long z; > lcdext.init(); > i = 0; > bool = 0; > > plm.settimebase(0,0); > plm.setmode(0,0); > plm.setperiod(0,3000); > > plm.settimebase(1,0); > plm.setmode(1,0); > plm.setperiod(1,3000); > > plm.settimebase(2,0); > plm.setmode(2,0); > plm.setperiod(2,3000); > > loop > { > if i >= 3000 > bool = 1; > if i <= 0 > bool = 0; > > if bool == 0 > i = i + 50; > if bool == 1 > i = i - 50; > > plm.out(1, i); > plm.out(0, i); > plm.out(2, i); > > s=""; > str.putlong(s, ports.getcount(1)); > lcdext.goto(1,0); > lcdext.print(s); > lcdext.goto(2,0); > lcdext.print("Trallala"); > sleep 500; > lcdext.clear(); > > s=""; > str.putlong(s, ports.getcount(2)); > lcdext.goto(1,0); > lcdext.print(s); > lcdext.goto(2,0); > > lcdext.print(" und "); > sleep 500; > lcdext.clear(); > > s=""; > str.putlong(s, ports.getcount(3)); > lcdext.goto(1,0); > lcdext.print(s); > lcdext.goto(2,0); > lcdext.print("Hoppsasa"); > sleep 500; > lcdext.clear(); > } > quit 1; > } > > Ich habe nur ein quit 1; nach der Schleife eingefügt, um erkennen zu können, > falls die Schleife verlassen wird, was erwartungsgemä� nicht geschehen ist. > �brigens kann man das Programm noch um einiges kompakter und optimierter schreiben. > > Ich glaube Dein Hauptproblem liegt immernoch im Ignorieren sämtlicher Dokumentation. > Prüfe daher bitte einmal, ob Du vielleicht mehrere Softwareversionen der Module, der IDE > und HEX-Dateien gemischt hast. > Denn das wäre der einzige Grund, warum es z.B. zu einem Stackunderflow oder > Stackoverflow kommen könnte, wenn die Einsprungadressen von älteren Modulen > zu neueren HEX-Dateien oder von neueren Modulen zu älteren HEX-Dateien genutzt. > > D.h. in Deinem Fall, da� Du folgende Schritte jetzt vornimmst: > - Deinstalliere die IDE > - Lade die aktuelle IDE mit SP herunter und installieren diese > - Lade nun alle Module herunter, die seit erscheinen des letzten SP erschienen sind > und kopiere diese entsprechend in die Lib-und UserLib-Verzeichnisse > - Lade Dir OSOPT V3.1b1 herunter und lade es mit dem CC2Net.de-Download-Tool in die CC2. > - Lade nun sys0002.hex mit vorherigen Löschen von Segment 3 in die CC2. > > Wenn Du das geschafft hast, reden wir weiter. > > Was den Stack angeht, so kannst Du hier nichts konfigurieren. > Der komplette restliche RAM, der nicht für Globale Variablen verwendet wird, wird als Stack verwendet. > > Und was Du jetzt mit den Long-Variablen hast, kann ich auch nicht verstehen. > Long-Variablen haben einen 32Bit Bereich. Und hier gibt es keine Probleme. > Du mu�t nur eine Kleinigkeit beachten, wenn Du Integer und Long-Berechnungen mischt. > Aber das steht auch in den FAQ. > > Und, um es nochmal klipp und klar zu sagen: > Die einzigen Bugs, die die CC2 derzeit hat, liegen im Bereich von HWCOM > beim Empfang sehr gro�er Datenmengen an einem Stück. > Aber selbst das tritt nur sehr selten in Einzelfällen auf, so da� ich das nur sehr schwer reproduzieren kann. > Ansonsten sind keinerlei anderen Bugs bekannt. > Meinst Du nicht, da� solche Dinge, die Du beschreibst, nicht auch anderen auffallen müssten ?? > Jedoch gab es in den letzten 6 Jahren keine einzige solche Meldung. > Dabei sei noch angemerkt, da� viele Programme grö�er 50kB VM-Code sind. > Ich habe auch einige eigene und auch Kundenprojekte, die sogar über 100kB VM-Code, > unzähle Threads haben und sehr viel RAM benötigen. > > Aber solange Du so voreingenommen auftrittst, da� "Du unfehlbar bist und es > nur am System/Controller liegen kann", kann Dir kein Mensch mehr helfen. > > Und nochetwas, wei�t Du warum ich in meiner Signatur stehen habe, da� ich > auf keine Mails von Forenpostings antworte ? > Denn sonst hätte ich den gesamten Tag nichts anderes mehr zu tuen, au�er > auf Mails zu antworten.. > > > Also, bevor noch weitere Postings von Dir kommen, die angebliche Bugs der CC2 > zeigen sollen, die einfach nicht existieren, prüfe ersteinmal alles andere. > Denn ich arbeite tagtäglich mit der CC2, habe bei vielen Kundenprojekten mitgewirkt > und betreue auch einiges an Software. > Meinst Du nicht, da� ein solcher nicht existierender Bug, wie Du ihn beschreibst, > mir irgendwie in den letzten Jahren aufgefallen wäre ?? > > > André > > > > > Also nachdem mir ein Mikrocontrollerfachmann den Tipp gegeben hatte, alle unnötigen Variablen > > (also die, die eigentlich der Lesbarkeit dienen und für den gleichen Wert an mehreren Stellen sorgen) > > rauszuschmei�en, weil alles auf einen Stack-�berlauf hindeutet - vor allem, dass das Programm > > weiterkommt, seit ich das gemacht habe, bestätigt dies. Da es sich um ein multithreading-System > > handelt, ist jedem thread ja eine default-Grö�e zugeordnet. Ich habe sinnigerweise aber nur einen > > thread und von daher wäre es schön, wenn mir jemand sagen könnte, wie ich die "stack size" > > erhöhe. > > > > In meinem kleinen Testprogramm wird die loop-Routine ja immer langsamer und hängt sich zum > > Schluss auf: > > auch ein Zeichen. > > Da dort aber nicht so viele Variablen vorkommen, führe ich das auf einen Bug zurück. > > Die Pulsereien gehen einzeln. Allerdings geht das irgendwann schief, sobald das Display dazukommt. > > Im Moment bin ich am Testen: ich lasse eine long-Variable hochzählen und ausgeben. > > Interessant ist, dass long bei CC2 von -32768 bis 32767 geht :) So ein Quatsch ;) | ||
Antwort schreiben Antworten: |