PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stack leeren



mabuhay
29.01.2006, 19:09
Hallo

Hab da ein bisschen ne komische frage. Gibt es die möglichkeit, den Stack zu leeren? Ja ich weiss, wer macht das schon, es würde aber mein Problem wesentlich vereinfachen.

Bernhard_
30.01.2006, 08:34
Hallo mabuhay,


Hab da ein bisschen ne komische frage
Stimmt.

Scheibar vertraust du meiner Glaskugel. Wenn du etwas über den Hintergrund deiner Frage schreiben würdest, könnte man dir aber sicherlich besser helfen.

Den Stack direkt zu beschreiben geht meiner Meinung nach nicht.
Aber den Stackpointer kann man zumindest bei den PIC18F beschreiben. Wenn du den ganz zurücksetzt, müsste dein Ziel doch eigentlich erreicht sein, oder?
Ansonsten musst du halt viele PUSHs und POPs mit 0x00 machen, dann bekomst du den Stack in jedem Fall leer.

Wenn du erfolg hast: Kannst du hier nicht mal beschreiben, wie du die Überlauferkennung gemacht hast? Das Problem haben hier sicherlich viele schon gehabt.

Viele Grüße,
Bernhard

[/quote]

mabuhay
30.01.2006, 16:25
Die Frage baut eigentlich auf diesen zwei auf:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=16501
https://www.roboternetz.de/phpBB2/viewtopic.php?t=16520

Die Software im PIC Empfängt Daten (von einem Taschenrechner) und sendet diese über Infrarot (oder umgekehrt). Nun brauche ich irgendwie ein Reset, falls bei der Übertragung mal was schiefgeht. Am einfachsten ginge das natürlich mit einem Timer, welcher eifach Periodisch auslöst.
Nehme ich aber den Watchdog, wird das Programm ja komplett neu gestartet, ich muss also auch die Ports wieder neu Konfigurieren, und da gibts dann aber störsignale auf den Ausgängen.
Nehme ich den Timer, kann ich ja nicht einfach an die gewünschte Stelle am anfang des Programmes springen, da evtl. noch Daten im Stack sind. Kann ich nun den Stack löschen, oder zurücksetzen, würde die Variante mit dem Timer funktionieren.

Jetzt muss ich nur noch herausfinden, wo der Stackpointer zu finden ist.
Ich benützen den PIC 16F84.
Werde mich melden, sobald ich was über den Stackpointer gefunden habe.

mfg

ruediw
31.01.2006, 03:25
Also was soll das ? Wenn Du das Problem hast, dass sich dein Pic aufhängt
dann hast du einen "Hund" im Programm. Diesen solltest du ausmerzen.
Dann funktioniert dein uC auch.
Wenn Du Daten im uc zwischenspeichern willst damit Du diese nach einem
durch den Watchdog verursachten Reset zum PC senden kannst, kannst Du die Daten zur Sicherheit zuerst in einem EEPROM abspeichern bevor du
sie zum PC sendest.

Aber dass Du das schaffst, wenn Du nicht fähig bist den "Hanger" zu finden, habe ich meine Zweifel. Ich meinte ** zuverlässig**

mabuhay
31.01.2006, 15:48
Ja also was soll das? das solltest du dich mal fragen! Ich weiss genau wo der "hänger" liegt! Es wäre einfach um einiges einfacher, den Timeout per irgendeinem Timer auszulösen als bei jeder "hänger"-routine eine Schlaufe einzubauen, welche 1-2s dauert!
Ich weiss ganz genau, dass dies nicht gerade der gängigste weg ist, darum auch meine Fragestellung mit "ein bisschen ner komischen frage" (bitte nachlesen!).
Aber dennoch vielen dank für deine Antwort. Vorallem dass du an meinen Fähigkeiten zweifelst, ohne dass ich mit irgendwas gekommen bin wie "hilfe mein Programm hängt sich auf und ich weiss nicht wo"...

ruediw
01.02.2006, 03:21
Da musstest Du mir ja nichts sagen , deine früheren Beiträge sprechen
Bände. Ich vermute dass Du mit deinen "GoTO's" deine Funktionen
immer wieder rekursiv aufrufst. Dass kann nie gutgehen ...

Ohne zwingende Not (und ich hatte noch nie eine so grosse Not)
soll man Goto nicht verwenden, Und bei Rekursion soll man
immer vorsichtig sein.
Aber ich hör Dich schon fragen: "Könnt Ihr mir sagen was eine Rekursion ist ?"

Bernhard_
01.02.2006, 10:04
@ ruediw
Mit diesem Thema haben sicherlich viele Leute Probleme (ob sie's nun merken oder nicht...) und die Verwendung von "Soft-Watchdogs" ist in meinem Betrieb nicht unüblich.
Also schreib nicht nur über gotos, sondern akzeptiere einfach, dass mabuhay anders programmiert als du.

@mabuhay
Wie steht's mit dem Stackpointer?
Ich gehe davon aus, dass der PIC nicht abstürzt, wenn du einen Stackunterlauf hast ohne die falschen Werte zu verwenden. In diesem Fall müsste es möglich sein, einfach n mal POP auszuführen, um den Stack sicher zu leeren.

ruediw
01.02.2006, 10:16
@mabuhay
Wie steht's mit dem Stackpointer?
Ich gehe davon aus, dass der PIC nicht abstürzt, wenn du einen Stackunterlauf hast ohne die falschen Werte zu verwenden. In diesem Fall müsste es möglich sein, einfach n mal POP auszuführen, um den Stack sicher zu leeren.[/quote]

Du meinst wirklich, er weiss was ein Stackpointer ist ?
Den Eindruck hatte ich bis jetzt noch nicht https://www.roboternetz.de/phpBB2/images/smiles/eusa_wall.gif

Für alle die es noch nicht wissen:
http://de.wikipedia.org/wiki/Stackpointer

mabuhay
01.02.2006, 17:19
@Mr. ruediw
ähm, was soll das eigentlich?
1. könnte es ja sein, dass ich das erste mal irgendwas Programmier, wäre das der fall, könntest du mich ja einfach auf die Fehler aufmerksam machen ohne deine echt besch******* Antworten, welche mir bis jetzt noch nichts gebracht haben.
2. Ich hab mal gelernt, uC zu Programmieren. Dies ist nun schon mindestens 1 Jahr her. Mit PIC's beschäftige ich mich mich diesem Projekt zum ersten mal, ich hab also noch wenig erfahrung.
3. Ja ich weiss was ein Stackpointer ist. Leider hab ich bis jetzt nirgends gefunden, wo der im PIC zu finden ist. Aber vielleicht kannst du mir das ja erzählen, wenn du so viel weisst...

Es wäre also sehr nett, wenn du mir ne normale Antwort geben könntest und nicht immer irgendwelche blöde Kommentare dazuschreiben würdest.

-------

Also ich hab nochmal das Programm überarbeitet. Ich hab nun eine Ziehmlich gute lösung für die Timeouts mit nem Zähler.
@Bernhard_: Wie würde ich dann ein POP durchführen? Es gibt ja keinen POP-Befehl oder?

Also, wegen dem Timeout. Ich hab diesen Programmabschnitt (ohne Timeout-erkennung):


send_calc_1
bsf prog_status, 2 ; 1 an TR gesendet

bcf WEISS_OUT ; Datenleitung 3 auf 0 ziehen.
call send_calc_wait

btfsc ROT_IN ; Auf bestätigung warten, solange die Datenleitung 2 noch auf 1 ist.
goto send_calc_1
call send_calc_wait

; Ist die Datenleitung 2 auch auf 0 (die bestätigung)...
bsf WEISS_OUT ; ...datenleitung 3 wieder auf 1 setzen.

send_calc_11
btfss ROT_IN ; Warten, solange die Datenleitung 2 noch auf 0 ist.
goto send_calc_11

return

Hättet ihr eine bessere Idee, bei "send_calc_11" auf die Reaktion des TR's zu warten als eine Schlaufe?

mfg

ruediw
01.02.2006, 18:11
@mabuhay:

Dann sende mal deinen kompletten Code, nicht immer Schnipsel
von 3 Zeilen. Jedenfalls hast Du dir ja irgenwo eine Endlosschlaufe
programmiert.
Wenn Du wirklich so lange programmiert hättest, und das ganze vieleicht
auch verstanden, dann wüsstest Du das man sich in einer Hochsprache
wie Basic, C oder Pascal um den Stackpointer nicht kümmern muss.

Voraussetzung ist allerdings:
1. Dass der ganze code im Hauptprogramm ist.
2. Das man nicht wild mit goto herumhüpft.
3. das man Variablen vor dem 1. Gebrauch initialisiert.
4. Das man nich wild von einer Subrutine eine weitere aufruft
da die Verschachtelungstiefe von der Grösse des Stacks abhängig ist.

Wenn der Stack überschrieben ist, muss man sich nicht wundern...

mabuhay
01.02.2006, 18:38
Ja, der code besteht halt schon aus einigen Zeilen. Bei allfälligen Mängeln bin ich natürlich um konstruktive Kritik sehr dankbar.

Leider wusste ich am anfang des Programmierens nicht, dass mir der Stackpointer mal probleme bereiten wird. Ich hatte auch ein halbes jahr oder so mal Unterricht in C für uC. Hab da aber nicht so viel mitbekommen, da ich damals 1. schon C konnte, und 2. wir ganz von vorne von C angefangen haben. Aber vielleicht wäre C hier doch die bessere Wahl gewesen.

So wie der Quellcode nun ist, habe ich die Timeouts mit nem Zähler und nicht mehr mit dem Watchdog oder dem Timer gelöst. Nur an einer Stelle gibts noch Probleme mit dem Timeout (bei "send_calc_00/11").

Das einzige was noch nicht richtig funktioniert, ist die IR-Kommunikation (recieve_ir)...

mfg