Ist es legal Interruptadressen im laufenden Programm zu ändern,

OP #3169744
... 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
#3169749
> 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...
Gast #3169784
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
Gast #3169839
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.