null
Academic Über NI Veranstaltungen NI Developer Zone Support Lösungen Online Store Kontakt MyNI

Dokumententyp: Tutorium
Von NI unterstützt: Ja
Veröffentlichungsdatum: 17.06.2008


Feedback


Ja Nein

Ähnliche Kategorien

Thematisch verwandte Links - Developer Zone

Thematisch verwandte Links - Products and Services

Interrupt-gesteuerte Programmierung von ARM-Mikrocontrollern mit NI LabVIEW

null Sprache | Drucken

Übersicht

In diesem Tutorium werden die Interrupt-gesteuerte Programmierung sowie die notwendigen Schritte zum Interrupt-Handling mithilfe des NI LabVIEW Embedded Module for ARM Microcontrollers vorgestellt. Des Weiteren wird angesprochen, welche Dinge bezüglich der Verwendung von Interrupts in Anwendungen zu beachten sind. Voraussetzung für dieses Tutorium ist die Installation von LabVIEW 8.5 plus LabVIEW Embedded Module for ARM Microcontrollers sowie Kenntnisse in der Erstellung und Ausführung von ARM-Mikrocontroller-Anwendungen.

Einführung in Interrupts und Interrupt-Behandler

Ein Interrupt-gesteuertes System besteht aus zwei Komponenten: dem Interrupt und dem Interrupt-Behandler. Ein Interrupt ist ein Signal, das von der Hardware erzeugt wird, wenn ein Ereignis eintritt, welches zur sofortigen Unterbrechung des ausgeführten Programms führen sollte. Interrupt-Behandler (auch Unterbrechungsroutinen genannt) sind Codeabschnitte, die dann ausgeführt werden, wenn ein bestimmtes Interrupt-Ereignis eintritt. Sobald der Prozessor den Interrupt registriert hat, wird der gegenwärtige Ausführprozess angehalten und ein Kontextwechsel durchgeführt, bei dem der Zustand des aktuellen Prozesses gesichert wird. Anschließend wird der Interrupt-Behandler ausgeführt. Sobald der Interrupt-Behandler-Code vollständig ausgeführt wurde, übernimmt der Prozessor wieder die Ausführung des unterbrochenen Programms.

Interrupts können nützlich sein, wenn periodisch Daten gelesen bzw. geschrieben werden sollen. Beispielsweise für die Entwicklung eines digitalen Musikplayers. Das System soll aus drei Elementen bestehen: Eingängen (verschiedene analoge Drehknöpfe für die Anpassung der Lautstärke und Filter), einem Prozessor und einem Ausgang (D/A-Wandler). Das System würde wie folgt arbeiten. Der Prozessor liest die Werte der Drehknöpfe, überträgt eine Audiodatei per Streaming aus dem Speicher und setzt den Filteralgorithmus ein, um anschließend einen Wert auf den D/A-Wandler zu schreiben. Mithilfe eines Timer-Interrupts können die Werte der Drehknöpfe periodisch gelesen werden, um die Parameter des Filteralgorithmus festzulegen. Ein zweiter Timer-Interrupt kann dann zum periodischen Schreiben von Werten auf den D/A-Wandler eingesetzt werden. Der Prozessor wäre dann in der Lage, stetig Filteralgorithmen auf die Audiodatei anzuwenden und würde dabei nur zum Lesen und Schreiben von Registern unterbrochen werden.

Interrupt-Verwaltung

Interrupts für ARM-Anwendungen werden über die Build-Spezifikationen des LabVIEW-Projekts verwaltet. Über das Dialogfeld Eigenschaften der Build-Spezifikationen (Build Specifications Properties) haben Entwickler zwei Möglichkeiten zur Erstellung und Zuweisung von Interrupt-Behandlern: über ein VI oder eine zeitgesteuerte Schleife. Beide Methoden können innerhalb eines Projektes eingesetzt werden und erlauben die Behandlung mehrerer Hardware-Interrupts in einer Anwendung.

In den nachfolgenden Abschnitten werden beide Methoden − VIs und zeitgesteuerte Schleifen − zur Erstellung von Interrupt-Behandlern näher vorgestellt. Abbildung 1 zeigt die Projektansicht für ARM-Interrupts, in der ein ARM-Projekt mit einem Top-Level-VI und einer Build-Spezifikation zu sehen ist.

Abbildung 1: Projektansicht für ARM-Interrupts

Das Projekt umfasst ein einziges VI, das zur Erstellung der Hauptanwendung und zur Ausführung der Anwendung auf der ARM-Hardware MCB2300 eingesetzt wird. Die Anwendung gibt einen String an das Prozessorstatusfenster aus. Abbildung 2 zeigt das VI der ARM-Hauptanwendung mit dem Blockdiagramm. Das Blockdiagramm beinhaltet eine zeitgesteuerte Schleife, die einen String in das Fenster Prozessorstatus (Processor Status) ausgibt.

 

Abb. 2: VI der ARM-Hauptanwendung

 

VIs als Interrupt-Behandler

In den folgenden Schritten wird erläutert, wie ein neues VI erstellt wird, das als Interrupt-Behandler dienen soll.

1. Über einen Rechtsklick auf die ARM-Hardware im Projekt-Explorer kann die Funktion Neu » VI (New » VI) ausgewählt werden. Damit wird dem Projekt ein neues VI hinzugefügt. Dieses VI wird als Interrupt-Behandler eingesetzt. Das VI lässt sich im Datei-Menü (File) über die Funktion Speichern unter (Save as) speichern. In diesem Beispiel wird das VI in ISR1.vi umbenannt.

 

2.      Nun kann der Code für die Interrupt-Behandlung geschrieben werden. Öffnen Sie das Blockdiagramm des neu erstellten VIs und platzieren Sie das Console Output.vi aus der ARM-Palette (ARM Palette) darin. Erstellen Sie anschließend eine String-Konstante, die im Fenster Prozessorstatus (Processor Status) angezeigt wird. Dieses VI wird Strings an die Konsole ausgeben, die anzeigen, dass Code ausgeführt wurde. Wie Sie sehen, ist der Code nicht von einer Schleife umschlossen. Dadurch werden die Timer-Interrupts periodisch durchgeführt.

 

 

 

3.       Nachdem der Code für den Interrupt-Behandler vollständig ist, muss der Behandler einem Interrupt zugewiesen werden. Klicken Sie im Projekt-Explorer auf Build-Spezifikationen (Build Specifications) und wählen Sie anschließend über einen Rechtsklick auf die Anwendung (Application) die Option Eigenschaften (Properties) aus.


4.       Dies öffnet das Fenster Eigenschaften der Build-Spezifikationen (Build Specification Properties).

 

5.       Wählen Sie im Bereich Kategorie (Category) die Funktion Interrupts verwalten (Manage Interrupts). Die in diesem Beispiel eingesetzte Hardware verfügt über drei Timer-Interrupts. In dieser Demonstration wird Timer 1 verwendet. Wählen Sie aus der Interrupt-Liste Timer 1 aus und markieren Sie das Kontrollkästchen Interrupt verwenden (Use Interrupt).

 

 

6.       Markieren Sie anschließend im Bereich Interrupt-Behandler (Interrupt Handler) das Optionsfeld VI. Verwenden Sie den Pfeil, um das VI ISR1.vi als Interrupt-Behandler auszuwählen. Jedes VI im Projekt − mit Ausnahme von Top-Level-VIs − kann als Interrupt-Behandler eingesetzt werden

 

 

7.       In diesem Beispiel ist der Zustand des Interrupts während der Inbetriebnahme aktiviert (Enabled). Der Interrupt kann bei der Inbetriebnahme auch deaktiviert (Disabled) sein und programmatisch in der Anwendung aktiviert werden. Dieses Thema wird in diesem Tutorium an anderer Stelle näher erläutert. Zusätzlich kann die Interrupt-Frequenz von Timer 1 über die Schaltfläche Konfigurieren (Configure) und den anschließenden Dialog Timer-Konfiguration (Timer Configuration) eingestellt werden.

 

 

8.       Bestätigen Sie mit OK. Die Einstellung des Interrupt-Behandlers ist nun vollständig. Nun können Sie die Anwendung erstellen (Build) und ausführen (Run). Das Prozessorstatusfenster sollte der nachfolgenden Abbildung ähneln. Der Interrupt-Behandler wird periodisch aufgerufen, um die Ausführung der Hauptschleife zu unterbrechen und Strings in das Fenster Prozessorstatus (Processor Status) auszugeben.

 

 

Zeitgesteuerte Schleifen als Interrupt-Behandler

Alternativ zum VI ist es möglich, eine zeitgesteuerte Schleife als Interrupt-Behandler einzusetzen. Dieser Abschnitt beschreibt die notwendigen Schritte zur Erstellung einer zeitgesteuerten Schleife, die als Interrupt-Behandler eingesetzt wird. Abbildung 1 und 2 dienen auch in diesem Fall als Basis der Anwendung.

1.     Dem VI Main ARM Application.vi wird eine zeitgesteuerte Schleife als Interrupt-Behandler hinzugefügt.

Wählen Sie über die Funktionenpalette Programmierung » Strukturen » Zeitgesteuerte Strukturen (Programming » Structures » Timed Loop) die Zeitgesteuerte Schleife (Timed Loop) aus. Erstellen Sie im VI eine zweite zeitgesteuerte Schleife, die Strings in das Fenster Prozessorstatus (Processor Status) ausgibt.

 

 

2.     Die zeitgesteuerte Schleife muss so konfiguriert werden, dass sie auf eine externe Timing-Quelle reagiert. Über einen Rechtsklick auf den Eingangsknoten wählen Sie Eingangsknoten konfigurieren (Configure Input Node) aus. Wählen Sie Anschluss für Timing-Quelle verwenden (Use Timing Source Terminal).   


3.     Verwenden Sie nun aus der Funktionenpalette Programmierung » Zeitgesteuerte Schleife (Programming » Timed Loop) das VI Timing-Quelle erzeugen.vi (Create External Timing Source.vi). Benennen Sie die Timing-Quelle und verbinden Sie sie mit dem Eingangsknoten der zeitgesteuerten Schleife. Dies ist der Name der zeitgesteuerten Schleifenstruktur, die als Interrupt-Behandler eingesetzt wird.

 

4.       Wie bereits im Abschnitt VIs als Interrupt-Behandler beschrieben, öffnen Sie jetzt das Fenster Eigenschaften der Build-Spezifikationen (Build Specification Properties). Klicken Sie im Projekt-Explorer auf Build-Spezifikationen (Build Specifications) und wählen Sie anschließend über einen Rechtsklick auf die Anwendung (Application) die Option Eigenschaften (Properties) aus. Wählen Sie im Bereich Kategorie die Funktion Interrupts verwalten (Manage Interrupts). In diesem Beispiel wird Timer 2 eingesetzt. Wählen Sie aus der Interrupt-Liste Timer 2 aus und markieren Sie das Kontrollkästchen Interrupt verwenden (Use Interrupt).

 

 

5.       Markieren Sie anschließend im Bereich Interrupt-Behandler (Interrupt Handler) das Optionsfeld Zeitgesteuerte Schleife (Timed Loop).

 

6.      Geben Sie den Namen der zeitgesteuerten Schleife ein, „Interrupt-Behandler“ beispielsweise. Zusätzlich kann der Zustand während der Inbetriebnahme (Startup State) der Anwendung sowie die Interrupt-Frequenz konfiguriert werden.

 

 

 

7.       Bestätigen Sie mit OK. Die zeitgesteuerte Schleife ist nun als Interrupt-Behandler konfiguriert. Nun können Sie die Anwendung erstellen (Build) und ausführen (Run). Wieder wird der Interrupt-Behandler periodisch aufgerufen. Die zeitgesteuerte Schleife wird einmal pro Interrupt ausgeführt. Sobald die Schleife eine Iteration ausgeführt hat, wird die Steuerung der Anwendung wieder vom Prozessor übernommen.

 

 

Es gibt einen wichtigen Unterschied zwischen der Verwendung eines VIs und einer zeitgesteuerten Schleife als Interrupt-Behandler. Die zeitgesteuerte Schleife kann als Interrupt-Behandler von einem VI-basierten Interrupt-Behandler unterbrochen werden. Dies kann passieren, wenn ein System über zwei oder mehr Interrupt-Behandler verfügt. Wird eine zeitgesteuerte Schleife als Interrupt-Behandler ausgeführt und ein Interrupt tritt auf, der von einem VI-basierten Interrupt-Behandler verwaltet wird, dann wird die Ausführung der zeitgesteuerten Schleife unterbrochen.

Der Einsatz einer zeitgesteuerten Schleife als Interrupt-Behandler bietet Vorteile, wenn nur ein Interrupt in der Anwendung verwendet wird. Code kann vereinfacht werden, wenn sich die zeitgesteuerte Schleife als Hauptanwendungslogik im gleichen VI befindet.

Verwendung der Interrupt-VI-Palette

Zusätzlich zur Möglichkeit, Interrupt-Behandler zuzuweisen, bietet LabVIEW eine Funktion zur programmatischen Aktivierung und Deaktivierung von Interrupts über die nachfolgenden VIs, die auf der Palette ARM » Interrupts zu finden sind.

Die Funktion ARM-Interrupt aktivieren (ARM Interrupt Enable) wird zur Aktivierung eines deaktivierten Interrupts eingesetzt. Der Interrupt kann entweder programmatisch oder vor der Inbetriebnahme im Fenster Interrupts verwalten (Manager Interrupts) deaktiviert werden. Dieses VI agiert, wie durch die Interrupt-Anzahl festgelegt, nur für einen Interrupt. 

 

 

Die Funktion ARM-Interrupt deaktivieren (ARM Interrupt Disable) ermöglicht Programmierern das Deaktivieren eines Interrupts.

 

 

Die Funktion ARM-Global-Interrupt aktivieren (ARM Global Interrupt Enable) sorgt dafür, dass alle deaktivierten Interrupts aktiviert werden.

 

 

Die Funktion ARM-Global-Interrupt deaktivieren (ARM Global Interrupt Disable) sorgt für die Deaktivierung aller Interrupts im System. Diese Funktion ist nützlich, wenn zeitkritische Operationen durchgeführt werden, die unter keinen Umständen von externen Ereignissen unterbrochen werden sollen.

 

Designkriterien für die Verwendung von Interrupts in ARM-Anwendungen

Jeder Interrupt im System hat eine Prioriät, die nicht programmatisch zugewiesen werden kann. Bei der Hardware MCB2300 hat Timer 1 die höchste Priorität, gefolgt von Timer 2. Timer 3 hat die geringste Priorität der verfügbaren Interrupts. Finden zwei oder mehr Interrupts gleichzeitig statt, wird der Interrupt mit der höchsten Priorität durchgeführt. Ein Interrupt-Behandler kann nicht unterbrochen werden, mit Ausnahme des bereits beschriebenen Falls der zeitgesteuerten Schleife. Interrupts, die auftreten während ein Interrupt-Behandler ausgeführt wird, kommen in eine Warteschleife. Allerdings wird nur der letzte Interrupt jeder externen Timing-Quelle ausgeführt. Wird beispielsweise ein Interrupt-Behandler für Timer 1 ausgeführt und es treten gleichzeitig fünf Interrupts für Timer 2 auf, dann wird nur für den letzten Interrupt von Timer 2 ein Interrupt-Behandler ausgeführt, nachdem der Interrupt-Behandler für Timer 1 vollständig durchgeführt wurde.

Dieser potentielle Verlust von Interrupts ist ein wichtiger Aspekt bei der Erstellung von Anwendungen. Es gibt zwei gängige Methoden, die von Programmierern genutzt werden, um den Verlust von Interrupts so weit wie möglich zu reduzieren. Eine Methode ist die Reduzierung der Zeit, die ein Interrupt-Behandler zur Ausführung zur Verfügung hat. Ein Interrupt-Behandler sollte nur Variablen lesen oder beschreiben, während die Hauptanwendung die prozessorintensiven Berechnungen durchführt. Alternativ kann die Software so aufgebaut werden, dass nur ein einziger Interrupt verwendet wird und alle prozessorintensiven Berechnungen vom Interrupt-Behandler durchgeführt werden. Die Hauptanwendung wartet dann einfach darauf, dass Interrupts erzeugt werden. Diese Architektur kann eingesetzt werden, wenn die gewünschten Funktionen bei jedem Interrupt periodisch Daten bearbeiten sollen. Bei dieser Architektur muss der Programmierer sicherstellen, dass der Interrupt-Behandler weniger Zeit zur Ausführung benötigt als der Interrupt andauert, so dass gewährleistet wird, dass keine Interrupts verloren gehen.

 

 

null Sprache | Drucken

AGB
Dieses Tutorium ("Tutorium") wurde von National Instruments ("NI") entwickelt. Auch wenn National Instruments dieses Tutorium technisch unterstützt, ist es jedoch möglich, dass dieses Tutorium nicht umfassend getestet und überprüft wurde. NI übernimmt weder Garantien bezüglich der Qualität des Tutoriums noch bezüglich der weiteren technischen Unterstützung neuer Versionen ähnlicher Produkte und Treiber. DIESES TUTORIUM WIRD IM "IST-ZUSTAND" ZUR VERFÜGUNG GESTELLT UND NI ÜBERNIMMT KEINERLEI GARANTIEN. AUSFÜHRLICHERE ERLÄUTERUNGEN ZU ANDEREN EINSCHRÄNKUNGEN ENTNEHMEN SIE BITTE DEN NUTZUNGSBEDINGUNGEN AUF NI.COM (http://ni.com/legal/termsofuse/unitedstates/us/).