Ist es legal Interruptadressen im laufenden Programm zu ändern,

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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.