-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Stack leeren

  1. #1

    Stack leeren

    Anzeige

    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    26.07.2005
    Beiträge
    37
    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]

  3. #3
    Die Frage baut eigentlich auf diesen zwei auf:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=16501
    http://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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    61
    Beiträge
    264
    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**
    MfG
    Ruedi

  5. #5
    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"...

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    61
    Beiträge
    264
    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 ?"
    MfG
    Ruedi

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.07.2005
    Beiträge
    37
    @ 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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    61
    Beiträge
    264
    @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 http://www.roboternetz.de/phpBB2/ima.../eusa_wall.gif

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

  9. #9
    @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):
    Code:
    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

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    61
    Beiträge
    264
    @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...
    MfG
    Ruedi

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •