Einzelnen Beitrag anzeigen

Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ISR in C erstellen

  Alt 28. Jul 2009, 17:05
Zitat von Elko:
Code:
static void T1_isr (void) interrupt 3
Eine Interrupt Service Routine ist eine statische (static) Routine, die keinen Rückgabewert hat (void), und einem bestimmten logischen Interrupt zugeordnet ist (interrupt 3). Die Nummer entspricht in der Regel einem Index auf eine Tabelle von Interruptvektoren (Funktionsadressen an die bei Auftreten eines Interrupts gesprungen wird), je nach Architektur gibts da unterschiedliche Tabellen, manche trennen Software- und Hardware-Interrupts (Software-Interrupts werden durch bestimmte Prozessoranweisungen ausgelöst, Hardware-Interrupts durch entsprechende Ereignisse innerhalb des Prozessors oder Signale von aussen an bestimmten Pins), aber ansonsten gibts da nicht viel zu berichten. Die Besonderheiten werden hier vom C-Compiler erledigt der durch das Schlüsselwort "interrupt" halt weiss, dass das keine normale Routine ist.

Wichtig ist halt normalerweise:

Eine ISR darf keine Register verändern (ausser wenn das explizit gewünscht wird, siehe Interrupts in DOS), wenn die Hardware also nicht selber die Register sichert, muss der Programmierer sich darum kümmern. In der Regel werden dazu alle relevanten Registerinhalte einfach auf den Stack gepackt und am Ende der ISR wieder zurückgeholt. Alternative Konzepte verwenden eine Art Bankswitching um Register zwischen "Normal" und "Interrupt" zu trennen.

Der Rest ist eigentlich relativ trivial, je nach Plattform muss man nur wissen welche Interrupts wie benutzbar sind und ggf. noch auf die Prioritäten schauen (manche Architekturen erlauben Interrupts mit unterschiedlicher Priorität, ein Interrupt einer bestimmten Priorität kann dann nur von Interrupts höherer Priorität unterbrochen werden).

Zitat von Elko:
Code:
{   TL1 = 0xC0;      // L-Register laden insgesamt: 0xF831
   TH1 = 0x07;      // H-Register laden

// ... Quelltext

}
Und das ist nun nichts spezifisches für eine ISR, da wird irgendein 16-Bit-Register mit zwei 8-Bit-Werten gefüllt. Ist das zufällig etwas für Atmel?

Zitat von Elko:
PS: Das ist eine Timer-ISR, wenn ich mich nicht täusche
Das kann so gut wie alles mögliche sein, was es nun wirklich ist, ergibt sich erst aus der Kombination von Hardwaredokumentation (Prozessorhandbuch) und komplettem Source
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat