Forum: Compiler & IDEs Langzeittest der Software


von Josef K. (josefk)


Lesenswert?

Hallo zusammen,

ich versuche gerade meine Software mittels einer 
Daten-Bombardement-Software zu testen. Prinzipiell ist mein Programm 
eine Platine mit vielen verchiedenen Schnittstellen, unter denen auch 
ein ENC28J60 ist.

Leider hat meine Software nur 37h stand gehalten und ich habe einfach 
keine Ahnung wo ich anfangen soll zu suchen. Das Programm hat alle 
Aufgaben richtig erledigt bzw alle Anfragen richtig abgearbeite und 
geantwortet, bis es einfach nicht mehr ging.
Das ganze sieht nach Fragmentiereten Speicher aus, oder?

Ich habe keine Ahnung wie man da den Fehler finden kann. Hat da jemand 
von euch gute Tipps?

von Dirk B. (sharandac)


Lesenswert?

Hallo,

meiner Erfahrung nach ist meistens die Fehlerbehandlung fehlerhaft oder 
wird nicht gemacht. Gerade in Verbindung mit dem ENC28j60 und den 
TCP/IP-Stack kommt es zu fehler. Ich selber habe eine ganze weile 
gebraucht bis mein Stack relativ Stabil war. Häufigster Grund war 
Fehlerbehandlung und das vor der Abfrage eines Bytes aus einer einer 
Netzwerkverbindung nicht gecheckt wurde ob noch Bytes im Buffer sind und 
dann wenn keine Daten mehr da waren nur miste zurück geliefert wurde. 
Aber das ist nur ein Ansatz war sein kann. Hast du denn eine Vermutung 
wo der Fehler liegen könnte ?

CA Dirk

von Sven P. (Gast)


Lesenswert?

Evtl. könnts sich auch um thermische Probleme handeln, die ENC wird doch 
recht heiß, wenn ich mich recht entsinne.

von Josef K. (josefk)


Lesenswert?

Ich habe absolut keine Ahnung. Ich schau mir das jetzt schon ne Weile an 
und habe nebenher bemerkt, dass, sobald ich meine Debugmeldungen nicht 
mehr über RS232 schicken lasse, arge Probleme bekomme. Nichts 
funktioniert mehr so wie es soll.
Da ich die Strings nicht ins Flash ausgelagert habe, glaube ohne diesen 
String-Wust irgendwo eine Zugriffsverlezung zu haben, die sich aufs 
System auswirkt. Vorher könnte das von den Debugstrings "abgefanggen" 
worden sein. Sprich, ich schreib irgendwo hin, wo ich nicht soll. Ich 
kann den Fehler aber einfach nicht lokalisieren. Das nervt mich schon 
den ganzen Tag. Das Programm ist leider scon zu umfangreich um es hier 
sinnvoll posten zu können....

von Hagen R. (hagen)


Lesenswert?

ich denke es sind eher Timingprobleme. Durch das Deaktivieren der 
Debugausgabe ändert sich das komplette Timing in deiner App, sowohl 
Software wie auch HW-IQRs.

Gruß Hagen

von Dirk B. (sharandac)


Lesenswert?

JA, bei solchen Projekten macht sich es bemerkbar wenn man Treiber und 
App nicht sauber trennen tut. Deshalb habe ich mein Projekt auch zweimal 
angefangen, weil ich gemerkt habe das genau sowas die meisten Probleme 
verursacht. Kann ich nur empfehlen.

CA Dirk

von yalu (Gast)


Lesenswert?

Beim Wort "Timing" denkt man auch gleich an Race-Conditions, die bspw.
dann eintreten, wenn im Hauptprogramm und in Interrupthandlern auf
gleiche Variablen zugegriffen wird, die größer als die Wortbreite des
Prozessors sind. Um überlappende Zugriffe zu vermeiden, müssen
geeignete Vorkehrungen (bspw. Sperren des Interrupts) getroffen
werden.

Die Wahrscheinlichkeit, dass solche Konflikte tatsächlich eintreten,
sind oft sehr gering, so dass ein Programm trotzdem viele Stunden
fehlerfrei arbeiten kann.

von Josef K. (josefk)


Lesenswert?

Als TCP/IP Stack nutze ich den uIP Stack, wie so viele. Ich dachte 
immer, dass dort alles ziemlich linear abläuft. Sobald also eine 
Nachricht eintrifft gerate ich in meine Statemachine und empfange auch 
nichts mehr solange ich nicht dort wieder raus komme. Lediglich alle 
100ms wird ein Interrupt ausgelöst. Was der genau macht weiß ich 
garnicht wirklich :) Irgendwas refreschen.
Kann es wirklich daran liegen?
Ansonsten nutze ich keine Interrupts. Ich ging immer vom einem 
Speicherproblem aus, aber wenn so viele hier posten, dass es mit dem 
Timing entwas zu tun haben kann...
Worauf muss ich bei dem Stack noch achten, also timingtechnisch?

von Oliver (Gast)


Lesenswert?

Das Problem kann alles durch alles mögliche hervorgerufen werden. 
Hardwareprobleme, EMV, Stackoverflow, Timing, ungültige Pointer, ...

Wenn dazu das Programm so groß ist, das man es nicht mehr posten kann, 
und dazu Programmteile verwendet, deren Funktion du weder kennst noch 
verstehst, stehen die Chancen schlecht.

Es nutzt nichts, du musst versuchen, das Problem einzukreisen. Wenn es 
ohne debug-Meldungen nicht mehr funktioniert, nimm die einzeln raus, und 
schau nach, was passiert. Hilfreich ist auch ein Port mit LEDs dran, die 
du zur Kontrolle des Programmablaufes verweden kannst. Das Setzen eines 
Ausgangs ist weit weniger zeitkritisch, als die Ausgabe einer 
debug-Meldung über die uart. Wenn du ganze Programmteile rausnehmen 
kannst, und der Fehler bleibt, um so besser. Dann wird das alles 
übersichtlicher.

Stundenlanges starren auf den Code löst das Problem nicht.

Oliver

von Josef K. (josefk)


Lesenswert?

Ja. Das habe ich auch schon gemerkt, aber das Problem einzugrenzen ist 
mir noch nicht gelungen. Momentan habe ich das Problem, dass sobald ich 
Teile bzw. Funktionen auskommentiere, z.B. auf die SD-Karte nicht 
zugreifen kann. Die Funktionenn für die SD-Karte habe ich nicht sleber 
geschrieben, aber an denen wirds wohl auch nicht liegen. Naja. Ich schau 
mir mal den Code nochmal an wenn ich Nerven dafür habe.  :)

von Josef K. (josefk)


Lesenswert?

Ich glaub den Fehler lokalisiert zu haben.
Es scheint an folgendem Code zu liegen:
Beitrag "PGM_P Array - darf ich das so?"

Was genau der Fehler ist weiß ich aber noch nicht...

von Josef K. (josefk)


Lesenswert?

Doch nicht. Es ist wirklich faszinierend. Sobald ich ein paar 
Debugmeldungen aus dem Code lösche, funktioniert nichts mehr, nicht mal 
die Initialisierung der Bausteine.
Wenn ich die Debugmeldungen aber wieder einfüge ist es nicht sicher, ob 
dann auch wieder alles funktioniert. Ich weiß echt nicht wo zu Suchen 
ist.

Meine Vermutung ist immer noch ein falscher Schreibzugriff auf das SRAM. 
Aber warum wenn die Debugtexte (einfach als String im Programm 
definiert) dafür verantwortlich sind, dass diese falschen 
Schreibzugriffe keine Auswirkungen tragen, warum sind die Debugtexte 
dann richtig. Sprich, kein fehlerhaftes Char, oder ähnliches.

Was kann es also noch sein? Timingprobleme? Der uIP Stack ist eigentlich 
eine große Statemachine. Sobald ich Daten erhalte und diese verarbeiten 
will, kommt in meinen Stack nichts mehr rein an Daten. Erst wenn ich die 
"Statemachine" wieder verlasse, empfange ich wieder daten vom ENC. Daher 
scheiden doppelte Zugirffe auf irgendeinen Speicher aufgrund von 
Timingproblemen für mich aus.

Stackoverflow und falsche Pointer können, meiner Meinung nach, das 
Phänomen auch nicht erklären.

Die Hardware läuft auch problemlos, solange ich keine Debugmeldung 
rausnehme.

Einzelne Programmteile rausnehmen ist auch keine Lösung. Wenns mal nicht 
mehr funktioniert, dann funktioniert das Programm auch nicht mehr wenn 
ich z.B. den SD-Karte-Parser entferne, bei dessen Rückkehr in main der 
Controller dann anfangs immer abschmiert. Das Problem verlagert sich 
dann nur auf andere Codeteile. Das ganze wird dann eine endlose Kette an 
Problemen...


Bin ratlos und mir ist schlecht

von Kai G. (runtimeterror)


Lesenswert?

Was dir evtl. weiterhelfen könnte.

Wenn du noch ein paar I/Os frei hast:
Schnapp dir ein paar wichtige Routinen/Interrupts und setze beim 
Betreten einen I/O auf High und beim Verlassen wieder auf Low (jeder 
Routine bekommt einen eigenen I/O zugewiesen).

Damit kann man zum Einen die Aufrufreihenfolge der Routinen mit einem 
Logic-Analyzer beobachten/protokollieren und im Falle eines Absturzes 
ungefähr feststellen, wo man sich der Controller gerade befindet. Das 
Ganze sollte dein Timing nur geringfügig verändern. Rekursionen kann man 
damit nicht ohne Weiteres beobachten.

Evtl. hilft auf der Einsatz eines Watchdogs um den Übeltäter 
auszumachen.

Viel Glück noch bei der Suche!

von Stefan E. (sternst)


Lesenswert?

Josef Kaeufl wrote:
> Meine Vermutung ist immer noch ein falscher Schreibzugriff auf das SRAM.
> Aber warum wenn die Debugtexte (einfach als String im Programm
> definiert) dafür verantwortlich sind, dass diese falschen
> Schreibzugriffe keine Auswirkungen tragen, warum sind die Debugtexte
> dann richtig. Sprich, kein fehlerhaftes Char, oder ähnliches.

Du gibst doch nicht ständig alle Debugtexte aus, oder? Vielleicht sind 
da ja auch Texte dabei, die nur einmal ausgegeben werden, zum Beispiel 
beim Start des Ganzen.
Möglich ist auch noch was anderes. Durch die Debugtexte ändert sich ja 
auch die Anordnung und Platzierung der anderen Variablen. Mit den Texten 
zeigt der Pointer vielleicht in einen weniger kritischen Bereich, z.B. 
in den hinteren Bereich eines Puffers, der meist nur wenig gefüllt ist.
Denkbar sind da so einige Szenarien.

von Josef K. (josefk)


Lesenswert?

Kai Giebeler wrote:
>
> Damit kann man zum Einen die Aufrufreihenfolge der Routinen mit einem
> Logic-Analyzer beobachten/protokollieren und im Falle eines Absturzes
> ungefähr feststellen, wo man sich der Controller gerade befindet. Das
> Ganze sollte dein Timing nur geringfügig verändern. Rekursionen kann man
> damit nicht ohne Weiteres beobachten.

Tja, wenn ich nur sowas tolles hätte. Ich hab ein Multimeter :)


>
> Viel Glück noch bei der Suche!

Danke.

von Oliver (Gast)


Lesenswert?

>Das ganze wird dann eine endlose Kette an Problemen...

Wie isst man einen Elefanten? Stück für Stück...

Wenn du Code rausnehmen kannst, und immer noch Probleme auftreten, dann 
nimm Code raus. Verkleiner das Programm soweit, bis entweder der/die 
Fehler nicht mehr auftreten, du was findest, oder nichts mehr übrig ist. 
Im letzten Fall liegt es dann wohl nicht an der Software :-)

Und auch wenn das Programm groß ist, zip alles zusammen, und poste das 
hier als Anhang. Vielleicht sehen ja ein paar Augen doch mehr, als nur 
ein Paar.

Oliver

von Josef K. (josefk)


Lesenswert?

Also das ganze soll mein Diplomarbeit darstellen, die zwar nicht von 
programmamiertechnischer Größe zeugt, aber für mich schon nicht von 
Pappe war.
Soll ich das ganze hier wirklich posten? Evtl bekomme ich da Ärger mit 
der Frima, bei der ich arbeite .)

von Oliver (Gast)


Lesenswert?

Na, für ein Diplom musst du da schon selber durch.

Falls du doch irgendwann mal eine Kurzversion hinbekommst, die nicht 
allzuviel verrät, aber den Fehler hervorbringt, kannst du dich ja 
nochmal melden.

Oliver

von Peter D. (peda)


Lesenswert?

Josef Kaeufl wrote:
> Leider hat meine Software nur 37h stand gehalten und ich habe einfach
> keine Ahnung wo ich anfangen soll zu suchen.

Mit dieser Aussage kann man nichts anfangen.

Macht es einen Neustart, bleibt es irgendwo hängen, gehen Interrupts 
noch oder wie genau äußert sich das "nur 37h stand gehalten"?

Wenn es stehen bleibt, kann man nach einem Neustart oder externen 
Interrupt einen RAM- und Register-Dump auf die UART machen.

Interrupt ist schöner, da dann auch wichtige Register (SP, SREG) und der 
letzte PC ausgegeben werden kann.

So und dann sich da durchwühlen, ob man rauskriegt, was die letzte 
Aktion war.


Peter

von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

Josef Kaeufl wrote:
> Hallo zusammen,
>
> ich versuche gerade meine Software mittels einer
> Daten-Bombardement-Software zu testen. Prinzipiell ist mein Programm
> eine Platine mit vielen verchiedenen Schnittstellen, unter denen auch
> ein ENC28J60 ist.

Etwas off-topic bei dem Problem hier, aber:
Mit welcher "Daten-Bombardement-Software" testest Du das denn?

Viele Grüße,

Thomas

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.