Franz Pucher / TINF

You are viewing an older revision! See the latest version

Beschreibung

Table of Contents

  1. Polling

Inhalt

Polling

Beim Polling fragt man Signale regelmäßig innerhalb der while-Schleife ab und wertet diese Signale aus. Polling bezeichnet in der Informatik die Methode, den Status eines Geräts aus Hard- oder Software oder das Ereignis einer Wertänderung mittels zyklischem Abfragen zu ermitteln. Polling eignet sich in der Praxis nur für spezielle Anwendungsfälle, wie z.B. das Abfragen eines Tasters:

DigitalIn  taste(P0_10);

int main() {
    int zeit = 200;
    while(1)
    {
        led1 = 0;
        wait_ms(zeit);
        led1 = 1;
        wait_ms(zeit);
        if(taste) {
		   zeit = 500;
	   }
    }
}

Ein großer Nachteil beim Polling ist allerdings, dass auf Signale nicht sofort reagiert werden kann, sondern erst mit einer Verzögerung. So kann es im schlechtesten Fall passieren, dass man ein Signal gerade abgefragt hat und kurz nach dieser Abfrage das externe Signal am entsprechenden Pott anliegt. In dieser Situation kann es relativ lange dauern, bis der Port wieder abgefragt wird, je nach dem wie lange die Verarbeitung der Befehle in der while-Schleife dauert. Bei kritischen Signalen, beispielsweise einer kritischen Fehlersituation, bei der sofort reagiert werden muss, kann das untragbar sein.

Man bedenke z.B. die vielen verschwendeten Takte die benötigt würden, um ständig zu testen, ob die Maus bewegt oder eine Taste gedrückt wurde.

In diesen Fällen soll wirklich nur dann etwas unternommen werden, wenn ein Ereignis eingetreten ist. Tritt ein Ereignis auf, wird die reguläre Arbeit der CPU kurzzeitig unterbrochen; es wird ein Interrupt ausgelöst.

Vor-/Nachteile

Polling eignet sich in der Praxis nur für spezielle Anwendungsfälle

Gut:

  • sehr geringe Latenzzeit (Reaktionszeit) bei wenigen zu testenden Ereignisquellen

Schlecht:

  • um den Vorzug auszuschöpfen, muss der Prozessor permanent die Ereignisquellen abprüfen und ist damit voll ausgelastet
  • Reaktionszeit steigt mit steigender Anzahl an Ereignisquellen

Bei Interrupts wird sofort reagiert. Wenn ein Interrupt-Signal auftritt, wird der aktuelle Befehl des Hauptprogramms beendet, die nötigen Register auf den Stack gerettet und dann anschließend sofort die ISR (Interrupt Service Routine) aufgerufen.

/media/uploads/fpucher/interrupt.gif

Technische Realisierung der Interrupts

  • der Prozessor besitzt einen oder mehrere spezielle Interrupt Eingänge
  • wird eine Interruptleitung aktiviert, so führt dies zum Auslösen der zugehörigen Programmunterbrechung
  • "richtige" Rechner verwenden oft sog. Interruptcontroller, welche verschiedene Interruptquellen managen

Z.B. die Tastenabfrage mittels ISR; Statt DigitalIn wird mit InterruptIn der Taster definiert. Die ISR wird wie eine Funktion ohne Parameter und Rückgabewert (void change()) definiert. Zum Datenaustausch wird eine globale Variable (toggle) verwendet:

InterruptIn button(p14);
DigitalOut led(LED1, 0);
DigitalOut flash(LED4);
 
void flip() {
    led = !led;
}
 
int main() {
    button.rise(&flip);  // attach the address of the flip function to the rising edge
    while(1) {           // wait around, interrupts will interrupt this!
        flash = !flash;
        wait(0.25);
    }
}

Auf dem M3-Application Board wird der Joy-Stick für den button verwendet, der folgendermaßen die Pins definiert:

  • Down:p12
  • Left:p13
  • Centre:p14
  • Up:p15
  • Right:p16

ACHTUNG

  1. In der ISR sollten keine wait-Funktionen, Endlosschleifen oder blockierende System Calls verwendet werden.
  2. No printf, malloc, or new in ISR
    Keine Bibliotheksfunktionen, die nicht re-entrant sind.

Aufgaben


All wikipages