Forum: Mikrocontroller und Digitale Elektronik Ist es legal Interruptadressen im laufenden Programm zu ändern,


von Guido B. (guido-b)


Lesenswert?

... bringt es Probleme oder ist es schlechter Stil?

Hallo,

Betriebssysteme machen ja sowas indem einige Einträge der
Vektortabelle ins RAM zeigen und dieses beim Start des
Programms entsprechend initialisiert wird. Das ist in manchen
Situationen schon hilfreich, spricht etwas dagegen?

Vielen Dank für eure Antworten

von Lothar S. (loeti)


Lesenswert?

> Hallo,
>
> Betriebssysteme machen ja sowas indem einige Einträge der
> Vektortabelle ins RAM zeigen und dieses beim Start des
> Programms entsprechend initialisiert wird. Das ist in manchen
> Situationen schon hilfreich, spricht etwas dagegen?
>
> Vielen Dank für eure Antworten

Wenn Du es besser machst als KleineSoftware...

von Guido B. (guido-b)


Lesenswert?

Lothar S. schrieb:
> Wenn Du es besser machst als KleineSoftware...

Das steht außer Frage ;-).

Ich will mir nur nicht selber ein Bein stellen weil ich
irgendetwas blödes übersehen habe.

von оргазм (Gast)


Lesenswert?

Ich möchte die Frage mal wörtlich nehmen. Niemand wird bestraft, wenn er 
es trotzdem macht. Ist also nicht illegal.

von Reinhard Kern (Gast)


Lesenswert?

Guido B. schrieb:
> Betriebssysteme machen ja sowas indem einige Einträge der
> Vektortabelle ins RAM zeigen und dieses beim Start des
> Programms entsprechend initialisiert wird.

Das ist nicht die einzige Möglichkeit, wo das sinnvoll sein kann. Viele 
Bootloader und Startup-Codes füllen die Sprungtabellen erst nach dem 
Selbsttest aus. Grundsätzlich bevorzuge ich auch feste Routinen und 
Tabellen, die darauf verweisen (das wird also vom Linker festgelegt), 
aber für bestimmte Zwecke habe ich z.B. eine Bootloader/Monitor-Software 
mit Debugzugriff, die eine Minimal-Ausstattung an Hardware 
initialisiert, wenn die normale Steuerungssoftware gestartet wird, kann 
sie sich die Ausstattung nochmal selbst zurechtschnitzen und eine andere 
Sprungtabelle verwenden.

Prinzipiell gibt es 2 Möglichkeiten:

1. Eine Sprungtabelle, die vom Linker ausgefüllt wird.

2. Eine leere Sprungtabelle im RAM, die von der jeweiligen 
Initialisierungssoftware gefüllt wird, d.h. die Routine UART1_INIT trägt 
auch den IRQ-Vector ein - so kann man ein Modul für UART1 schreiben, 
ähnlich wie bei Objekt-Orientierter Programmierung. Methode 2 wird daher 
eher von C-Compilern bevorzugt. Ausserdem geht es nicht anders, wenn man 
Software dynamisch nachladen will (wie Treiber unter Windows oder jedem 
anderen höheren Betriebssystem).

Gruss Reinhard

von Purzel H. (hacky)


Lesenswert?

Mindestens der Reset Vektor sollte fest sein....

von Michael A. (Gast)


Lesenswert?

Guido B. schrieb:
> Ich will mir nur nicht selber ein Bein stellen weil ich
> irgendetwas blödes übersehen habe.

Während du den Vektor änders, solltest du den betreffenden Interrupt 
vielleicht sperren ;-)

von Mik (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Prinzipiell gibt es 2 Möglichkeiten:

Die dritte ist das man die Interruptroutinen eines Interrupts verkettet. 
So kann sich jederzeit eine neue Routine einhängen oder aushängen, wenn 
sie nicht mehr benötigt wird.


Siebzehn und Fuenfzehn schrieb:
> Mindestens der Reset Vektor sollte fest sein....
 Das ist nicht unbedingt notwendig, es sollte aber dafür gesorgt sein 
das er jederzeit definiert ist, besonders nach dem einschalten.

.. man sollte diese Techniken aber gut im Griff haben sonst friert das 
System schnell mal ein.

von (prx) A. K. (prx)


Lesenswert?

Michael A. schrieb:
> Während du den Vektor änders, solltest du den betreffenden Interrupt
> vielleicht sperren ;-)

Nur nötig wenn die Änderung nicht atomar ist. Natürlich sollte das 
System dann damit zurecht kommen, dass um den Dreh herum unklar ist, 
welchen Vektor es erwischen sollte, den alten oder den neuen.

Guido B. schrieb:
> spricht etwas dagegen?

Nein.

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.