Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C164CI-ControllerBoard, eigenes Board, OSOPT V3.1
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: