JMP 0x000 vs. Reset

OP #2820883
Lesenswert?

Hallo zusammen,

ich habe bei einer Anwendung die Herausforderung den Controller neu zu 
starten, aber ohne Reset. Nun überlege ich gerade welchen Nebeneffekte 
durch ein JMP 0x0000 auftreten können und was man sonst noch zu beachten 
hat.

Controler: AtMega32
Toolchain: IAR

Eingefallen ist mir bis jetzt:

* Register haben nicht den Resetwert
* Vor dem JMP alle IRQs sperren
* RAM müsste durch die Init von IAR richtig initialisiert sein (Segement 
NEAR_I und NEAR_Z)

Hat jemand diesbezüglich schon Erfahrung gemacht oder Ideen?
#2820890
Lesenswert?

Kalli L. schrieb:

> Controler: AtMega32
> Toolchain: IAR
>
> Eingefallen ist mir bis jetzt:
>
> * Register haben nicht den Resetwert
> * Vor dem JMP alle IRQs sperren

Was in einem gewissen Sinne aufs gleiche rausläuft.

Was wird noch über Register geregelt (eigentlichg gibt es ja für alles 
irgendwo ein Bit in einem Register)

UART abschalten
ADC abschalten
Timer abschalten und rücksetzen (inkl. der Prescaler Stufe)
...

Geh einfach mal das Datenblatt durch und dort einfach mal im 
Inhaltsverzeichnis die Kapitel-Überschriften. Das sollte schon mal eine 
ganz gute Übersicht geben, worüber man sich genauer Gedanken machen 
sollte. Denk auch drann, dass Programme oft so geschrieben sind, dass 
eine gewisse Default-Reset Konfiguration vorausgesetzt wird. Wenn wir 
schreiben

   TCCR1B |= ( 1 << CS11 );

dann steckt da die implizite Annahme drinnen, dass CS12 und CS10 vom 
Reset her noch auf 0 sind.


> * RAM müsste durch die Init von IAR richtig initialisiert sein (Segement
> NEAR_I und NEAR_Z)

Alles was irgendwie vom Compiler beim Hochfahren erledigt wird, findet 
da wie dort genau gleich statt. D.h. um diese Dinge musst du dir keine 
Sorgen machen. Interessant sind nur die Dinge, die der µC in Hardware 
macht, ehe dann nach einem richtigen Reset der erste Befehl in Angriff 
genommen wird.
#2820901
Lesenswert?

Es schadet nichts, wenn man eine saubere Init schreibt, die aus einem 
beliebigen Zustand in einen bekannten Zustand setzen kann.

D.h. alle IO-Register so zu setzen, wie sie benötigt werden, ohne 
vorauszusetzen, daß sie vorher ihren Resetzustand hatten.

Dann reicht der "Jump 0" völlig.


Peter
OP #2820903
Lesenswert?

> Weshalb ohne Reset? Der klassische Weg geht über einen vorsätzlich
> verhungerten Watchdog.

Der Controller hält sich über einen Portpin selbst eine Betriebspannung 
aktiv. Nach einem Reset im Batteriebetrieb bleibt er aus, da die 
Portpins kurzzeitig nicht mehr treiben.
Gast #2820905
Lesenswert?

Die Frage ist, ob der TE das gleiche Verhalten implementieren will, als 
ob ein richtiger Reset stattgefunden hätte, oder ob er nur "von vorn" 
anfangen will, ohne dass sämtliche Register zurückgesetzt werden.

Im 1. Fall würde ich auch auf die WD-Methode von A.K. tendieren.
Gast #2820971
Lesenswert?

Was ist eigentlich an folgender Annahme falsch?
Nach dem "normalen" Reset sind die Register (natürlich) im 
Reset-Zustand.
Im nächsten Schritt muss ich auf jeden Fall alle wichtigen Register 
setzen.
Bei einem Sprung zur Adresse 0 bricht doch normalerweise nicht ein 
Registerchaos aus.
Wenn ich während der erneuten Initialisierung Befehle wie AND und OR 
benutze und nicht ADD bzw. SUB müsste doch ein Problemloser Neustart 
möglich sein. Da ich doch nur die Bits setze, an denen ich auch beim 
Original Reset herumgefummelt habe.
#2820999
Lesenswert?

amateur schrieb:
> Was ist eigentlich an folgender Annahme falsch?
> Nach dem "normalen" Reset sind die Register (natürlich) im
> Reset-Zustand.
> Im nächsten Schritt muss ich auf jeden Fall alle wichtigen Register
> setzen.
> Bei einem Sprung zur Adresse 0 bricht doch normalerweise nicht ein
> Registerchaos aus.

Das kommt drauf an, aus welchem Grund man den 'Reset' machen will/muss. 
Wenn die Aufgabe lautet einen Bootloader zu schreiben, der das neu 
eingebrannte Programm durch einen 'Reset' starten soll, dann sollte das 
dann auch wirklich für das zu startende Programm von einem richtigen 
Reset nicht zu unterscheiden sein.
OP #2821047
Lesenswert?

Meine restlichen Bedenken drehen sich um den Punkt, ob die 
Konfigurationsregister im Betrieb auch durch die Hardware verändert 
werden könnten und ob dieses einen sauberen Neustart beeinflußt.

Aber da muss man jetzt wohl mal aller Register raussuchen und sich 
durchs Datenblatt wühlen.
#2821070
Lesenswert?

Es gibt da ein Problembit, das UDRE.
Wenn man neu initialisiert, bevor das letzte Senden beendet wurde, 
bleibt es gelöscht und kann nicht per SW gesetzt werden.
Ist aber nur beim Senden ohne Interrupt wichtig. In dem Fall kann man 
vor dem SW-Reset warten, bis es gesetzt ist.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren