Aufbau eines homogen redundanten Rechnersystems und
Transcrição
Aufbau eines homogen redundanten Rechnersystems und
Bachelorthesis Aufbau eines homogen redundanten Rechnersystems und Untersuchung des Ausfallverhaltens unter Umgebungseinflüssen Hochschule Bonn-Rhein-Sieg Fachbereich Informatik Studiengang: Bachelor of Computer Science / Embedded Systems Grantham-Allee 20 53757 Sankt Augustin Vorgelegt von: Maxim Küpper Erstprüfer: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prof. Dr. Dietmar Reinert Zweitprüfer: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dr. Michael Schaefer Eingereicht am: 15. April 2009 Eidesstattliche Erklärung Ich versichere an Eides statt, die von mir vorgelegte Arbeit selbstständig verfasst zu haben. Alle Stellen, die wörtlich oder sinngemäß aus veröffentlichten oder nicht veröffentlichten Arbeiten anderer entnommen sind, habe ich als entnommen kenntlich gemacht. Sämtliche Quellen und Hilfsmittel, die ich für die Arbeit benutzt habe, sind angegeben. Die Arbeit hat mit gleichem Inhalt bzw. in wesentlichen Teilen noch keiner anderen Prüfungsbehörde vorgelegen. (Datum, Ort, Unterschrift) Danksagung An dieser Stelle möchte ich mich bei meinen beiden Prüfern, Prof. Dr. Dietmar Reinert und Dr. Schaefer, für die Ermöglichung und die hilfreiche Unterstützung bei der Erstellung meiner Bachelor-Thesis bedanken. Ohne sie wäre diese Arbeit nicht möglich gewesen. Weiterhin danke ich auch den Mitarbeitern des BGIA in Sankt Augustin. Hervorzuheben sind hierbei Herr K.-H. Büllesbach, Herr W. Grommez, Herr A. Lungfiel und Herr T. Seifen, die mir mit Rat und Tat zur Seite standen. Zum Schluss möchte ich mich noch bei meiner Familie und meinen Freunden für ihre Unterstützung und ihr Verständnis bedanken. Inhaltsverzeichnis Seite IV Inhaltsverzeichnis Inhaltsverzeichnis IV Abbildungsverzeichnis VII Abkürzungsverzeichnis IX Quellcodeverzeichnis XI 1 Einleitung 1.1 Thema und Ziele der Arbeit . . . . . . 1.2 Motivation . . . . . . . . . . . . . . . . 1.3 Lösungsansatz . . . . . . . . . . . . . . 1.4 Eingesetzte Techniken für mehrkanalige . . . . . . . . . . . . . . . . . . . . . Strukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 2 Anforderungen an sicherheitsgerichtete Maschinensteuerungen 2.1 Performance Level . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Schwere der Verletzung . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Häufigkeit und/oder Dauer der Gefährdungsexposition . . . . 2.1.3 Möglichkeit zur Gefahrenabwendung oder Begrenzung des Schadens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Kategorien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Kategorie B . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.2 Kategorie 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.3 Kategorie 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4 Kategorie 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5 Kategorie 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Mittlere Zeit bis zum gefahrbringenden Ausfall . . . . . . . . . . . . . 2.4 Diagnosedeckungsgrad . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Fehler infolge gemeinsamer Ursache . . . . . . . . . . . . . . . . . . . 6 7 7 8 9 10 11 11 12 12 3 Technische Realisierung 3.1 AVR Butterfly . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Atmel ATMega169P . . . . . . . . . . . . . . . . . . . 3.1.2 Peripherie . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 AVR Butterfly Carrier . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Universal Asynchronous Receiver Transmitter (UART) 3.2.2 In-System-Programmer (ISP) . . . . . . . . . . . . . . 3.2.3 Joint Test Action Group - Port (JTAG) . . . . . . . . 3.3 Versuchsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Revision 1 . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2 Revision 2 . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Revision 3 . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 15 16 16 17 19 19 20 21 22 23 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 6 6 Inhaltsverzeichnis 4 Entwickelte Software 4.1 Anforderungen . . . . . . . . . . 4.2 Grundlagen . . . . . . . . . . . . 4.3 Struktur . . . . . . . . . . . . . . 4.4 Konfigurationsmöglichkeiten . . . 4.5 Fehlerbeherrschende Maßnahmen 4.5.1 Synchronisation . . . . . . 4.5.2 Fehlerroutinen . . . . . . . 4.5.3 Watchdog . . . . . . . . . Seite V . . . . . . . . . . . . . . . . . . . . . . . . 5 Selbsttests 5.1 CPU-Tests . . . . . . . . . . . . . . . . 5.1.1 Arithmetische Tests . . . . . . . 5.1.2 Registertests . . . . . . . . . . . 5.1.3 Push-Pop-Return-Jump-Test . . 5.1.4 Test der logischen Operationen 5.1.5 Tests der Bit-Operationen . . . 5.1.6 Test der Transfer-Befehle . . . . 5.2 Peripherie Tests . . . . . . . . . . . . . 5.2.1 Watchdog . . . . . . . . . . . . 5.2.2 Tests der integrierten Timer . . 5.2.3 RAM-Test . . . . . . . . . . . . 5.2.4 ROM-Test . . . . . . . . . . . . 5.2.5 Ports als Ein- und Ausgänge . . 5.3 Bibliothek der Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Beobachtung des Verhaltens unter Umgebungsbedingungen 6.1 Ausgangssituation . . . . . . . . . . . . . . . . . . . . . . . 6.2 Elektromagnetische Verträglichkeit . . . . . . . . . . . . . 6.2.1 Kapazitive Kopplung . . . . . . . . . . . . . . . . . 6.2.2 Elektrostatische Entladung . . . . . . . . . . . . . . 6.2.3 Unterbrechung der Versorgungsspannung . . . . . . 6.2.4 Austastung der Versorgungsspannung . . . . . . . . 6.2.5 Analyse der EMV-Untersuchungen . . . . . . . . . 6.3 Temperaturbeständigkeit . . . . . . . . . . . . . . . . . . . 6.3.1 Positiver Temperaturbereich . . . . . . . . . . . . . 6.3.2 Negativer Temperaturbereich . . . . . . . . . . . . 6.3.3 Analyse der Temperaturmessungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 24 25 27 30 30 32 34 . . . . . . . . . . . . . . 36 37 37 40 41 43 44 45 45 46 48 49 51 53 54 . . . . . . . . . . . 58 58 59 59 63 64 65 66 67 68 69 69 7 Zusammenfassung 71 7.1 Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 7.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Literaturverzeichnis 73 A Quellcode A.1 Quellcode Main-App.c . . . . . . . . . . . . . . . . . . . . . . . . . . A.2 Quellcode Main-App.h . . . . . . . . . . . . . . . . . . . . . . . . . . A.3 Quellcode TestLib.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 75 91 93 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Inhaltsverzeichnis Seite VI A.4 Quellcode TestLib.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 B Tabelle der Anforderung für Kategorien 106 C Schaltplan 108 D CD-ROM mit Inhalten der Bachelor-Thesis 109 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Abbildungsverzeichnis Seite VII Abbildungsverzeichnis 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Ausfallwahrscheinlichkeit nach Performance Level . . . . Risikograph zur Bestimmung des PLr . . . . . . . . . . . Säulendiagramm zur vereinfachten Bestimmung des PL . Architektur eines Kategorie B bzw. Kategorie 1-Systems Architektur eines Kategorie 2-Systems . . . . . . . . . . Architektur eines Kategorie 3-Systems . . . . . . . . . . Architektur eines Kategorie 4-Systems . . . . . . . . . . Zuordnung des MTTFd zu Betriebsjahren . . . . . . . . . Übersicht des Diagnosedeckungsgrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 7 8 9 10 11 12 13 3.1 3.2 3.3 3.4 3.5 3.6 3.7 Butterfly . . . . . . . . . . . . . . . . . . . . . AVR Butterfly Carrier . . . . . . . . . . . . . Datenübertragung mittels EIA-232 . . . . . . Mögliche Übertragungsfehler von Bussystemen Revision 1 des Versuchsaufbau . . . . . . . . . Revision 2 des Versuchsaufbau . . . . . . . . . Revision 3 des Versuchsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 17 18 18 22 22 23 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Struktur der Initialisierung und der Betriebsbereitschaft Struktur der Hauptroutine . . . . . . . . . . . . . . . . . Tabelle der Laufzeitanzeige . . . . . . . . . . . . . . . . . Tabelle der Betriebsmodi . . . . . . . . . . . . . . . . . . Struktur der Synchronisationsroutine . . . . . . . . . . . Tabelle der Fehlercodes . . . . . . . . . . . . . . . . . . . Struktur der Fehlerroutinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 26 26 27 30 34 34 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 Programmablauf des Tests für die Addition . . . . . . . . . Programmablauf des ADDC-Tests . . . . . . . . . . . . . . Programmablauf der Registertests . . . . . . . . . . . . . . Abschnitt 1 des PPRJ-Test: PUSH-Test . . . . . . . . . . Abschnitt 2 des PPRJ-Test: POP-Test . . . . . . . . . . . Abschnitt 3 des PPRJ-Test: RETURN und JUMP-Test . . Programmablauf des Test der logischen AND-Verknüpfung Test des Befehls für das indirekte Laden von Registern . . Test der Timer auf korrekte Funktionsweise . . . . . . . . Struktur des ROM-Tests. . . . . . . . . . . . . . . . . . . . Struktur der Test-Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 39 40 41 42 43 44 46 49 52 55 6.1 6.2 6.3 6.4 6.5 Prinzip des Interferenzen-Problems . . . . . . . . Positiver Impuls (rot) und Impulsfolge (blau) . . Störung der Übertragung durch gekipptes Bit . . Versuchsaufbau 1b - serielle Schnittstelle zu GND Sichtbare ESD-Entladung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 60 61 62 63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik . . . . . Abbildungsverzeichnis Seite VIII 6.6 Versuchsaufbau: Spannungsunterbrechung . . . . . . . . . . . . 6.7 Zeitlicher Verlauf der Spannung . . . . . . . . . . . . . . . . . . 6.8 Schematischer Temperaturverlauf, positiver Temperaturbereich . 6.9 Schematischer Temperaturverlauf, negativer Temperaturbereich . . . . . . . . . . . . 65 66 68 69 B.1 Tabelle der Anforderung für Kategorien . . . . . . . . . . . . . . . . . 107 C.1 Schaltplan eines Kanals . . . . . . . . . . . . . . . . . . . . . . . . . . 108 D.1 Ordnerstruktur der CD-ROM . . . . . . . . . . . . . . . . . . . . . . 109 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Abkürzungsverzeichnis Seite IX Abkürzungsverzeichnis µC . . . . . . . . . . . . . . . . . . Mikrocontroller ADC . . . . . . . . . . . . . . . Analog/Digital - Converter Analog/Digital - Wandler AVR . . . . . . . . . . . . . . . . Bezeichnung einer µC-Familie von ATMEL CCF . . . . . . . . . . . . . . . . Common Cause Failure Ausfälle infolge gemeinsamer Ursachen CRC . . . . . . . . . . . . . . . . Cyclic Redundancy Check Zyklische Redundanzprüfung DC . . . . . . . . . . . . . . . . . Diagnostic Coverage Diagnosedeckungsgrad DCavg . . . . . . . . . . . . . . Average Diagnostic Coverage Durchschnittlicher Diagnosedeckungsgrad EEPROM . . . . . . . . . . Electrically Erasable Programmable Read Only Memory Nicht flüchtiger, elektronischer Speicher ELF . . . . . . . . . . . . . . . . Executable and linkable format Dateiformat für µC-Programmierung EM . . . . . . . . . . . . . . . . . Elektromagnetisch EMV . . . . . . . . . . . . . . . Elektromagnetische Verträglichkeit ESD . . . . . . . . . . . . . . . . Elektostatic Discharge Elektrostatische Entladung I/O . . . . . . . . . . . . . . . . . Input / Output ICE . . . . . . . . . . . . . . . . In-Circuit-Emulator ISP . . . . . . . . . . . . . . . . . In-System-Programmer, auch In-System-Programming JTAG . . . . . . . . . . . . . . Joint Test Action Group LCD . . . . . . . . . . . . . . . . Liquid Crystal Display Flüssigkristall Display MTTFd . . . . . . . . . . . . . Mean Time to Dangerous Failure Mittlere Zeit bis zu einem gefahrbringenden Ausfall PAP . . . . . . . . . . . . . . . . Programmablaufplan PCB . . . . . . . . . . . . . . . . Printed Circuit Board Elektronische Leiterplatte PFH . . . . . . . . . . . . . . . . Probability of Dangerous Failure per Hour Wahrscheinlichkeit eines gefährlichen Ausfalls pro Stunde PL . . . . . . . . . . . . . . . . . Performance-Level PLr . . . . . . . . . . . . . . . . . Performance Level required Benötigtes Performance Level RAM . . . . . . . . . . . . . . . Random Access Memory Speicher mit wahlfreiem Zugriff RISC . . . . . . . . . . . . . . . Reduced Instruction Set Computing Rechnen mit reduziertem Befehlssatz ROM . . . . . . . . . . . . . . . Read only Memory Nur-Lese-Festwertspeicher Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Abkürzungsverzeichnis SRP/CS . . . . . . . . . . . . Safety-Related Parts of Control System Sicherheitsbezogene Teile einer Steuerung UART . . . . . . . . . . . . . . Universal Asynchronous Receiver Transmitter USB . . . . . . . . . . . . . . . . Universal Serial Bus USI . . . . . . . . . . . . . . . . . Universal Serial Interface Universelle Serielle Schnittstelle V . . . . . . . . . . . . . . . . . . . Volt Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite X Quellcodeverzeichnis Seite XI Quellcodeverzeichnis 4.1 4.2 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 Konfigurationsmöglichkeiten der Software . . . . Synchronisationsroutine . . . . . . . . . . . . . Selbsttest der Addition . . . . . . . . . . . . . . Selbsttest der bitweisen Verschiebung nach links Watchdog-Prüfroutine am Programmbeginn . . Watchdog-Test . . . . . . . . . . . . . . . . . . RAM-Test . . . . . . . . . . . . . . . . . . . . . Porttest . . . . . . . . . . . . . . . . . . . . . . Beispiel: Aufruf der Selbsttests . . . . . . . . . . Beispielhafte Implementierung der testError() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 32 38 45 47 48 50 53 55 57 1 Einleitung Seite 1 1 Einleitung 1.1 Thema und Ziele der Arbeit Gemäß der Norm DIN EN ISO 13849-1, die sich mit sicherheitsbezogenen Teilen von Maschinensteuerungen befasst, müssen diese Teile einer Steuerung mit Maßnahmen gegen Ausfälle infolge gemeinsamer Ursachen ausgestattet sein. Die Anforderungen an diese Maßnahmen sehen vor, dass ein System möglichst diversitär aufzubauen ist, um solche Ausfälle zu verhindern. Ob ein homogen redundantes System ein höheres Risiko darstellt, da es gegen die Art dieser Ausfälle nicht ausreichend geschützt ist, soll mit dieser Arbeit geklärt werden. Dazu befasst sich diese Bachelorthesis mit dem Titel Aufbau eines homogen ” redundanten Rechnersystems und Untersuchung des Ausfallverhaltens unter Umgebungseinflüssen“ mit der Erstellung eines homogen redundanten Rechnersystems, ähnlich wie sie in Maschinensteuerungen in der Industrie verwendet werden. Im Zuge dieser Arbeit wird ein System aus zwei Kanälen aufgebaut. Beide Kanäle bestehen aus identischer Hardware und werden mit derselben Software betrieben. In Anlehnung an die Anforderungen an SRP/CS durch die Norm werden wichtige Maßnahmen zur Fehlererkennung und deren Beherrschung implementiert, damit das System bei auftretenden Fehlern in den sicheren Zustand überführt wird. Trotz dieser Mechanismen wird das System keine vollwertige Struktur einer Kategorie darstellen, sondern lediglich die grundlegenden Elemente aufweisen, die benötigt werden, um die geplanten Untersuchungen durchzuführen. Um eine Aussage über das Verhalten der Kanäle treffen zu können, werden diese verschiedenen Umgebungseinflüssen ausgesetzt und das Ausfallverhalten des kompletten Rechnersystems beobachtet. Im Speziellen soll geprüft werden, ob das System aufgrund gemeinsamer Schwachpunkte in einen unsicheren Zustand gerät. Die während der Entwicklung implementierten Selbsttests sollen zu einer Bibliothek zusammengefasst werden. Diese soll über Methoden und Parameter auf den benötigten Leistungsumfang anpassbar sein, um anderen Projekten zur Verfügung gestellt zu werden. Voraussetzung ist, dass diese Projekte als technische Grundlage einen ATMEL AVR-Mikrocontroller einsetzen, der über den gleichen Befehlssatz verfügt wie ein ATMega169P. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 1.2 Motivation Seite 2 1.2 Motivation Viele Steuereinheiten in Maschinen mit hohem Gefährdungspotential sind homogen redundant aufgebaut. Dadurch besteht die Gefahr, dass alle Kanäle dieser Steuerung zur selben Zeit ausfallen und das gesamte Steuerungssystem einen unsicheren Zustand hervorruft. Ob ein System mit homogen redundanter Struktur allerdings eine höhere Ausfallwahrscheinlichkeit hat, ist nicht hinreichend geklärt. Diese Arbeit wird versuchen eine Antwort auf diese Frage zu finden. Der Nachteil von Diversität ist der höhere Aufwand bei der Entwicklung, Erstellung und Wartung des Systems, wodurch höhere Kosten entstehen. Bietet ein homogenes System jedoch die gleichen Sicherheitseigenschaften wie ein diversitäres System, sind diese Mühen unnötig und können eingespart werden. 1.3 Lösungsansatz Um das Ziel der Arbeit zu erreichen, wird ein exemplarisches Testsystem aufgebaut dessen Verhalten unter verschiedenen Einflüssen untersucht wird. Es soll durch zwei Mikrocontroller (µC) realisiert werden, die in ein System eingebettet und miteinander verbunden sind, um sich so zur Laufzeit synchronisieren zu können. Zur Demonstration des Programmablaufs wird eine Applikation erstellt, die zu jeder Zeit einen Status hat, der über eine visuelle Ausgabe ausgegeben wird. Um die sicherheitsrelevanten Anforderungen zu erfüllen, wird eine Fehlererkennung sowie Maßnahmen zur Fehlerbeherrschung implementiert. Dadurch soll erreicht werden, dass das System bei unplanmäßigem Programmablauf und Fehlern in den sicheren Zustand überführt wird. In Untersuchungen unter verschiedenen Umgebungsvariablen wird anschließend das Verhalten des Systems beobachtet. Konkret wird die Eignung eines homogen redundanten Systems zur Erfüllung der Anforderung nach der Norm DIN EN ISO 13849-1 geprüft. Diese Untersuchungen sollen Aufschluss darüber geben, ob es möglich ist, beide Kanäle systematisch auszuhebeln und so das Rechnersystem in den unsicheren Zustand zu bringen. Tritt dieser Fall ein, ist gezeigt, dass homogene Redundanz nicht geeignet ist, um Maßnahmen gegen Ausfälle infolge gemeinsamer Ursache zu realisieren. 1.4 Eingesetzte Techniken für mehrkanalige Strukturen Neben nicht elektronischen, pneumatischen oder mechanischen Sicherheitsvorkehrungen gibt es auch sicherheitsrelevante Teile einer Steuerung auf elektronischer Basis. Mehrkanalige Strukturen können dabei homogen oder diversitär realisiert werden. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 1.4 Eingesetzte Techniken für mehrkanalige Strukturen Seite 3 Homogene Redundanz Strukturen mit homogener Redundanz basieren auf den gleichen technischen Grundlagen. So sind gleiche Bauteile verbaut, die in der Theorie die gleichen Schwachpunkte haben. Durch die Verwendungen derselben Software sind alle Kanäle mit den selben systematischen Softwarefehlern behaftet. Diversitäre Redundanz Diversitäre Redundanz basiert hingegen darauf, Systeme mit unterschiedlichen technischen Grundlagen aufzubauen. Theoretisch ist dadurch die Wahrscheinlichkeit eines Ausfalls infolge gemeinsamer Ursache deutlich geringer, da sowohl die Hardware als auch die betreibende Software nicht gleich sind. Das führt dazu, dass durch äußere Einflüsse ein unterschiedliches Ausfallverhalten für jeden Kanal entsteht. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2 Anforderungen an sicherheitsgerichtete Maschinensteuerungen Seite 4 2 Anforderungen an sicherheitsgerichtete Maschinensteuerungen 2.1 Performance Level Von vielen industriellen Maschinen gehen aufgrund ihrer Aufgabe, ihrer Beschaffenheit oder ihrer Handhabung Gefährdungen für die Menschen in näherer Umgebung aus. Um diese Gefährdungen zu reduzieren, sind verschiedene Sicherheitsvorkehrungen zu treffen. Diese Vorkehrungen können nicht immer durch konstruktive Maßnahmen getroffen werden, wodurch die Notwendigkeit von sicheren Steuerungen der Maschinen entsteht. Da sich die Gefährdungen je nach Beschaffenheit und Einsatzzweck unterscheiden - zumal von einer Maschine meistens mehr als eine Gefährdung ausgeht - ist es notwendig, diese Gefährdungen einschätzen und bewerten zu können, um somit ökonomisch angemessene Vorkehrungen zu treffen. Abbildung 2.1: Ausfallwahrscheinlichkeit nach Performance Level [BGIA08, S. 37] Dazu werden nach der Norm DIN EN ISO 13849-1 die von einer Maschine ausgehenden Gefährdungen identifiziert. Anschließend wird jeder Gefährdung eine Sicherheitsfunktion, mit dem Ziel die Gefährdung zu reduzieren, zugeordnet. Zu jeder notwendigen Sicherheitsfunktion muss ein sicherheitsbezogenes Teil der Steuerung (Safety-Related Parts of Control System, SRP/CS) erstellt werden, das diese Funk- Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.1 Performance Level Seite 5 tion ausführen soll. Der Performance Level (PL) dieses SRP/CS orientiert sich am geforderten Performance Level (Performance Level required, PLr ), der durch die Gefährdung vorgegeben wird. Um die Anforderungen der DIN EN ISO 13849-1 zu erfüllen, muss das SRP/CS den PLr erreichen. Der Performance Level beschreibt die Wahrscheinlichkeit eines gefahrbringenden Ausfalls des Systems mit Verlust der Sicherheitsfunktion. Die Zuordnung der Wahrscheinlichkeit eines gefährlichen Ausfalls pro Stunde (PFH) zu einem der fünf PL (a bis e) ist der Abbildung 2.1 zu entnehmen. Der geforderte Performance Level kann beispielsweise mittels des Risikographen nach DIN EN ISO 13849-1 - Abbildung 2.2 - bestimmt werden. Dafür wird der Graph anhand von drei Risikoparametern durchlaufen, die als Entscheidungskriterien für die Einstufung der Gefährdung dienen. Folgende Parameter werden in Betracht gezogen: • S - Schwere der Verletzung • F - Häufigkeit und/oder Dauer der Gefährdungsexposition • P - Möglichkeit zur Gefahrenabwendung oder Begrenzung des Schadens Abbildung 2.2: Risikograph zur Bestimmung des PLr [BGIA08, S. 30] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.1 Performance Level Seite 6 2.1.1 Schwere der Verletzung Die Schwere der Verletzung wird dabei in zwei Kategorien unterteilt: • S1 - leichte, überlicherweise reversible Verletzungen • S2 - schwere, nicht reversible Verletzungen einschließlich Tod Zu beachten ist, dass vom Worst-Case ausgegangen werden muss. Nicht jeder Fehler einer gefahrbringenden Maschine führt zu einer tödlichen Verletzung, es genügt jedoch, dass allein die Möglichkeit besteht, eine derart ernste Verletzung herbei zu führen. 2.1.2 Häufigkeit und/oder Dauer der Gefährdungsexposition Ebenso wird die Häufigkeit und/oder die Dauer der Gefährundgsexposition in zwei Kategorien unterteilt: • F1 - selten bis weniger häufig und/oder die Dauer der Gefährdungsexposition ist kurz • F2 - häufig bis dauernd und/oder die Dauer der Gefährdungsexposition ist lang Wichtig hierbei ist nicht zu unterscheiden, welche Person, sondern wie oft und wie lange Personen der Gefahr ausgesetzt sind. Eine genaue Klassifizierung der Häufigkeit oder der Dauer wird in der Norm nicht genannt. Eine Anmerkung besagt aber, dass F2 gewählt werden soll, wenn die Frequenz der Gefährdungsexposition größer als einmal pro Stunde ist und keine anderen Festlegungen getroffen wurden. 2.1.3 Möglichkeit zur Gefahrenabwendung oder Begrenzung des Schadens Die Möglichkeit zur Gefahrenabwendung beschreibt, ob der Bediener einer Maschine eine Verletzung noch abwenden kann, wenn er feststellt, dass die Maschine sich nicht wie vorgesehen verhält. Die zwei Möglichkeiten sind: • P1 - möglich unter bestimmten Bedingungen • P2 - kaum möglich Dabei ist zu beachten, ob ein Bediener auf eine auftretende Gefahr überhaupt reagieren kann und wenn ja, welche Chance er hat, diese Gefahr abzuwenden. Auch die physikalischen Eigenschaften des Systems müssen in diese Bewertung einfließen. [BGIA08, S. 26ff] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.2 Kategorien Seite 7 Der von den sicherheitsbezogenen Teilen einer Steuerung erreichte Performance Level wird durch die erzielte Kategorie, der mittleren Zeit bis zum gefahrbringenden Ausfall der verwendeten Bauteile (MTTFd , vgl. Abschnitt 2.3, S. 11), dem Diagnosedeckungsgrad der Tests (DC, vgl. Abschnitt 2.4, S. 12) und den Maßnahmen gegen Ausfälle infolge gemeinsamer Ursache (CCF, vgl. Abschnitt 2.5, S. 12) bestimmt. Abbildung 2.3 zeigt die vereinfachte Methode der Norm, um den Performance Level aus der Kategorie, dem durchschnittlichen Diagnosedeckungsgrad (DCavg , vgl. Abschnitt 2.4, S. 12) und der MTTFd zu ermitteln. Abbildung 2.3: Säulendiagramm zur vereinfachten Bestimmung des PL [BGIA08, S. 56] 2.2 Kategorien Die Kategorien beschreiben nach DIN EN ISO 13849-1 den strukturellen Aufbau und Aspekte der Zuverlässigkeit von SRP/CS. Zusammen mit den anderen, sicherheitsrelevanten Parametern - MTTFd , DCavg und Maßnahmen gegen CCF - sind sie daher ein geeignetes Maß, um die Widerstandsfähigkeit von Steuerungen gegenüber Fehlern zu beschreiben. 2.2.1 Kategorie B Diese Kategorie dient als Grundlage für alle Kategorien. Sie setzt voraus, dass die SRP/CS unter Verwendung von grundlegenden Sicherheitsprinzipien entwickelt werden. Weiterhin müssen alle Bauteile den zu erwartenden Belastungen standhalten können, d.h. im Speziellen den Betriebsbeanspruchungen sowie dem Einfluss von Materialien, die im Arbeitsprozess verwendeten werden. Da ein Kategorie B-System Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.2 Kategorien Seite 8 nicht kontrolliert ob die Sicherheitsfunktion ausgeführt wird und auch nicht mehrkanalig aufgebaut ist, kann es im Falle eines Fehlers zum unbemerkten Ausfall der Sicherheitsfunktion kommen. Die Anforderungen an die MTTFd sind niedrig bis mittel (vgl. Anhang B). Alle höheren Kategorien setzen nach DIN EN ISO 13849-1 die Anforderungen der Kategorie B voraus und erweitern diese um strengere Anforderungen. Abbildung 2.4 zeigt die allgemeine Architektur nach der Kategorie B. Diese muss nicht zwangsläufig für die Realisierung einer SRP/CS genutzt werden, eine Abweichung muss jedoch hinreichend begründet werden. Der maximale Performance Level, der mit einem Kategorie B-System erreicht werden kann, ist PL = b (vgl. Abbildung 2.3). Abbildung 2.4: Architektur eines Kategorie B bzw. Kategorie 1-Systems [BGIA08, S. 48] 2.2.2 Kategorie 1 Anders als bei Kategorie B, die keine hohe Zuverlässigkeit von den verwendeten Bauteilen verlangt, fordert Kategorie 1 bewährte Bauteile. Ein Bauteil gilt als bewährt, wenn es in der Vergangenheit für ähnliche Anwendungen mit Erfolg eingesetzt wurde oder unter Anwendung von Prinzipien hergestellt und verifiziert wurde, die seine Eignung und Zuverlässigkeit für sicherheitsbezogene Anwendungen zeigen. Die SRP/CS muss über eine hohe MTTFd verfügen (vgl. Anhang B). Weiterhin müssen alle Anforderungen der Kategorie B erfüllt werden, wie beispielsweise die Entwicklung unter Verwendung von grundlegenden Sicherheitsprinzipien. Die allgemeine Architektur entspricht der von Kategorie B, die in Abbildung 2.4 dargestellt ist. Kategorie 1 stellt keine Anforderungen an DCavg oder CCF, da es sich, wie bei Kategorie B, um einkanalige Strukturen handelt. Daher kann auch das Auftreten eines Fehlers zum Verlust der Sicherheitsfunktion führen. Trotzdem muss die Wahrscheinlichkeit eines Ausfalls kleiner sein als bei einem System der Kategorie B. Anmerkung 1 der Norm zur Kategorie 1 besagt, dass komplexe elektronische Bauteile nicht als bewährte Bauteile gesehen und daher in Systemen der Kategorie 1 nicht eingesetzt werden können. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.2 Kategorien Seite 9 Mit einem Kategorie 1-System kann ein maximaler Performance Level von PL = c erreicht werden (vgl. Abbildung 2.3). 2.2.3 Kategorie 2 Ab Kategorie 2 wird eine Testung der Sicherheitsfunktion vorausgesetzt. So müssen SRP/CS dieser Kategorie, nach DIN EN ISO 13849-1, in angemessenen Zeitabständen durch die Maschinensteuerung auf korrekte Arbeitsweise überprüft werden. Die Sicherheitsfunktion muss getestet werden, wenn die Maschine anläuft oder die Einleitung einer Gefährdungssituation erfolgt. Anmerkung 2 ergänzt, dass die Sicherheitsfunktion zwischen den einzelnen Tests ausfallen darf, dieser Ausfall jedoch durch die Tests zum Testzeitpunkt erkannt werden muss. Daher muss die Testrate deutlich höher sein als die mittlere Anforderungsrate der Sicherheitsfunktion. Bei der vereinfachten Bestimmung des PLs einer SRP/CS mittels des in Abbildung 2.3 dargestellten Säulendiagramms wird daher von einer 100-mal höheren Testrate ausgegangen. Die durchgeführten Tests dürfen nicht zu einer Gefährdungssituation führen. Sollte es zu einem Fehler der SRP/CS kommen, so verfügt die Testeinrichtung über einen unabhängigen Abschaltpfad, der die Maschine in den sicheren Zustand versetzen kann. Die gestellten Anforderungen an die MTTFd oder den DCavg gelten hierbei nur für die Bauteile der SRP/CS, nicht für die der Testeinrichtung. Zu den Anforderungen der Kategorie 2 gehören auch Maßnahmen gegen CCF. Abbildung 2.5 zeigt die allgemeine Architektur einer SRP/CS der Kategorie 2. Der maximal realisierbare Performance Level einer Kategorie 2-Systems liegt bei PL = d (vgl. Abbildung 2.3). Abbildung 2.5: Architektur eines Kategorie 2-Systems [BGIA08, S. 49] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.2 Kategorien Seite 10 2.2.4 Kategorie 3 Die Anforderungen nach der Kategorie 3 sehen vor, dass ein Fehler nicht zum Ausfall der Sicherheitsfunktion führen darf. Damit soll verhindert werden, dass bedingt durch einen einzelnen Fehler die Sicherheitsfunktion nicht mehr ausgeführt werden kann, wodurch eine Gefährdungssituation entstehen würde. Auftretende Fehler müssen bei oder vor der nächsten Anforderung der Sicherheitsfunktion erkannt werden. Meistens wird dies durch eine zweikanalige Struktur, wie die Architektur in Abbildung 2.6 darstellt, gelöst. Es ist jedoch möglich, Einfehlersicherheit ohne Redundanz zu realisieren. Die Verwendung mehrere Kanäle kann durch ein fehlersicheres Design - inhärente Sicherheit - ersetzt werden. Auch ein eigener Abschaltpfad mit hochwertiger Überwachung der Logik des SRP/CS, der im Fehlerfall den sicheren Zustand des Systems so schnell einleitet, dass ein gefährlicher Zustand vermieden wird, kann als Alternative genutzt werden. Auch gegen Ausfälle infolge gemeinsamer Ursachen müssen entsprechende Maßnahmen getroffen werden. Ein Fehler muss jedoch nur erkannt werden, wenn dies mit einem angemessenen Aufwand realisierbar ist. Daher wird, wie in Kategorie 2, ein DCavg im Bereich zwischen niedrig und mittel gefordert. Für eine Struktur der Kategorie 3 wird eine MTTFd von mindestens niedrig vorausgesetzt (vgl. Anhang B). Sowohl Kategorie 3, wie auch die folgende Kategorie 4, können einen maximalen Performance Level von PL = e erreichen (vgl. Abbildung 2.3). Abbildung 2.6: Architektur eines Kategorie 3-Systems [BGIA08, S. 50] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.3 Mittlere Zeit bis zum gefahrbringenden Ausfall Seite 11 2.2.5 Kategorie 4 Kategorie 4 beinhaltet im wesentlichen alle Anforderungen der Kategorie B und der Kategorie 3. Zusätzlich verschärft sie einige der Anforderungen. Die Architektur dieser Kategorie entspricht, bis auf die Überwachung der Ausgänge und dem Kreuzvergleich der SRP/CS, der der Kategorie 3. Die Überwachung der Ausgänge und der Kreuzvergleich sind zwar auch in der Architektur der Kategorie 3 vorhanden, müssen jedoch nur eine angemessene Rate haben. In Kategorie 4 müssen alle Fehler erkannt werden, was in Abbildung 2.7 mittels durchgezogener Linien dargestellt wird (vgl. Abbildung 2.6). Einzelne Fehler dürfen nicht zum Ausfall der Sicherheitsfunktion führen. Sollte eine Erkennung eines Fehlers nicht möglich sein, so darf eine Akkumulation weiterer nicht erkannter Fehler nicht zum Verlust der Sicherheitsfunktion führen. MTTFd sowie DCavg jedes Kanals müssen hoch sein (vgl. Anhang B). Ebenfalls müssen Maßnahmen gegen CCF vorhanden sein, um den Ausfall infolge gemeinsamer Ursache zu verhindern. Durch diese hohen Anforderungen kann mit einer sicherheitsrelevanten Steuerung dieser Kategorie der höchste Performance Level PL = e realisiert werden (vgl. Abbildung 2.3). Abbildung 2.7: Architektur eines Kategorie 4-Systems [BGIA08, S. 50] 2.3 Mittlere Zeit bis zum gefahrbringenden Ausfall Der von SRP/CS erreichbare Performance Level richtet sich nicht nur nach der Kategorie, sondern auch nach der Zuverlässigkeit der einzelnen Bauteile. Zwar setzen die Kategorien eine gewisse mittlere Zeit bis zum gefahrbringenden Ausfall (Mean Time to Dangerous Failure) voraus, jedoch kann, wie in Abbildung 2.3 (S. 7) er- Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.4 Diagnosedeckungsgrad Seite 12 kennbar, nicht pauschal von der Kategorie auf den Performance Level geschlossen werden. Die mittlere Zeit bis zum gefahrbringenden Ausfall wird üblicherweise in Jahren angegeben. Die Bereiche der MTTFd -Angaben für die einzelnen Kanäle einer SRP/CS sind der Abbildung 2.8 zu entnehmen. Abbildung 2.8: Zuordnung des MTTFd zu Betriebsjahren [BGIA08, S. 53] Möglich ist auch die Lebensdauer in Ausfallraten oder Schaltspielen anzugeben, allerdings müssen diese Werte für die Berechnung der MTTFd in Jahre umgerechnet werden. Zu beachten ist, dass sich alle Angaben jeweils auf einen gefahrenbringenden Ausfall beziehen. Dies bedeutet einen Ausfall der SRP/CS zur unsicheren Seite, womit der Ausfall der Sicherheitsfunktion gemeint ist. Eine Aussage über die Anzahl der Ausfälle in den sicheren Zustand kann mit der MTTFd nicht gemacht werden. 2.4 Diagnosedeckungsgrad Der Diagnosedeckungsgrad (Diagnostic Coverage) ist ein weiterer Bestandteil zur Bestimmung des PL. Er gibt an, welcher Anteil an gefahrbringenden Ausfällen erkannt werden kann. DCavg bezeichnet dabei den Prozentsatz für die gesamte sicherheitsrelevante Steuerung. Dieser fließt in den erreichbaren Performance Level mit ein. Abbildung 2.9 zeigt die Unterteilung des DC in vier Kategorien. 2.5 Fehler infolge gemeinsamer Ursache Desweiteren werden zur Bestimmung des Performance Level als letztes noch die Maßnahmen zur Vermeidung von Fehlern und Ausfällen infolge gemeinsamer Ursachen (Common Cause Failure) begutachtet. Die getroffenen Maßnahmen werden dazu gemäß DIN EN ISO 13849-1 mit Punkten bewertet: Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 2.5 Fehler infolge gemeinsamer Ursache Seite 13 Abbildung 2.9: Übersicht des Diagnosedeckungsgrad [BGIA08, S. 55] • 25 Punkte: Schutz vor durch Verunreinigung oder durch elektromagnetischer Beeinflussung ausgelöste CCF • 20 Punkte: Diversitäre Gestaltung der Kanäle • 15 Punkte: Physikalische Trennung zwischen den Signalpfaden • 15 Punkte: Schutz gegen Überbelastung • 10 Punkte: Schutz vor CCF, die durch anderen Einflüsse ausgelöst werden können • 5 Punkte: Schulung von Konstrukteuren und Monteuren gegenüber CCF • 5 Punkte: Verwendung bewährter Bauteile Sind insgesamt 65 der oben genannten 100 Punkten erreicht, gelten die getroffenen Maßnahmen als ausreichend. Dies ist Voraussetzung, damit eine SRP/CS die Kategorie 2, 3 oder 4 erlangen kann. Im Säulendiagramm zur vereinfachten Bestimmung des Performance Level - Abbildung 2.3 (S. 7) - ist daher von der Erfüllung der Anforderung für die genannten Kategorien ausgegangen worden. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3 Technische Realisierung Seite 14 3 Technische Realisierung Um das Verhalten einer homogen redundanten Steuerung zu erforschen, wurde ein Rechnersystem aus zwei hard- und softwaretechnisch identisch aufgebauten Kanälen erstellt. Diese Kanäle setzen sich aus einem Butterflyboard von Atmel, dem passenden Butterfly Carrier von Ecros Technology [@Ecr09] und weiteren Peripheriegeräte, LEDs und Programmierschnittstellen zusammen. Die Verbindung zwischen den einzelnen Systemen des Rechnersystems wird über die serielle Schnittstelle des Butterflys hergestellt. 3.1 AVR Butterfly Bei dem AVR Butterfly handelt es sich um ein eigenständiges, abgeschlossenes System, das zu Evaluationszwecken genutzt wurde. Es zeigt die Möglichkeiten der aktuellen µC-Technologie von Atmel. Zu diesem Zweck ist es standardmäßig mit einem ATMega169P-µC und passender Peripherie ausgestattet, wozu neben diversen Anschlussports, ein LCD-Display, ein ADC, ein Temperatursensor, ein Joystick und ein Piezo-Element zur Ausgabe von akustischen Signalen gehören. Statt über eine Batterie, die eine Spannung von 3 Volt (V) liefert, kann das System wahlweise auch über eine externe Versorgung betrieben werden. Im Auslieferungszustand befindet sich bereits ein Bootloader sowie ein rudimentäres Programm in dem Programmspeicher des µC, das einen kurzen Überblick über die Funktionen des Butterflys gibt. Das Butterfly stellt das Herzstück der Kanäle dar. Da es sich dabei um ein für Evaluationszwecke erstelltes System handelt, erfüllt es nicht die Anforderungen, die in der Industrie an Hardware gestellt werden. MTTFd -Werte sind nicht bekannt und auch die Voraussetzung der Kategorien, beispielsweise das Entwickeln der Bauteile unter Einhaltung grundlegender Sicherheitsprinzipien, können nicht als gegeben vorausgesetzt werden. Trotz alledem war das Butterfly-Evaluationsboard für die Untersuchungen gut geeignet, da es durch seine Ausstattung und der einfachen Handhabung eine hohe Flexibilität bot und durch seine einfache Qualität eine Art Worst-Case“-Szenario bildete. ” Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.1 AVR Butterfly Seite 15 Abbildung 3.1: Butterfly 3.1.1 Atmel ATMega169P Bei dem Prozessor handelt es sich um einen ATMega169PV, einem µC der AVRRISC-Familie des Herstellers Atmel. Der ATMega169P ist das Nachfolgermodell des ATMega169 und basiert auf einem Re-Design zur Senkung des Stromverbrauchs. Nach Einführung der picoPower-Technology von Atmel wurden die wichtigsten µC in diesem Design neu aufgelegt. [@ATM08b] Wie auch der Vorgänger ist der ATMega169P in zwei Ausführungen erhältlich. Diese unterscheiden sich durch die maximale Taktfrequenz und die benötigte Betriebsspannung. Das V-Modell ist für stromsparende Anwendungen konzipiert und ist dadurch mit niedrigerer Spannung, auf Kosten einer reduzierten Taktfrequenz, arbeitsfähig. Durch die Halbierung der Taktfrequenz werden zur Inbetriebnahme statt 2,7 V nur noch 1,8 V benötigt. Auch die maximale Taktfrequenz, die mit 8 MHz ebenfalls nur halb so hoch ist wie die des nicht V-Modells, kann bereits mit deutlich niedrigerer Spannung von 3,3 V erreicht werden. Verglichen dazu benötigt der große Bruder schon 4,5 V für die maximale Frequenz. Die gesamte AVR-Mikrocontroller-Familie basiert auf der Reduced Instruction Set Computing (RISC)-Architektur. Diese Art der µC verfügt über einen reduzierten Befehlssatz, der allerdings optimiert ist, um den Dekodierungsaufwand zu reduzieren. Dadurch können die meisten der 130 Befehle des Befehlssatzes eines 8 Bit-AVRControllers in einem Arbeitszyklus verarbeitet werden. Dem ATMega169 stehen 32, jeweils 8 Bit breite Arbeitsregister zur Verfügung. Diese ersetzen den üblicherweise verwendeten Akkumulator. Die unteren sechs Register können paarweise zu 16 Bit-Registern zusammengefasst werden und dienen als Pointer zur indirekten Adressierung des Datenspeichers. Insgesamt 16 Kilobyte (kB) Flashspeicher können zur Programmspeicherung genutzt werden. Laut Herstellerangaben hat dieser eine Lebensdauer von mindestens 10.000 Zyklen, wobei ein Zyklus dabei aus dem Löschen, dem erneutem Programmieren und anschließendem Löschen besteht. [ATM08a, S.19] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.2 AVR Butterfly Carrier Seite 16 3.1.2 Peripherie Neben dem µC ist das AVR Butterfly noch mit weiterer Peripherie ausgestattet worden, wodurch es - in einem gewissen Rahmen - komplett ohne zusätzliche Hardware eingesetzt werden kann. Die zusätzliche Peripherie wurde bereits in Abschnitt 3 (S. 14) erwähnt und wird im folgenden näher beschrieben. Das LCD-Display verfügt über 100 Segmente und kann sechs Stellen darstellen. Es ist bereits an die vom Controller vorgesehen Ports angebunden und wird bei der Demo-Applikation des Butterflys zur Ausgabe des Menüs genutzt. Neben dem Display befindet sich ein Joystick. Dieser hat vier Richtungen, in die er bewegt werden kann. Weiterhin ist es möglich den Joystick in Ausgangsposition nach unten - zur Platine (PCB) - zu drücken, wodurch ein fünfter Kontakt geschlossen werden kann. Wie das Display ist auch der Joystick bereits angeschlossen. Eingaben über den Joystick werden an Port B und Port E registriert. Port B und Port D sind Ports, die auf dem PCB des Butterflys zum Anschließen vorbereitet sind, um einfacher verwendet werden zu können. Wie der Abbildung 3.1 entnommen werden kann, befinden sich die Anschlussmöglichkeiten der beiden Ports unter dem Display; dort ist auch die Schnittstelle für den JTAG-Anschluss beziehungsweise den A/D-Wandler. Diese Anschlüsse werden beim Einsatz mit einem Butterfly Carrier Trägerboard - Abschnitt 3.2 - mit Hilfe von Steckverbindungen mit der Prototypfläche des Butterfly Carrier verbunden. Ebenfalls über Steckverbindungen werden die serielle Schnittstelle und der ISP - Abschnitt 3.2.2 (S. 19) - angeschlossen. Auf der Rückseite befindet sich ein Piezo-Element, mit dem es möglich ist, akustische Signale auszugeben. Außerdem ist dort ein Temperatursensor verbaut, der durch einen Widerstand mit einem negativen Temperaturkoeffizienten realisiert wurde. 3.2 AVR Butterfly Carrier Der AVR Butterfly Carrier ist als Trägerboard für das Butterfly gedacht. Wird das Butterfly mit dem Carrier verbunden, können die in Abschnitt 3.1.2 erwähnten Anschlüsse leichter verwendet werden, da sie mit der experimentellen Fläche - der Prototypfläche - des Carrier oder mit vorgesehen Steckvorrichtungen verbunden sind. Über einen Hohlstecker kann ein Gleichstrom-Netzteil an den Carrier angeschlossen werden, das sowohl das Butterflyboard als auch sämtliche Peripherie auf der Prototypfläche mit Strom versorgen kann. Um eine Verpolung auszuschließen, ist eine Diode hinter dem Versorgungsstecker verbaut, die Beschädigung oder Zerstörung von Bauteilen im System durch falsch gepolte Stromversorgung verhindert. Der verbaute Spannungsregler, ein LF33CV, regelt eine eingehende Gleichspannung von maximal 40 V in eine 3,3 V Ausgangsspannung um. [STM] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.2 AVR Butterfly Carrier Seite 17 Abbildung 3.2: AVR Butterfly Carrier Folgende Schnittstellen und Ports werden durch den Carrier zur weiteren Beschaltung bereit gestellt: • Serielle Schnittstelle • In-System-Programmer (ISP) • Joint Test Action Group - Port (JTAG) • Port B & Port D • Analog/Digital-Konverter (ADC) • Universelle Serielle Schnittstelle (USI) 3.2.1 Universal Asynchronous Receiver Transmitter (UART) Der Universal Asynchronous Receiver Transmitter (UART) ist das elektronische Bauelement des µC, das zur Realisierung der seriellen Schnittstelle benötigt wird. Er wird mit der auf dem AVR Butterfly Carrier befindlichen EIA-232 Buchse verbunden. Die entstehende EIA-232 Schnittstelle - ehemals als RS-232 bekannt - wurde im Rahmen dieser Arbeit zur Vernetzung der Kanäle verwendet. Darauf gesendete Daten werden in, jeweils aus einem Zeichen bestehenden, Paketen verschickt. Diese Pakete haben ein Start- und Stopp-Bit, die dem Empfänger zur Synchronisation dienen. Übertragen wird, wie Abbildung 3.3 entnommen werden kann, mittels negativer Logik, was bedeutet, dass eine 1 Ruhe auf dem Medium und eine 0 ein Signal ist. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.2 AVR Butterfly Carrier Seite 18 Abbildung 3.3: Datenübertragung mittels EIA-232 Wie auch bei den in der Industrie eingesetzten Bus-Systemen, kann es bei einer Kommunikation über die serielle Schnittstelle zu Problemen kommen. Abbildung 3.4 zeigt mögliche Fehler. Tritt einer dieser Fehler auf, kann das im Worst-Case zu einem gefährlichen Zustand führen. Um dies zu vermeiden, sind in der Software fehlerbehandelnde Maßnahmen implementiert (vgl. Abschnitt 4.5.1, S. 30), die auftretende Übertragungsfehler erkennen und behandeln können. Abbildung 3.4: Mögliche Übertragungsfehler von Bussystemen [Rei01, S. 33] Die Programmierung des ATMega169P über die serielle Schnittstelle ist möglich, vorausgesetzt auf dem µC befindet sich ein Bootloader, der vom PC gesendete Daten empfangen und im Programmspeicher ablegen kann. Im Auslieferungszustand Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.2 AVR Butterfly Carrier Seite 19 verfügt der Controller bereits über einen Bootloader mit dieser Fähigkeit, der auch beim Aufspielen neuer Software über die EIA-232 nicht überschrieben wird. Die im Programmspeicher befindliche Software wird jedoch durch die neu überspielte ersetzt. Ein Nachteil der Programmierung über die serielle Schnittstelle ist, dass das Programm nicht automatisch bei Inbetriebnahme gestartet wird, sondern über den Bootloader angestoßen werden muss. 3.2.2 In-System-Programmer (ISP) Um ein Programm direkt auf einen µC zu überspielen, benötigt man einen sogenannten Brenner. Diese können direkt in den Programmspeicher schreiben und sind zwingend notwendig, wenn auf dem Controller kein Bootloader vorhanden ist, der Daten über eine definierte Schnittstelle annehmen und im Programmspeicher ablegen kann. Aber auch wenn ein Bootloader vorhanden ist, kann es sinnvoll sein, den µC zu brennen. Die im Programmspeicher abgelegte Software ist nach dem Brennvorgang die einzige auf dem Controller, wodurch sie nicht mehr über den Bootloader gestartet werden muss, sondern bei Inbetriebnahme automatisch ausgeführt wird. Der vorhandene Bootloader wird durch das Brennen überschrieben. Zum Brennen des Programms in den Programmspeicher, kann der Prozessor aus seiner Fassung genommen werden, um dann programmiert und wieder eingesetzt zu werden. Dies ist jedoch mit großem Aufwand und hoher physikalischer Belastung für das Bauteil verbunden. Daher wird meistens bei experimentellen Systemen - wie dem hier verwendeten Butterfly - der Weg über eine Schnittstelle genutzt, die es ermöglicht, das Programm direkt im Einsatzsystem auf den Controller zu schreiben. Als einfache Schnittstelle steht der In-System-Programmer (ISP) zur Verfügung. Über diesen wird der Computer mit dem Butterfly verbunden und kann nun das gewünschte Programm direkt in den Programmspeicher schreiben. Bei dieser Art der Programmierung werden vorhandene Programme - beispielsweise ein Bootloader - überschrieben. Das aufgespielte Programm ist nun das Einzige auf dem Controller und wird bei Inbtriebnahme automatisch ausgeführt. Bei der Programmierung mittels ISP gibt es keine Einschränkung in der Benutzung der Ports, da die ISP-Schnittstelle nur zur Programmierung genutzt wird. Während der Laufzeit können alternative Belegungen dieser Ports benutzt werden, da der ISP inaktiv ist. 3.2.3 Joint Test Action Group - Port (JTAG) Neben der ISP, verfügt der ATMega169P noch über eine weitere Schnittstelle, die zum Brennen des Controllers genutzt werden kann. Diese Schnittstelle ist nach dem Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.3 Versuchsaufbau Seite 20 Standard IEEE 1149.1 der Joint Test Action Group (JTAG) aufgebaut. Die allgemeine Bezeichnung lautet JTAG-Schnittstelle oder JTAG-Port. Über diese Schnittstelle ist es möglich, das Programm wie über eine ISP auf den µC zu übertragen. Darüber hinaus ermöglicht der Einsatz des JTAG-Ports das direkte Debugging des Systems zur Laufzeit. Dazu kann der Programmablauf einer nicht zeitkritischen Software schrittweise ausgeführt werden, wobei eine Betrachtung des aktuellen Zustandes nach jedem Schritt möglich ist. Alternativ ist es möglich, das Programm auszuführen und zu jedem beliebigem Zeitpunkt, beispielsweise mittels Breakpoints, anzuhalten. In beiden Fällen können die Zustände der Ein- sowie Ausgänge und die Inhalte der Register und Speicher ausgelesen werden. Dadurch ist die Fehlersuche zur Laufzeit deutlich genauer und einfacher als die Simulierung des Programmablaufs mittels eines Emulators. Diese emulieren das Verhalten eines µC, arbeiten in der Praxis allerdings nicht exakt wie der zu emulierende Controller. Weiterhin ist eine Simulation einiger Operationen aufgrund technischer Voraussetzungen nicht möglich; beispielsweise kann das Empfangen von Synchronisationsdaten über die serielle Schnittstelle nicht simuliert werden. Um das System mit dem Computer zu verbinden, ist ein JTAG-Adapter nötig, der die Kommunikation zwischen dem Computer und dem Butterfly übernimmt. Als einfach zu bedienen hat sich der JTAG ICE-USB-Adapter von AVR erwiesen. Dieser benötigt keinen seriellen Port am Computer, der bei modernerer Hardware nicht mehr zur Standardausstattung gehört und nötigenfalls mit einer zusätzlichen Slotkarte zur Verfügung gestellt werden müsste. Stattdessen wird der USB-Anschluss genutzt, der zur Standardausstattung jedes modernen Computers gehört. Um die Schnittstelle zu nutzen, muss das JTAGEN Fuse Bit des µC gesetzt werden, damit der Controller auch über JTAG kommuniziert. Dies stellt den einzigen Nachteil des JTAG-Ports dar. Wenn dieses Fuse Bit gesetzt ist, können die I/O-Pins der JTAG nicht mehr für eine alternative Belegung verwendet werden. [Pard05, S. 45] Im Falle des ATMega169P ist dies der ADC, der bei der Aktivierung der JTAGSchnittstelle nicht mehr genutzt werden kann. 3.3 Versuchsaufbau Ziel der Arbeit ist das Erforschen des Verhaltens von Rechnersystemen unter extremen Umgebungsbedingungen. Damit ein Rechnersystem entsteht, das einem SRP/CS, wie es in der Industrie eingesetzt wird, entspricht, müssen die beiden aufgebauten Systeme miteinander verbunden werden. Die geeignetste Methode, um die beiden Systeme zu verbinden, stellt die serielle Schnittstelle dar. Werden die Systeme über diese Schnittstelle verbunden und mit entsprechender Software betrieben, Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.3 Versuchsaufbau Seite 21 erfüllt das entstandene Rechnersystem die Anforderungen an die Architektur der Kategorie 3. Von einer Struktur der Kategorie 3 kann trotzdem nicht ausgegangen werden, da weder Werte zum MTTFd noch zum DCavg bekannt sind. Obwohl die Einfehlersicherheit gewährleistet ist, sind keine ausreichenden Maßnahmen gegen Ausfälle infolge gemeinsamer Ursache vorhanden. Für den Einsatzzweck des Systems müssen diese Voraussetzungen allerdings nicht erfüllt werden. Das Rechnersystem wird genutzt, um das Ausfallverhalten von homogen redundanten Systemen zu untersuchen. Bei der Auswertung der Ergebnisse muss jedoch beachtet werden, dass ein nicht gesichertes System erwartungsgemäß leichter ausfällt als ein gegen Störungen geschütztes. Um das Verhalten der Kanäle auch ohne weitere Analysehardware erkennen zu können, wurden auf den Flächen der Butterfly Carrier mehrere LEDs verbaut. Diese stellen, je nach Programmierung, den Status und die Fehlermeldung in einer eindeutigen Kodierung dar. Weitere Details zu den Anzeigemöglichkeiten der LEDs sind Kapitel 4 (S. 24) zu entnehmen. Bis der Versuchsaufbau seine endgültige Form erreicht hat, wurden mehrere Revisionen durchlaufen, in denen sich der Aufbau veränderte. Da sich die Beschaltung des µC von Revision 2 zu Revision 3 nicht geändert hat und der Unterschied zwischen den Revisionen auf den implementierten Programmablauf keine Auswirkung hat, ist es nicht von Bedeutung, welche Revision bei den Untersuchungen des Verhaltens unter Umgebungsvariablen zum Einsatz kommt. Die im Rahmen dieser Arbeit durchgeführten Beobachtungen wurden mit einem Rechnersystem bestehend aus einem Kanal der Revision 2 und einem Kanal der Revision 3 gemacht. Nachträgliche Kontrolltests mit zwei Systemen der zweiten Revision zeigten keine Abweichung der Ergebnisse. 3.3.1 Revision 1 Der erste Entwurf eines Versuchsaufbaus wurde mit vier LEDs erstellt. Mit diesem Design war es möglich, 24 = 16 verschiedene Zustände darzustellen. Für den weiteren Projektverlauf zeigte sich, dass 16 eindeutige Zustände zu wenig waren. Allein die Anzahl der Tests überstieg diesen Wert und so konnte, im Fehlerfall, keine eindeutige Identifizierung eines fehlerhaften Tests erfolgen. Weiterhin war die Darstellung von Fehlercode und Systemstatus schwierig, da diese über eine wechselnde Anzeige realisiert wurde. Dazu zeigten die LEDs nacheinander, mit einer Anzeigedauer von jeweils etwa einer Sekunde, den Fehlercode, den Systemstatus und einen Referenzzustand - 0, alle LEDs aus - an. Anhand des Referenzzustandes sollte der aktuell ausgegebene Wert interpretierbar werden. Problematisch hierbei war allerdings, dass sowohl Status als auch Fehlercode den Wert 0 annehmen konnten, wodurch der klare Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.3 Versuchsaufbau Seite 22 Übergang zwischen den verschiedenen Darstellungen verschwand. Daher wurde die Idee der Darstellung aus Revision 1 verworfen und durch ein neues Konzept ersetzt. Abbildung 3.5: Revision 1 des Versuchsaufbau 3.3.2 Revision 2 In Revision 2 wurde zum einen die Anzahl der LEDs von vier auf acht erhöht, um bis zu 28 = 256 eindeutige Zustände ausgeben zu können. Zudem wurde ein weiteres LED-Feld aufgebaut, dass für die Ausgabe der Fehlercodes und der Betriebsmodi genutzt wird. Dieses Design erfüllt bereits alle Voraussetzungen, die für den vorgesehenen Programmablauf benötigt werden. Einzig die Tatsache, dass der Porttest Abschnitt 5.2.5 (S. 53) - mit diesem Aufbau nicht realisierbar war, führte zu einer weiteren Revision. Abbildung 3.6: Revision 2 des Versuchsaufbau Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 3.3 Versuchsaufbau Seite 23 3.3.3 Revision 3 In Revision 3 des Versuchsaufbaus wurde der Aufbau um eine modulare Steckverbindung erweitert. Dieser Aufbau ermöglicht hardwareübergreifende Test, die mit dem Aufbau der Revision 2, in dem die LEDs fest an die Ports gekoppelt wurden, nicht möglich waren. In diesem Aufbau können nun wahlweise die LEDs mit den Ports oder die Ports untereinander verbunden werden. Durch dieses modulare Design kann zum einen das Programm in seiner vorgesehenen Weise ausgeführt und die LEDs zur Anzeige der Zustande genutzt werden, zum anderen ist es möglich den Porttest durchzuführen. Dazu ist es allerdings nötig, den normalen Programmablauf zu verlassen, die beiden Ports miteinander zu verbinden und ein separates Testprogramm auszuführen. Da das Butterfly nur zwei Ports zur weiteren Beschaltung auf der Fläche des Butterfly Carrier bereitstellt, gibt es meiner Ansicht nach keine andere Möglichkeit die korrekte Funktion der Ports zu prüfen. Abbildung 3.7: Revision 3 des Versuchsaufbau Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4 Entwickelte Software Seite 24 4 Entwickelte Software 4.1 Anforderungen Die für das Rechnersystem verwendete Software wurde nach den Anforderungen an ein SRP/CS der Kategorie 3 entwickelt. Wird das erstellte Rechnersystem mit der Software betrieben, so wird die Einfehlersicherheit durch die Synchronisation und die Fehlerbehandlung erreicht. Weiterhin ist der Programmablauf gegen verschiedene Fehler gesichert. Sollten bekannten Fehler auftreten, so werden sie durch fehlerbehandelnde Maßnahmen aufgefangen und verarbeitet. 4.2 Grundlagen Während das Programm in der Sprache C geschrieben wurde, sind Teile der Selbsttests in Assembler verfasst worden. Alle implementierten Selbsttests sind zu einer Bibliothek zusammengefasst worden und können somit in anderen Projekten Verwendung finden. Genauere Details über die Selbsttests werden im Kapitel 5 (S. 36) erläutert. Als Entwicklungsumgebung wurde Programmers Notepad“ von WinAVR ge” nutzt. WinAVR ist eine Sammlung von Open-Source-Tools, die zum Entwickeln von Programmen für AVR µC genutzt werden können. WinAVR enthält außerdem alle wichtigen Tools zum Brennen und Debuggen eines µCs. Ebenfalls enthalten ist die GNU Compiler Collection (GCC), die den benötigten Cross-Compiler AVRGCC beinhaltet. [@WinAVR] Die vorhandenen Assembler-Dateien werden nach dem Kompilierungsprozess dem Projekt durch Verlinkung hinzugefügt. Zum Beschreiben des µC wird nicht das im WinAVR-Paket enthaltene avrdude, sondern das von Atmel entwickelte AVRStudio genutzt. Dieses Tool ermöglicht die Entwicklung von Software in den Sprachen C und Assembler, allerdings erschwert die kompliziertere Bedienung beim Erstellen von Programmen in C den Entstehungsprozess. Daher wurde das einfacher zu nutzende Programmers Notepad“ zur Ent” wicklung eingesetzt. Weiterhin kann mit dem AVRStudio ein µC beschrieben und, entsprechende Analysehardware vorausgesetzt, auch zur Laufzeit debuggt werden. Darüberhinaus enthält das Programm eine Reihe von Simulatoren, mit denen der Programmablauf auch ohne Hardware getestet werden kann (vgl. Abschnitt 3.2.3, S. 19). Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.3 Struktur Seite 25 Nach dem Kompilieren und Verlinken der Software liegt das Programm im executable and linkable format (elf) vor. Diese Datei beinhaltet den benötigten Programmcode und kann mit dem AVRStudio auf den µC übertragen werden. [Pard05, S. 18ff] 4.3 Struktur Die Software ist in zwei Teile unterteilt. Teil Eins, das Hauptprogramm, verarbeitet die Daten und simuliert den Effektiveinsatz. Teil Zwei, die Selbsttests, prüfen das System auf Fehler (vgl. Kapitel 5, S. 36). Das Hauptprogramm strukturiert sich in fünf Bereiche: • Initialisierung • Betriebsbereitschaft • Hauptroutine • Synchronisation • Fehlerbehandlung Nach dem Programmstart werden während der Initialisierung diverse Routinen durchgeführt, um die Anlauftests und die Konfiguration des Systems vorzunehmen (vgl. Abbildung 4.1). Sind diese abgearbeitet, verweilt das Programm in einer Schleife, dem Zustand der Betriebsbereitschaft. Abbildung 4.1: Struktur der Initialisierung und der Betriebsbereitschaft In der Betriebsbereitschaft, dargestellt in Abbildung 4.1, wartet das System auf den Start, der durch ein externes Signal oder durch das Betätigen des Joysticks Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.3 Struktur Seite 26 auf dem AVR Butterfly ausgelöst werden kann. Während der Wartezeit werden zyklisch Selbsttests durchgeführt. Nach der Registrierung des Startsignals, beendet das Programm die Warteschleife und geht in die Hauptroutine über. Da das Rechnersystem zur Laufzeit keine Eingänge hat, auf die es reagieren muss, wurde stattdessen ein Zähler implementiert, der in jedem Zyklus inkrementiert wird und damit eine Prozedur simuliert, die das System zur Laufzeit durchführt. Der Zähler der Pseudo-Aktion repräsentiert dabei den Systemstatus. Abbildung 4.2 zeigt die Struktur der Hauptroutine. Tabelle 4.3 zeigt die Ausgabe der LEDs zur Laufzeit. Der gelb hinterlegte Pin stellt den definierten Ausgang der Steuerung dar, der der zu steuernden Maschine signalisiert, dass kein Fehler vorliegt und der Betrieb ausgeführt werden kann. Nach dem Prinzip des Ruhestroms wird das fehlende Signal auf diesem Pin als ein Fehler gedeutet, wodurch die Maschine in den sicheren Zustand überführt werden soll. Daher wird in den implementierten Fehlerroutinen der definierte Ausgang immer gelöscht, wodurch das Signal von dem Pin verschwindet. Abbildung 4.3: Tabelle der Laufzeitanzeige Abbildung 4.2: Struktur der Hauptroutine Nach der Datenverarbeitung folgt die Synchronisation, in der die Systeme kreuzweise ihren aktuellen Stand abgleichen. Obwohl die Routine der Synchronisation von der Hauptroutine aufgerufen wird, stellt sie einen eigenen Teil des Programmablaufs dar, da der Programmablauf auch ohne Synchronisation möglich ist. Durch den anschließenden Aufruf der Selbsttests wird in jedem Schleifendurchlauf der Hauptroutine ein Selbsttest aufgerufen. In dem zu Evaluationszwecken entwickelten System ist diese Art der Testaufrufung einsetzbar, da keine langen Prozessabläufe erwartet werden, so dass, trotz zyklischer Ausführung, eine ausreichend Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.4 Konfigurationsmöglichkeiten Seite 27 hohe Testrate erwartet werden kann. In Systemen mit nicht linearen Programmabläufen, die auf externe Ereignisse reagieren müssen, ist diese Art der Testung ungeeignet, da die Testrate stark von der aktuellen Last des Systems abhängt und gerade zu kritischen Zeiten der Beanspruchung enorm sinken würde. Mögliche Lösungen für diese Probleme werden in Kapitel 5.3 (S. 54) vorgeschlagen. 4.4 Konfigurationsmöglichkeiten Um das Programm flexibel aber gleichzeitig testbar zu halten, wurden verschiedene Konfigurationsmöglichkeiten eingebaut. Anhand der Konfiguration kann das System im Debugmodus gestartet werden, in dem Synchronisation und Selbsttests deaktiviert sind. Dieser Modus dient dazu, andere Programmelemente ohne den Einfluss der fehlerbehandelnden Maßnahmen testen zu können. Auch die Simulation ist nur in diesem Modus möglich, da Synchronisation sowie Warteschleifen während der Testphasen im Simulator nicht ausführbar sind. Alternativ können auch Tests oder Synchronisation einzeln, durch entsprechende Einstellungen im Quellcode, deaktiviert werden. Der reguläre Programmablauf, wie er auch in der Beobachtung des Verhaltens unter Umgebungseinflüssen zum Einsatz kam, führt diese Routinen jedoch aus. Solange sich das Programm in der Betriebsbereitschaft befindet, kann der aktuelle Modus an den angeschlossenen LEDs abgelesen werden. Die Kodierung des Modus wird wie in Abbildung 4.4 dargestellt vorgenommen. Abbildung 4.4: Tabelle der Betriebsmodi Die Häufigkeit der Synchronisation kann über die Variablen iSyncMod, die die Anzahl der Zyklen der Hauptroutine vor einer Synchronisation einstellt, vorgenommen werden. Da die Synchronisation mitunter lange dauern kann (vgl. Abschnitt 4.5.1, S. 30) ist es für eine schnellere Datenverarbeitung sinnvoll, die Häufigkeit der Synchronisationspunkte zu reduzieren. Dies bewirkt allerdings eine größere Abweichung der Systeme untereinander und erhöht die Dauer, bis ein Fehler oder Ausfall des anderen Systems erkannt wird. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.4 Konfigurationsmöglichkeiten Seite 28 Über weitere Variablen kann die maximal zulässige Dauer der einzelnen Schleifen im Programm, die Speicherzellen für die Sicherung des Fehlercodes im Fehlerfall sowie der definierte Ausgang eingestellt werden. Quellcode 4.1 zeigt die Standardeinstellungen des Programms, wie sie auch bei den Untersuchungen des Ausfallverhaltens verwendet wurden. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.4 Konfigurationsmöglichkeiten Seite 29 // −−− K o n f i g u r a t i o n s e i n s t e l l u n g e n −−− char cStatus = 0 ; // c S t a t u s = a k t u e l l e n S t a t u s // S t a r t s t a t u s ändern i n t iMaxStat = 2 5 5 ; // Maximaler S t a t u s 255 i n t iDelayMs = 10∗DELAY; // W a r t e z e i t S y n c h r o n i s a t i o n i n ms // max i n t iMaxTimeMs = 20∗DELAY; // Z e i t S c h l e i f e n d u r c h l a u f i n ms // max i n t iDebugFlag = 0 ; : ˜30ms : ˜30ms // 1 : Autostart // 0 : Startsignal ( default ) // Für S i m u l a t o r 1 e i n s e t z e n // −− WICHTIG: −− // DEBUG−MODUS: SYNCHRONISATION // SELBSTTESTS DEAKTIVIERT ! int iTestFlag = 1; i n t iSyncFlag = 1; i n t iSyncMod = 1 ; // 1 : Selbsttests ( default ) // 0 : keine S e l b s t t e s t s // 1 : Synchronisation ( default ) // 0 : keine Synchronisation // S t a t u s s c h r i t t e z w i s c h e n Sync // Minimum : 1 // Maximum : iMaxStat i n t iOn = 0xFF ; // Lampen an / Port a l s Ausgang i n t i O f f = 0 x00 ; // Lampen aus / Port a l s Eingang i n t i S e c u r e P o r t D = ˜0 x80 ; // d e f i n i e r t e n Ausgang f e s t l e g e n i n t i S p e i c h e r 1 = 0 x00 ; // S p e i c h e r z e l l e 1 d e k l a r i e r e n i n t i S p e i c h e r 2 = 0 x01 ; // S p e i c h e r z e l l e 2 d e k l a r i e r e n Quellcode 4.1: Konfigurationsmöglichkeiten der Software Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 30 4.5 Fehlerbeherrschende Maßnahmen Damit das entwickelte Programm den Anforderungen an Software von sicherheitsbezogenen Steuerungen entspricht, müssen Maßnahmen zur Erkennung und Beherrschung von Fehlern implementiert werden. In dem entwickelten Programm werden daher drei Kategorien von Maßnahmen eingesetzt: 1. Synchronisation 2. Fehlerbehandlung 3. Watchdog Mit diesen Maßnahmen ist das System gegen bekannte Fehler sowie auch gegen unerwartete und damit nicht bekannte Fehler geschützt. 4.5.1 Synchronisation Über verschiedene Konfigurationsparamter kann im Programm eingestellt werden, ob und wenn ja, wie häufig eine Synchronisation erfolgen soll. Abbildung 4.5: Struktur der Synchronisationsroutine Während der Synchronisation - Struktur in Abbildung 4.5 - kommt es zu Wartezeiten, da die Systeme niemals exakt gleich arbeiten. Zwar arbeiten beide Controller mit einer eingestellte Taktfrequenz von acht Megahertz (MHz), diese Einstellung richtet sich jedoch an der Frequenz der einzelnen Oszillatoren aus, die wiederum Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 31 leichte Abweichungen voneinander haben. So kommt es zu unterschiedlichen Taktfrequenzen, woraus eine Abweichung in der Arbeitsgeschwindigkeit resultiert. Kompensierbar wären diese durch einen gemeinsamen Taktgeber, durch den jedoch die Mehrkanaligkeit des Rechnersystems wegfallen würde. Um diese Abweichung ohne synchronisierten Taktgeber auszugleichen, wird in der Routine eine Schleife durchlaufen, die auf das Empfangen von Daten wartet. Das System, das zuerst am Punkt der Synchronisation angelangt ist, sendet und wartet anschließend auf eingehende Daten. Dabei verfällt es in den Wartezustand, bis das andere System ebenfalls Daten übermittelt hat. Die empfangenen Daten werden mit dem eigenen Status verglichen. Sofern eine Differenz vorliegt, wird eine Fehlerroutine aufgerufen, die das System sicher abschaltet. Damit die Wartezeit eine bestimmte Grenze nicht überschreitet, wird ein Timer verwendet, der mit Hilfe der Konfigurationsvariablen iMaxTimeMs auf einen maximalen Wert eingestellt werden kann. Die Variable definiert die maximale Zeit nach der das Programm den sicheren Zustand einleitet. Antwortet das andere System nicht innerhalb des Zeitfensters, liegt ein Fehler vor. Ob ein Ausfall die Ursache für das Problem war, das andere System länger für die Datenverarbeitung brauchte oder die Nachricht aufgrund von Störungen der seriellen Schnittstelle nicht oder nur verzögert übertragenen wurden, ist dabei nicht erkennbar. Vor der Übermittlung von Daten wird eine Plausibilitätskontrolle, in der der zu sendende Status auf zulässige Werte geprüft wird, durchgeführt. Durch die Verwendung des kreuzweisen Vergleichs, werden fast alle Übertragungsfehler (vgl. Abbildung 3.4, S. 18) erkannt und behandelt. Lediglich Verzögerungen werden durch die Verwendung des Timers erkannt. Obwohl alle aufgezeigten Fehler erkannt werden, kann der genaue Fehlertyp nicht bestimmt werden, was trotzdem zur sicheren Abschaltung des Systems führt. [Rei99] Weiterhin wird mit der Synchronisation die Einfehlersicherheit gewährleistet. Fällt ein System aufgrund von Störungen aus oder produziert Fehler, so erkennt das andere System dies zum nächsten Synchronisationszeitpunkt und löst eine Fehlerroutine aus. Ausschnitt 4.2 aus dem Programmcode zeigt den Quelltext der Synchronisationroutine. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 32 515 /∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/ 516 /∗ −−−−− S y n c h r o n i s a t i o n s r o u t i n e −−−−−− ∗/ 517 /∗ empfängt und s e n d e t a k t u e l l e n S t a t u s ∗/ 518 /∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/ 519 v o i d doSync ( ) { 520 521 // a k t u e l l e n S t a t u s senden 522 i f ( c S t a t u s <= iMaxStat ) { 523 sendChar ( c S t a t u s ) ; 524 } 525 else 526 stdError () ; 527 528 // WD r e s e t t e n , damit n i c h t a u s l ö s t 529 wdt reset () ; 530 531 delay loop 2 (4000) ; 532 533 TCNT2 = 0 ; 534 OCR2A = iDelayMs ; // Lädt das V e r g l e i c h s r e g i s t e r 535 536 // I n i t i a l i s i e r t den Timer und s t a r t e t i h n 537 TCCR2A = (1<<CS20 ) |(1<<CS22 ) |(1<<WGM21) ; 538 539 w h i l e ( ! ( UCSRA & (1<<RXC) ) ) ; // Daten empfangen ? 540 541 c R e c e i v e d = UDR; // Daten a u s l e s e n i f ( c R e c e i v e d != c S t a t u s ) { // Vgl . empf . Daten & S t a t u s . . 542 543 544 syncError () ; // . . F e h l e r wenn u n g l e i c h } 545 546 547 // Timer a n h a l t e n 548 TCCR2A &= ˜((1<<CS20 ) |(1<<CS22 ) ) ; 549 } Quellcode 4.2: Synchronisationsroutine 4.5.2 Fehlerroutinen Im Programm sind mehrere Fehlerroutinen implementiert, mit denen auf auftretende Fehler reagiert wird. Mögliche Fehler werden durch Vorkehrungen im Programm Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 33 erkannt und mit Hilfe entsprechender Fehlerroutinen, durch Ausgabe des Fehlercodes und Überführung in den sicheren Zustand, behandelt. Weiterhin wird ein eindeutiger Fehlercode in den Festwertspeicher des µCs geschrieben. Sollte ein Fehler auftreten, der die Peripherie beeinflusst, so kann mittels Hardwareanalysetools der gespeicherte Wert zur Identifizierung des Fehlers aus den eingestellten Speicherzellen ausgelesen werden. Es gibt sechs verschiedene Fehlerroutinen, die unterschiedliche Fehler behandeln, wobei alle Routinen mit Ausnahme der für den Watchdogalarm, fest definierte Fehler behandelt. Diese werden im folgenden näher erläutert. Synchronisationsfehler und -timer Diese Routinen behandeln die Fehler, die bei der Synchronisation auftreten können. Auslöser sind die in Abschnitt 4.5.1 (S. 30) genannten Umstände. Watchdog Nach einem, durch den Watchdog herbeigeführten, Systemreset wird diese Routine ausgeführt, außer der Systemreset war Teil des Watchdog-Tests. Mit dieser Maßnahme werden nicht erkannte Fehler behandelt, die das System zum Verlassen des vorgesehenen Programmablaufs bringen, wodurch der Watchdog nicht mehr gesetzt wird und das System neu startet. Selbsttestfehler Die Routine wird durch einen Fehler eines Selbsttests aufgerufen. Die Selbsttests und mögliche Fehler werden in Kapitel 5 (S. 36) erklärt. Echtzeitverletzung Mit dem Echtzeittimer wird überprüft, ob ein Schleifendurchlauf des Hauptprogramms - dargestellt in Abbildung 4.2 (S. 26) - die mittels der in Quellcode 4.1 (S. 29) vorgesehenen Variablen iMaxTimeMs eingestellte Zeit überschreiten. Ist dies der Fall, kann nicht mehr von der Echtzeitfähigkeit des Systems ausgegangen werden. Dieser Fehler tritt auf, wenn durch unvorhergesehene Ereignisse während der Datenverarbeitung in der Hauptroutine der Zeitrahmen für den Schleifendurchlauf überschritten wird. Sonstige Diese Routine dient für alle weiteren Fehler und kommt im aktuellen Programmablauf nur bei der Plausibilitätsprüfung vor der Synchronisation zum Einsatz. Denkbar ist es jedoch weitere, vorstellbare Fehler mit ihr abzudecken. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 34 Abbildung 4.6: Tabelle der Fehlercodes Alle Routinen haben die gleiche Struktur, unterscheiden sich jedoch durch die gespeicherten und angezeigten Fehlercodes voneinander. Sie wurden trotzdem getrennt implementiert, da auch unterschiedliche Reaktion auf verschiedene Fehler denkbar wären. Ein Fehler der Kategorie Sonstige“ muss beispielsweise nicht direkt zum ” Übergang in den sicheren Zustand führen, da durch gezielte Maßnahmen der Fehler behoben und der Betrieb fortgesetzt werden kann. Abbildung 4.7 zeigt die Struktur der Fehlerroutinen. Tabelle 4.6 zeigt die visuelle Ausgabe der Fehlercodes auf den LEDs, in der der gelb hinterlegte Port den definierten Ausgang zeigt. Im Fehlerfall ist dieser, ebenso wie im Betriebsbereitschaftsmodus, auf Low gesetzt. Abbildung 4.7: Struktur der Fehlerroutinen 4.5.3 Watchdog Wenn im Programm eines µC unerwartete oder unentdeckte Fehler auftreten, kann es passieren, dass sich der Programmablauf auf eine unvorhergesehene Weise ändert. Um solche Fehler zu entdecken, verfügt der µC über einen Watchdog. Dieser funktioniert nach dem Prinzip eines Weckers. Ist er einmal gestartet, zählt er bis zu einer gewissen Zahl und schlägt beim Erreichen Alarm. Der Alarm hat zur Folge, dass ein Reset das System neu startet, um zum planmäßigem Programmablauf zurück zu kehren. Damit dies nicht geschieht, muss der Watchdog während der Programmab- Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 4.5 Fehlerbeherrschende Maßnahmen Seite 35 laufs ständig zurück gesetzt werden. Dies muss so oft geschehen, dass der Watchdog bei planmäßigem Ablauf keinen Alarm erzeugt. Wird der Ablauf gestört oder verlassen, geschieht das Zurücksetzten des Watchdog nicht, wodurch ein Zähler abläuft, was zu einem Reset führt. [Schae08, S. 176ff] Während der Initialisierung wird überprüft, ob ein Reset durch den Watchdog statt gefunden hat. Ist dies der Fall wird überprüft, ob der Reset beabsichtigt durch die Testung des Watchdogs herbei geführt wurde (vgl. Abschnitt 5.2.1, S. 46) oder ob es sich um einen unplanmäßigen Reset handelt. Ist letzteres der Fall, wird die Fehlerroutine des Watchdogs aufgerufen, die das System in den sicheren Zustand überführt und eine entsprechende Fehlermeldung ausgibt. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5 Selbsttests Seite 36 5 Selbsttests Um die korrekte Verarbeitung der Daten durch den µC sicher zu stellen, wurden diverse Selbsttests implementiert. Diese Tests können sowohl einzelne Befehle des Befehlssatz, komplette Speicherbereiche als auch die angeschlossene Peripherie auf ihre korrekte Funktion prüfen. Die Selbsttests sind dem Reports 7/06 des BGIA [BGIA06] entnommen und auf den ATMega169P angepasst worden. Da die im Report genannten Tests auf den damals verwendeten Siemens µC zugeschnitten sind und sich dessen Befehlssatz stark von dem des ATMega169P unterscheidet, waren sie auf dem hier verwendeten µC nicht einsatzfähig. Trotzdem dienten sie als Vorlage, indem sie sinn- und funktionsgemäß auf den Befehlssatz des ATMEL µC übertragen wurden. Darüber hinaus mussten die umgesetzten Tests um einige Elemente erweitert werden, damit sie zur Laufzeit des Systems ausgeführt werden können ohne den Programmablauf zu stören. Die Tests aus dem Report speichern keine Registerwerte vor dem Testbeginn, so dass eventuell vorhandene Daten durch die verwendeten Testdaten überschrieben werden. Auf einem System im Produktiveinsatz würde dies zur Veränderung der Datenverarbeitung und des Programmablaufs führen, wodurch selbst ein korrekt funktionierendes System nicht wie vorgesehen arbeiten würde. Daher müssen diese Werte vor Beginn eines Tests gespeichert und anschließend Wiederhergestellt werden. Bei Inbetriebnahme des Rechnersystems wird ein Anlauftest gestartet, in dem alle Tests einmal durchgeführt werden. Ist dieser Initialtest positiv verlaufen, wird das ausführende Programm gestartet. Während der Laufzeit werden zyklisch weitere Tests aufgerufen, um den korrekten Ablauf zu prüfen. Sowohl beim Initialtest als auch zur Laufzeit führt ein unerwartetes Ergebnis eines Selbsttests dazu, dass eine Fehlerroutine ausgelöst wird, die den Fehlercode wie in Abbildung 4.6 (S. 34) ausgibt und in den Festwertspeicher schreibt. Eine wichtige Eigenschaft von Selbsttests ist die Dauer, die sie für eine Bearbeitung benötigen. Selbsttests sollen im Hintergrund laufen und den planmäßig vorgesehenen Arbeitsablauf nicht behindern. Aus diesem Grund ist es wichtig, die Tests in möglichst kurzer Zeit durchführen zu können. [Klug97] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 37 5.1 CPU-Tests Die grundlegendste Kategorie von Selbsttests ist die, die die Befehle des µC prüfen. Da es sich bei diesen Tests des Befehlssatzes um sehr hardwarenahe Programmabläufe handelt, wurden sie in Assembler verfasst. In einer Hochsprache wie C wären der größere Teil dieser Tests nicht sinnvoll realisierbar, da auf Programmabläufe und die verwendeten Befehle kein genauer Einfluss genommen werden kann. Die Art der Übersetzung des Programms von einer Hochsprache in die Maschinensprache Assembler hängt stark vom eingesetzten Compiler und dessen Konfiguration ab. Selbst wenn es möglich wäre alle Tests in einer Hochsprache zu verfassen, so könnte im Fehlerfalle nicht die genaue Fehlerursache erkannt werden, da keine absolute Gewissheit über den Programmablauf auf Hardwareeben besteht. Die implementierten Selbsttests für das Instruction Set gliedern sich in sechs Gruppen: • Arithmetische Tests • Registertests • Push-Pop-Return-Jump-Test • Tests der logischen Operationen • Tests der Bit-Operationen • Tests der Transfer-Befehle 5.1.1 Arithmetische Tests Mit den arithmetischen Tests werden, wie der Name schon verrät, die arithmetischen Befehle des µCs getestet. Dazu gehören Grundrechenarten wie das Addieren, das Subtrahieren und das Multiplizieren von Zahlen aber auch spezielle Anweisungen wie das In- und Dekrementieren von Registerinhalten. Die Division wird dabei nicht mittels direktem Befehl durchgeführt und getestet, sondern durch eine Kombination aus Subtraktion und Schiebe-Operationen ersetzt. Dies ist nötig, da der ATMega169P über keine Hardware-Divisionseinheit verfügt. Trotzdem ist die Division durch die Selbsttests abgedeckt, da sowohl die Subtraktion als arithmetischer Befehl als auch die Schiebe-Operation als Bit-Operation durch Selbsttests geprüft werden. Werden diese Tests ohne Probleme durchgeführt, kann davon ausgegangen werden, dass auch eine Division einwandfrei funktionieren wird. Anders als die anderen Tests des Befehlssatzes, könnten sie in einer Hochsprache formuliert werden, wodurch sie auf andere Systeme portiert werden könnten. Da diese Gruppe der Tests jedoch die einzige mit dieser Möglichkeit ist und durch Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 38 die Verwendung einer Hochsprache anderweitig Probleme auftreten würden, wurde davon abgesehen. Addition Bei diesem Test wird die korrekte Verarbeitung der Addition zweier Zahlen überprüft, indem zwei, mit speziellen Testwerten vorbereiteten, Register addiert werden und anschließend das Ergebnisses im Zielregisters mit dem Sollwert verglichen wird. Sollte der Wert nicht der Erwartungshaltung entsprechen, wird eine Fehlerroutine ausgelöst. Abbildung 5.1 zeigt den Programmablauf des ADD-Tests. Abbildung 5.1: Programmablauf des Tests für die Addition 1 ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ADD TEST ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 2 ADD TEST : 3 PUSH R31 4 PUSH R30 5 LDI R31 , 0xAA ; Testmuster 1 l a d e n 6 LDI R30 , 0 x55 ; Testmuster 2 l a d e n 7 ADD R31 , R30 ; Befehlstest 8 R31 , 0xFF ; V e r g l e i c h mit Erwartungshaltung CPI 9 BRNE 10 JMP ; alte Registerwerte speichern ADD err ARI END1 11 12 ADD err : 13 CALL testError Quellcode 5.1: Selbsttest der Addition Die Dauer des Selbsttests, dargestellten in Quellcode 5.1, beträgt weniger als 20 Zyklen, da der ATMega169P den Großteil aller Befehle seines Befehlssatz in einem Zyklus abarbeiten kann. Bei einem Takt von acht Megahertz dauert der Test weniger als 2 21 µs. Zu beachten ist, dass dieser Test nicht nur zu Beginn des Programms, Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 39 sondern auch während der Laufzeit ausgeführt wird. Daher müssen die Registerwerte gespeichert werden, bevor sie durch die Testwerte überschrieben werden, um Datenverlust und damit Fehler des Programms zu vermeiden. Subtraktion Die Funktion zur Testung der Subtraktion (SUB) ist vom Prinzip identisch mit der der Addition. Die Unterschiede sind auf die verwendeten Testwerte sowie den eingesetzten Befehl beschränkt. Addition mit Beachtung des Carry-Flag Ähnlich verläuft auch der Test des Befehls für die Addition mit dem Carry-Flag (ADDC), der von Bedeutung ist, wenn die Summe der zwei zu addierenden Zahlen die Grenze von 255, dem maximalen Wert eines 8 Bit-Registers, überschreitet. Ist dies bei einer Addition der Fall, wird der Überlauf, das sogenannte Carry-Flag gesetzt. Somit kann das Ergebnis im höheren Register angepasst werden, indem das CarryFlag mittels dem ADDC-Befehl bei der nächsten Addition mit berücksichtigt und dazu addiert wird. Additionen deren Summe die Registerobergrenze überschreiten, müssen immer mit einer Kombination mehrere Register durchgeführt werden. In der Regel werden dazu zwei 8 Bit Register zu einem 16 Bit Register verknüpft. Dabei stehen die unteren 8 Bit im Low- und die oberen 8 Bit im High-Register. Der ADDC-Test - PAP in Abbildung 5.2 - prüft jedoch nur, ob das Carry-Flag bei einem Überlauf gesetzt wird und ob der Befehl das korrekte Ergebnis berechnet. Abbildung 5.2: Programmablauf des ADDC-Tests Weitere arithmetische Tests Weiterhin wurden die Befehle für die In- und Dekrementierung (INC und DEC) sowie der Befehl für die vorzeichenlose Multiplikation (MUL) auf ihre korrekte Funktion Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 40 geprüft. Das Prinzip hinter den Tests dieser Befehle ist das gleiche, wie bei den oben aufgeführten Tests. Vorbereitete Testregister werden mit definierten Speicherwerten geladen. Anschließend wird die zu testende Operation durchgeführt und das Ergebnis mit dem erwarteten Wert verglichen. 5.1.2 Registertests Wie in Abschnitt 3.1.1 (S. 15) erläutert, besitzt der ATMega169P 32 Arbeitregister, die den klassischen Akkumulator ersetzen. Um die korrete Verarbeitung der Daten in den Arbeitsregistern sicher zu stellen, müssen sie getestet werden. Dazu wird eine 1 in das zu testende Register geladen und anschließend bis zu acht mal nach links geschoben wird. Diese 1 soll nun durch das Register durchgewandert sein und im Carry-Flag stehen. Ist dies nicht der Fall und die 1 steht noch im Register oder ist sie früher in das Carry-Flag verschoben worden, so liegt ein Fehler des Registers vor und eine Fehlerroutine wird aufgerufen. Der abstrahierte Programmablauf kann der Abbildung 5.3 entnommen werden. Abbildung 5.3: Programmablauf der Registertests Die Dauer eines Register-Tests beträgt etwa fünf µs. Das bedeutet, dass insgesamt circa 150 µs benötigt werden, um alle 32 Arbeitsregister zu testen. Die genannte Zeit bezieht sich nur auf die Selbsttests. Hinzu kommt noch die von der aufrufenden Methode benötigte Zeit zum Starten des nächsten Tests. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 41 5.1.3 Push-Pop-Return-Jump-Test Dieser Selbsttest ist der komplexeste implementierte Test. Durch diesen Test werden vier eng verwandte Befehle getestet. Die Befehle PUSH und POP dienen zur Verarbeitung der Daten auf dem Stack. Mit dem PUSH-Befehl werden Werte auf dem Stack abgelegt, die mit dem POP-Befehl wieder vom Stack geholt werden können. Der Stack ist beim ATMega169P so angelegt, dass er sein Ende an der höchsten Speicheradresse hat und in tiefere Speicherbereiche wächst. Daher wird der Stackpointer beim Ablegen von Daten auf dem Stack dekrementiert und beim Lesen vom Stack inkrementiert. Der RETURN-Befehl setzt den Programmzähler auf die Adresse, die auf dem Stack abgelegt ist. Er wird für die Rückkehr aus einer Interruptoder Subroutine benutzt. Der letzte getestete Befehl ist der JUMP-Befehl. Dieser ist nicht vom Stack abhängig. Er ähnelt jedoch dem RETURN-Befehl, da er auch den Programmzähler auf eine Adresse setzt, die im Gegensatz zum RETURN-Befehle aber fest vorzugeben ist. Der Programmablauf des Tests ist in den Abbildungen 5.4, 5.5 und 5.6 in drei Abschnitte unterteilt. Abbildung 5.4: Abschnitt 1 des PPRJ-Test: PUSH-Test Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 42 Abbildung 5.4 zeigt den ersten Abschnitt des Tests, der die PUSH-Operation testet. Die gelb eingefärbten Anweisungen stellen den Anfang des nächsten Testbereichs dar. Im ersten Testbereich wird getestet, ob bei einem PUSH der Stackpointer korrekt dekrementiert wird. Dazu wird der Stackpointer vorher gespeichert und dieser Wert als Erwartungswert genutzt. Nach dem PUSH-Befehl muss der neue Wert des Stackpointers um Eins kleiner sein als der Erwartungswert. Ob der gepushte Wert auch korrekt auf dem Stack vorliegt, wird im zweiten Bereich überprüft. Der auf dem Stack liegende Wert wird dazu mit dem geschriebenen Wert verglichen. Abbildung 5.5: Abschnitt 2 des PPRJ-Test: POP-Test Im zweiten Abschnitt des PPRJ-Test, der in Abbildung 5.5 schematisch dargestellt ist, wird die Funktionsweise der POP-Operation getestet. Dabei wird im ersten Schritt geprüft, ob der Befehl einen Wert korrekt vom Stack ausliest. Zu diesem Zweck wird der im ersten Abschnitt des PPRJ-Tests auf Korrektheit geprüfte Wert vom Stack gelesen und mit dem Erwartungswert verglichen. Im zweiten Schritt wird die Inkrementierung des Stackpointers überprüft. Nach einem POP muss der Stackpointer um Eins erhöht werden. Verglichen wird mit der im ersten Abschnitt genommenen Stackpointerposition. Abschnitt drei, dargestellt in Abbildung 5.6, testet abschließend den RETURNBefehl. Hierbei wird die Adresse einer definierten Funktion auf den Stack gelegt und der RETURN-Befehl aufgerufen. Das Programm muss nun in die Funktion springen. Geschieht dies nicht, läuft das Programm in eine Fehlerroutine. Hat der Sprung funktioniert, so wird im zweiten Bereich der JUMP-Befehl getestet. Dieser soll das Programm in die abschließende Methode springen lassen, in der die Register wieder Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 43 Abbildung 5.6: Abschnitt 3 des PPRJ-Test: RETURN und JUMP-Test hergestellt werden und das System in seinen normalen Programmablauf zurückkehrt. Wie beim RETURN-Befehl läuft das Programm in eine Fehlerroutine, falls die JUMP-Operation versagt. Bei einer mittleren Zeit von zwei Zyklen pro Befehl, beträgt die Gesamtdauer des PPRJ-Test etwa 125 Zyklen. Der ATMega169P führt jedoch einen großen Teil seiner Befehle in einem Zyklus aus, wodurch die tatsächliche Dauer des Tests unter diesem Wert liegen wird. Bei exakt acht MHz würde dieser Test weniger als 16 µs brauchen. 5.1.4 Test der logischen Operationen Eine weitere Art von Operationen, die getestet werden müssen, sind die logischen Operationen. Dazu gehören die Befehle für die UND-Verknüpfung (AND), die ODERVerknüpfung (OR) sowie das EXCLUSIVE ODER (EOR). Diese Operationen werden benutzt, um Bits logisch miteinander zu verknüpfen, was bei Embedded Systems und der Programmierung von µC sehr oft für die Zuweisung von Werten zu Register und Speicherbereiche verwendet wird. Die Tests der logischen Operationen haben eine sehr hohe Ähnlichkeit zu den arithmetischen Tests. Bei allen Tests werden vorher festgelegte Testwerte, meistens Schachbrettmuster - Werte deren Bits abwechselnd gesetzt sind - in verschiedene Register geladen. Danach werden diese Register logisch miteinander verknüpft und der erhaltene Wert mit einem Erwartungswert verglichen. Abbildung 5.7 demonstriert einen möglichen Testablauf. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.1 CPU-Tests Seite 44 Abbildung 5.7: Programmablauf des Test der logischen AND-Verknüpfung 5.1.5 Tests der Bit-Operationen Bei Bit-Operationen handelt es sich um Befehle, die dazu dienen, Registerinhalte zu manipulieren. Zu den Bit-Operationen gehören folgende Befehle: • Löschen (CLR) • Invertieren (COM) • Vertauschen der Nibbles (4 Bit) (SWAP) • Verschieben (LSL & LSR) • Rotieren (ROL & ROR) Der Unterschied zwischen einer Schiebe- und einer Rotations-Operation ist der Umgang mit dem Carry-Flag. Während die Schiebe-Operationen das Register nur um eine Stelle nach links oder rechts schiebt und das erste, nun frei gewordene Bit durch eine 0 ergänzt wird, rotiert die Rotations-Operation das Register über das Carry-Flag. Dabei wird das Carry-Flag an der leer gewordenen Stelle eingefügt und anschließend das überstehende Bit in das Carry-Flag geschoben. Bei einer Schiebeoperation wird das heraus geschobene Bit zwar auch im Carry-Flag gespeichert, jedoch bei einer weiteren Verschiebung nicht wieder eingefügt. Die Registertests zeigen eine beispielhafte Verwendung für das Carry-Flag bei einer Schiebe-Operation. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 45 1 ; ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ LSL TEST ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 2 LSL TEST : 3 PUSH R31 ; Registerwerte speichern 4 LDI R31 , 0xAA ; Testmuster 1 l a d e n 5 LSL R31 ; Befehlstest 6 CPI R31 , 0 x54 ; V e r g l e i c h mit Erwartung . . 7 BRNE LSL err ; . . wenn u n g l e i c h , F e h l e r 8 POP R31 ; Registerwerte wieder h e r s t e l l e n 9 RET 10 11 LSL err : 12 CALL testError ; S p r i n g e i n Routine d e r Fehlermeldung Quellcode 5.2: Selbsttest der bitweisen Verschiebung nach links Beispiel 5.2 zeigt den Quellcode des Tests für die bitweise Verschiebung nach links. Sowohl beim Rotations- als auch beim Test der Schiebeoperation ist der Ausgangswert 0xAA. Nach einer Ausführung ist der Erwartungswert des LSL- sowie des ROL-Befehls 0x54. Eine weitere Durchführung der Befehle zeigt den Unterschied. Während das Ergebnis der LSL-Operation 0xA8 lautet, ist das Ergebnis der ROLOperation 0xA9, da die in der ersten Ausführung überstehende Eins in das CarryFlag verschoben wurde und nun wieder eingefügt wird. 5.1.6 Test der Transfer-Befehle Um Werte aus dem Speicher auszulesen und in ein Register zu schreiben oder um Registerinhalte in andere Register zu kopieren, werden die Transfer-Befehle benötigt. Die implementierten Selbsttests der Transfer-Befehle prüfen die Befehle für das direkte und das indirekte Laden von Registern (LDI & LD) sowie die Befehle, um einzelne Register oder ein Registerpaar zu kopieren (MOV & MOVW). Auch hier wird das Ergebnis einer Operation mit vorgegebenen Anfangs- und Erwartungswerten verglichen. Beim Test des LD-Befehls für die indirekte Beladung eines Registers, wird der Wert jedoch zuvor auf den Stack geschrieben und von dort mittels Pointer in das Register gelesen. Abbildung 5.8 zeigt den Programmablauf des LD-Tests. Die weiteren Transfer-Befehle werden nach dem selben Schema geprüft. 5.2 Peripherie Tests Neben dem Befehlssatz muss auch die Peripherie getestet werden. Damit ist zum einen der Watchdog gemeint, der elementar für den sicheren Betrieb eines Systems ist. Zum anderen werden beide vorhandene Ports darauf getestet, ob sie ein Signal Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 46 Abbildung 5.8: Test des Befehls für das indirekte Laden von Registern fehlerfrei ausgeben bzw. einlesen können. Weiterhin können wichtige Komponenten wie ADC, Speicher oder Taktgeber getestet werden. Da durch die Verwendung eines JTAG-Adapters zur Erstellung des Systems der ADC nicht genutzt werden kann (vgl. Abschnitt 3.2.3, S. 19), wird dieser auch nicht getestet. Auch die korrekte Funktionsweise des Taktgebers wird nicht direkt getestet, ein fehlerhaftes Verhalten des Oszillators würde aber über die mehrkanalige Struktur und die Synchronisation aufgedeckt werden. 5.2.1 Watchdog Um sicher zu gehen, dass diese Notfallmaßnahme voll funktionstüchtig ist, wird der Watchdog während des Systemstarts überprüft. Dazu wird überprüft, ob dieser nach Ablauf der eingestellten Zeit einen Systemreset ausführt. Geschieht dies nicht, ist die Funktion des Watchdog gestört und das System wird über die Fehlerroutine in den sicheren Zustand überführt. Während bei allen Tests ein Anfang und ein Ende definiert ist - wenn kein Fehlerfall eintritt - so ist dies beim Test des Watchdog nicht möglich. Verläuft der Test positiv, arbeitet der Watchdog wie erwartet und startet das System neu, womit alle gespeicherten Werte in den Registern verloren gehen. Um dennoch auf zur Auswertung des Tests benötigte Daten zurückgreifen zu können, müssen diese in einem nicht flüchtigen Speicher festgehalten werden. Der ATMega169P verfügt über beschreibbaren Festwertspeicher in Form von EEPROM. Jede Speicherzelle des EEPROM ist nach einer gewissen Anzahl von Schreib/Lösch-Zyklen nicht mehr funktionsfähig. Diese Anzahl beträgt beim ATMega169P mindestens 100.000 Zyklen [ATM08a, S. 22]; deshalb kann sie für den eingesetzten Evaluationszweck vernachlässigt werden, da während einer Betriebsabfolge nur maximal ein Schreib/Lösch-Zyklus pro Zelle durchgeführt wird. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 47 Ist der Status gespeichert, kann nach einem Reset geprüft werden, ob das System aufgrund eines WD-Tests neu gestartet wurde. Dies geschieht in der Routine, die das System nach einem WD-Reset in den sicheren Zustand überführen soll. Quellcode 5.3 zeigt diese Routine. 65 iWDStatusFlag = eepromRead ( iWDSpeicher ) ; 66 67 // WD−Routine , wenn S y s t e m r e s e t durch WD 68 i f ( (MCUSR & ( 1 << WDRF) ) ) { 69 MCUSR = 0 ; 70 wdt disable () ; 71 i f ( iWDStatusFlag != 1 ) { 72 wdError ( ) ; } 73 74 } 75 // WD−Test , wenn T e s t s a k t i v & v o r h e r k e i n WD−Test 76 i f ( iWDStatusFlag != 1 && i T e s t F l a g ) { 77 startTest (99) ; 78 } 79 // s o n s t l ö s c h e Watchdog−Flag und TestNr 80 e l s e i f ( iTestFlag ){ 81 eepromWrite ( iWDSpeicher , 0 ) ; 82 iTestStat = 0; 83 } Quellcode 5.3: Watchdog-Prüfroutine am Programmbeginn Der Watchdog-Test ist der einzige Selbsttest, der nicht zur Laufzeit ausgeführt werden kann. Er wird daher zyklisch ausgeführt, sondern nur einmalig beim Start des Systems. Die Routine zum Aufrufen des Tests kann ebenfalls dem Quellcode 5.3 entnommen werden. Quellcode 5.4 zeigt die Watchdog-Testroutine. Da der Watchdog auf 15 ms eingestelklt wurde und somit diese Zeit bis zum Auslösen des Watchdogs gewartet werden muss, ist auch die Dauer dieses Tests größer als 15 ms. Mit diesem Testverfahren ist es nur möglich zu erkennen, ob der Watchdog nach der vorgegeben Wartezeit reagiert hat oder nicht. Ein verfrühtes oder verzögertes Reagieren kann nicht erkannt werden, da eine Alarmmeldung vor Ablauf der 15 ms den Test positiv verlaufen lassen würde, während eine Verzögerung hierbei einem Ausfall gleich kommen würde. Die Ermittlung der exakten Laufzeit bis zu einem Reset des Watchdogs ist fast unmöglich, da dazu zum einem der genaue Zeitpunkt des Resets festgehalten werden müsste und zum anderem eine Berechnung der Laufzeit, aufgrund getrennter Oszillatoren für das System und den Watchdog, nur schwer möglich ist. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 48 266 // Watchdog−T e s t r o u t i n e 267 v o i d WDTest ( ) { 268 eepromWrite ( i S p e i c h e r 3 , 1 ) ; // WD−Test−S t a t u s => EEPROM w d t e n a b l e (WDTO 15MS) ; // Watchdog a u f z i e h e n 269 270 271 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 272 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 273 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 274 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; // Warten // k e i n WD−Reset = D e f e k t 275 276 277 testError () ; // i n Fehlermeldung s p r i n g e n } Quellcode 5.4: Watchdog-Test 5.2.2 Tests der integrierten Timer Timer werden - wie schon der Watchdog - zur Kontrolle des korrekten Programmablaufs genutzt. Um deren Funktionalität zu verifizieren, wurden auch dafür Selbsttests implementiert. Dieses Tests aktivieren die Timer für eine definierte Zeit und vergleichen im Anschluss die Erwartungswerte mit den generierten Werten aus den Timerregistern. Im Detail wird der Timer fünfmal für eine Dauer von einer ms aktiviert. Stimmen im Anschluss die Testergebnisse mit den festgelegten Erwartungswerten überein, wird davon ausgegangen, dass die Timer wie erwartet arbeiten. Da die Timer zum Teil kontinuierlich laufen und, ähnlich wie beim Watchdog, nur zu bestimmten Zeiten eine Rückstellung stattfindet, werden auch diese Tests nicht zur Laufzeit durchgeführt. Stattdessen werden sie zu Beginn des Programms, noch vor den Anlauftests, eingeleitet. Abbildung 5.9 zeigt die Struktur der Tests. Alle Timer, unabhängig davon ob es sich um einen 8- oder einen 16-Bit Timer handelt, werden auf die gleiche Art und Weise getestet. Bei einer fehlerhaften Taktfrequenz, durch ungenaue oder nicht korrekte Arbeitsweise des Oszillators, kann die Laufzeitdauer der Warteschleife von dem erwarteten Wert abweichen. Da aber sowohl die Warteschleife als auch der Timer von der Taktfrequenz des µC abhängig sind, führt dies nicht zu einem Fehler, solange diese Einheiten korrekt Arbeiten. Aus diesem Grund kann mit diesem Test nicht festgestellt werden, ob der Timer zeitlich exakt läuft, sondern nur ob dieser wie vorgesehen abhängig von der Taktfrequenz seine Schritte ausführt. Der Watchdog dient zur zeitlichen Begrenzung, um auch bei einer Fehlfunktion des Tests diesen zu terminieren. Eine Kontrolle der Laufzeitdauer erfolgt jedoch Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 49 Abbildung 5.9: Test der Timer auf korrekte Funktionsweise nicht. Eine fehlerhafte Taktfrequenz kann, je nach Ausprägung der Ungenauigkeit, durch die Synchroninsation erkannt werden. 5.2.3 RAM-Test Der flüchtige Speicher (Random Access Memory, RAM) wird vorwiegend für temporäre Speicherung von Daten genutzt. Da es sich um flüchtigen Speicher handelt, gehen bei einem Spannungsverlust oder dem Neustart des Systems die zuvor gespeicherten Daten verloren. Um bei der Verwendung des RAMs die Integrität der Daten zu gewährleisten, wird dessen Funktionalität durch einen implementierten Selbsttest sichergestellt. Dieser prüft die einzelnen Zellen des Speichers, indem Testwerte, die zuvor gespeichert wurden, ausgelesen und mit Erwartungswerten verglichen werden. Verläuft dieser Vergleich positiv, wird davon ausgegangen, dass diese Speicherzelle intakt ist. Die Dauer des RAM-Tests hängt stark von Größe und Art der Prüfung ab. Im Testsystem wurde dieser Test sinnvollerweise in mehrere Testdurchläufe zerlegt, um das System nicht übermäßiglang mit einem einzelnen Test zu beanspruchen. In diesem speziellen Test wird jede Zelle mit zwei Schachbrettmustern versehen, die feststeckende Bits erkennbar machen. Zu diesem Zweck wird der zuvor in der Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 50 Zelle befindliche Wert zwischen gespeichert um nach Abschluss des Tests wiederhergestellt werden zu können. Die Anzahl der getesteten Zellen kann dabei mithilfe der Variable iRamTestLaenge aus der Testbibliothek variiert werden. Bei dem zyklischen Durchlauf ist diese fix - zehn Zellen -, kann jedoch bei anderen Arten der Testaufrufung (vgl. Abschnitt 5.3, S. 5.3) variiert werden, um eine möglichst optimale Testrate zu erreichen. Quellcode 5.5 zeigt die zwei Routinen des RAM-Tests. In der ersten Routine wird Start- und Endzelle des einzelnen Tests definiert, womit im zweiten Schritt die zweite Routine aufgerufen wird, die den eigentlichen RAM-Test durchführt. 193 // Routine f ü r den e i n f a c h e r e n RAM−Test 194 v o i d Ram Test ( ) { 195 // Pr üfen ob Prüfrahmen über Ramende h i n a u s 196 i f ( ( c E r s t e R a m Z e l l e + i T e s t L a e n g e ) > RamE) { 197 // Wenn ja , b i s zum Ende pr üfen , 198 u n s i g n e d i n t iTestLaengeTemp = ( c E r s t e R a m Z e l l e + i T e s t L a e n g e ) − RamE; 199 Ram Check ( cErsteRamZelle , RamE) ; 200 // P o i n t e r a u f Anfang s e t z t e n 201 c E r s t e R a m Z e l l e = RamA; 202 // und r e s t l i c h e Z e l l e n p r ü f e n 203 Ram Check ( cErsteRamZelle , ( c E r s t e R a m Z e l l e + iTestLaengeTemp ) ) ; 204 } 205 else 206 // Ram Test d u r c h f ü h r e n . 207 Ram Check ( cErsteRamZelle , ( c E r s t e R a m Z e l l e + i T e s t L a e n g e ) ); 208 209 // Ramzelle a u f n ä c h s t e Z e l l e s e t z e n 210 // ( f a l l s Ramende , dann a u f Ramanfang ) 211 cErsteRamZelle = cErsteRamZelle + 1 ; 212 i f ( c E r s t e R a m Z e l l e > RamE) 213 c E r s t e R a m Z e l l e = RamA; 214 215 } 216 217 218 // e i g e n t l i c h e r Ram Test 219 v o i d Ram Check ( u n s i g n e d c h a r ∗ cStartAddr , u n s i g n e d c h a r ∗ Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 51 cEndAddr ) 220 { 221 unsigned char cOriginalByte ; 222 v o l a t i l e u n s i g n e d c h a r ∗ cTestAddr ; 223 224 f o r ( cTestAddr = cStartAddr ; cTestAddr < cEndAddr ; cTestAddr++ ) { 225 c O r i g i n a l B y t e = ∗ cTestAddr ; // O r i g n a l w e r t s p e i c h e r n ∗ cTestAddr = 0 x55 ; // T e s t w e r t e l a d e n und 226 227 Pr üfen i f ( ∗ cTestAddr != 0 x55 ) 228 229 testError () ; 230 231 ∗ cTestAddr = 0xAA ; 232 i f ( ∗ cTestAddr != 0xAA ) 233 testError () ; 234 ∗ cTestAddr = c O r i g i n a l B y t e ; 235 // O r i g i n a l w e r t wiederherstellen } 236 237 } Quellcode 5.5: RAM-Test 5.2.4 ROM-Test Anders als das RAM, ist der Nur-Lese-Festwertspeicher (Read only Memory, ROM) ein nicht flüchtiger, aber auch nicht beschreibbarer Speicher, in dem meistens das Programm zur Steuerung des Systems abgelegt wird. Daher ist es wichtig, dass dieser Speicher fehlerfrei ist, denn selbst ein einzelnes gekipptes Bit kann den Programmablauf im Worst-Case derartig verändern, dass eine gefährliche Sitation eintritt. Der Programmspeicher des ATMega169P ist als Flash-EEPROM realisiert, das, wie auch der verbaute EEPROM, nur eine bestimmte Anzahl an Schreib-/LöschZyklen verfügt in der die korrekte Beschreibung gewährleistet ist (vgl. Abschnitt 3.1.1, S. 15). Geprüft wird der Programmspeicher, indem über dessen Inhalt eine Prüfsumme mittels einer zyklische Redundanzprüfung (Cyclic Redundancy Check, CRC) gebildet wird. Als eingesetzte Verfahren kommt CRC-CCITT, auch als CRC16 bekannt, zum Einsatz. Das CRC-Verfahren nutzt zur Bildung der Prüfsumme die Polynomdivision. Hierbei werden die Nutzdaten Byteweise durch ein Generator-Polynom - x^16+x^12+x^5+1 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 52 beim CRC-CCITT-Verfahren - dividiert. Dies geschieht solange, bis alle Nutzdaten abgearbeitet wurden, wobei immer der Rest einer einzelnen Berechnung mit dem nächsten Byte verknüpft wird. Der nach Abschluss der Division verbleibende Rest ist die Prüfsumme, die zur Prüfung der Validität der Daten genutzt wird Beim ROM-Test wird eine aus dem Inhalt des Programmspeichers gebildete Prüfsumme an einer festen Adresse im EEPROM abgelegt. Sie dient als Erwartungswert für den Algorithmus, der zur Laufzeit ebenfalls eine Prüfsumme über den Programmspeicher bildet. Der Speicherinhalt wird dabei durch das gleiche Generator-Polynom dividiert, das auch bei der Prüfsummenbildung verwendet wurde, so dass bei korrekter Speicherfunktion ein identischer Rest als Ergebnis verbleibt. Stimmt das errechnete Ergebnis des ROM-Tests mit dem vorher gebildeten Erwartungswert überein, so sind die Daten im Programmspeicher integer. Abbildung 5.10 zeigt die Struktur des ROM-Tests. Abbildung 5.10: Struktur des ROM-Tests. Zu beachten ist, dass die Bearbeitungsdauer des ROM-Tests, bei einem Test des kompletten Speicherbereiches, sehr hoch ist. Dieser erstreckt sich von 0x0000 bis 0xEFFF, was 61439 Speicherzellen entspricht. Um die Unterbrechung des eigentlichen Programms durch den ROM-Test auf ein vertretbares Maß reduzieren zu können, wurde eine Durchführung in mehreren kleinen Schritten vorgesehen. Dazu kann anhand der Variable iFlashTestLaenge die Anzahl der pro Zyklus auszulesenden Speicherzellen eingestellt werden. Nachdem der komplette Speicherbereich ausgelesen wurde, findet der Vergleich mit der Erwarteten CRC-Prüfsumme statt. Weiterhin muss bei jeder Programmänderung ein neuer Erwartungswert berechnet und in das EEPROM übertragen werden, da selbst kleine Änderungen im Quellcode, wozu auch Kommentare und Leerzeilen zählen, den Inhalt des Programmspeichers verändern. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.2 Peripherie Tests Seite 53 5.2.5 Ports als Ein- und Ausgänge Um Ein- und Ausgaben zu realisieren, benötigt ein µC Ports. Auf dem Butterflyboard wird beispielsweise das verbaute LCD-Display über verschiedene Ports angesteuert. Um die korrekte Funktionsweise der Ports zu gewährleisten, müssen diese getestet werden. Zu diesem Zweck müssen in dem System dieser Arbeit zwei Ports miteinander verbunden werden, um ein auf dem einen Port ausgegebenes Signal auf dem anderen Port einzulesen und auf Korrektheit zu prüfen. Dabei ist zu beachten, dass Ports, die vom Programm als Ausgänge genutzt, auch als Ausgänge im Test geprüft werden. Dementsprechend müssen vorgesehene Eingänge in den Test als Eingänge fungieren. Der Aufbau des Systems in der zweiten Revision sah keine entsprechenden Vorkehrungen vor, um beide Ports miteinander zu verbinden. Weitere Ports die zur Laufzeit des Programms genutzt werden können, sind auf dem Butterfly nicht vorhanden, wodurch es notwendig ist den Test außerhalb des regulären Programmablaufs durchzuführen. Daher wurde Revision 3 mit entsprechenden Verschaltungsmöglichkeiten realisiert (vgl. Abschnitt 3.3, S. 20). Der Test beinhaltet zwei mögliche Testabläufe. Bei der ersten Möglichkeit, im Quellcode 5.6 als Prüf-0-Test bezeichnet, wird an dem ausgehenden Port eine laufende 0 angelegt. Das heißt, dass alle Pins, bis auf einen, auf 1 gesetzt werden. Begonnen wird mit Pin 0. Anschließend wird geprüft, ob am eingehenden Port der korrekte Wert anliegt. Sofern dies der Fall ist, wird Pin 0 auf 1 und Pin 1 auf 0 geschaltet und die Prüfung wiederholt. Dies wird solange durchgeführt, bis alle Pins einzeln durchgeschaltet wurden. Die andere Möglichkeit - Prüf-1-Test - vertauscht die Zustände. Statt einer 0 wird eine laufende 1 angelegt. Beide Tests können einen feststeckenden (stuck-at) Pin identifizieren. Sollte der ausgegeben Wert nicht mit dem zurück gelesenen Wert übereinstimmen, so ist einer der beiden Ports defekt. Um jedoch heraus zu finden, welcher der verwendeten Ports den Wert nicht korrekt übermittelt hat, muss der Test mit einem drittem Port zur Kontrolle wiederholt werden. Dies ist mit dem Butterflyboard jedoch nicht möglich, da es nur zwei Ports zur weiteren Verarbeitung nach außen leitet. Für das in der Arbeit beschriebene Testszenario genügt es, den Fehlerfall zu erkennen, um das System in den sicheren Zustand zu überführen. 151 // Methode um d i e P o r t s a u f k o r r e k t e Funktion zu ü b e r p r ü f e n 152 v o i d PortTes t ( ) { 153 u i n t 8 t iPruefVar = 0; // Pr üf−V a r i a b l e 154 i n t iDDRB = DDRB; // Port−Zustände s p e i c h e r n 155 i n t iDDRD = DDRD; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.3 Bibliothek der Tests Seite 54 156 i n t iPortB = PORTB; 157 i n t iPortD = PORTD; 158 DDRB = 0 x00 ; 159 DDRD = 0xFF ; 160 // PortB a l s Eingang // PortD a l s Ausgang 161 // Pr üf −0−Test 162 i P r u e f V a r = ˜0 x01 ; 163 PORTD = i P r u e f V a r ; 164 f o r ( i n t i =0; i <=7; i ++){ 165 i f (PINB != i P r u e f V a r ) 166 // Pr üf −0 v o r l a d e n // Vgl . PortB und pru e fV a r testError () ; 167 i P r u e f V a r = ( i Prue fVar <<1) | 0 x01 ; 168 PORTD = i P r u e f V a r ; // 0 s c h i e b e n } 169 170 171 /∗ 172 // Pr üf −1−Test 173 i P r u e f V a r = 0 x01 ; 174 PORTD = i P r u e f V a r ; 175 f o r ( i n t i =0; i <=7; i ++){ 176 // Pr üf −1 v o r l a d e n i f (PINB != i P r u e f V a r ) 177 // Vgl . PortB und pru e fV a r testError () ; 178 i P r u e f V a r = ( i P r u e f V a r << 1 ) ; 179 PORTD = i P r u e f V a r ; 180 } 181 ∗/ // 1 s c h i e b e n 182 183 // a l t e Zustände zur ück s e t z e n 184 DDRB = iDDRB ; 185 PORTB = iPortB ; 186 DDRD = iDDRD ; 187 PORTD = iPortD ; 188 } Quellcode 5.6: Porttest 5.3 Bibliothek der Tests Alle implementierten Tests sind zu einer Bibliothek zusammen gefasst worden. Diese Bibliothek kann in andere Projekte eingebunden werden, um sie um die Möglichkeit der Selbsttests zu erweitern. Abbildung 5.11 zeigt die Struktur der Bibliothek. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.3 Bibliothek der Tests Seite 55 Sie stellt Variablen und Methoden bereit, um die Tests aufzurufen, setzt aber eine implementierte Routine für den Fehlerfall voraus. Abbildung 5.11: Struktur der Test-Bibliothek Die Variable iTestStat vom Typ int beinhaltet die Nummer des zuletzt ausgeführten Selbsttests. In der Variablen iTestAnzahl steht die Nummer des höchsten, auszuführenden Tests. Um die Tests der Reihe nach auszuführen, genügt es, eine Schleife zu durchlaufen, die alle Selbsttests nacheinander aufruft, bis sie bei der höchsten Nummer angekommen ist. Der Quellcode 5.7 ist ein Beispiel für eine mögliche Implementierung dieser Schleife. 505 /∗ −−− S e l b s t t e s t −A u f r u f −−− ∗/ 506 v o i d doTest ( ) { 507 selectTest () ; // Testauswahl a u f r u f e n 508 i T e s t S t a t ++; // Z ä h l e r erhöhen 509 i f ( iTestStat > iTestAnzahl ) // IF Z ä h l e r > T e s t a n z a h l . . 510 511 iTestStat = 0; // . . Z ä h l e r zur ück s e t z e n } Quellcode 5.7: Beispiel: Aufruf der Selbsttests Um einzelne Tests zu überspringen, müssen diese über bedingte Anweisungen IF-Anweisungen - abgefangen und umgangen werden. Sollen nur spezielle Tests durchgeführt werden, kann mit der Methode startTest(int iTestNr) ein gezielter Test aufgerufen werden. Dabei ist iTestNr durch die Nummer des gewünschten Tests zu ersetzen: Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.3 Bibliothek der Tests Seite 56 • 0 - 31 : Registertests • 32 : Push-Pop-Return-Jump-Test • 33 - 38 : Arithmetische Tests • 39 - 45 : Tests der logischen Bitoperationen • 46 - 48 : Tests der logischen Operationen • 49 - 52 : Tests der Transfer-Befehle • 53 : RAM-Test • 54 : ROM-Test • 55 : Port-Test • 96 - 98 : Tests der Timer • 99 : Watchdog-Test Alternativ kann ein Array vom Typ int angelegt werden, das die Nummern aller auszuführenden Tests enthält. Anschließend wird die Methode startTest(int iTestNr) über eine Schleife mit den Werten aus dem Array aufgerufen. Diese Technik hat den Vorteil, dass wichtigere Tests öfter durchgeführt werden können, indem sie öfter in das Array eingetragen werden. Auch denkbar ist eine Lösung mittels Zeitscheibensystem. Der Aufruf ist in diesem Fall nicht an einen festen Punkt im Programmablauf gebunden, sondern wird von einem Testmanager übernommen, sobald eine freie Zeitscheibe verfügbar ist. Vorteil dieser Methode ist, dass zu lastfreien Zeiten mehr Tests durchgeführt werden können als beim zyklischen Ansatz. Dass auch unter Last die Testrate nicht zu stark sinkt, muss der Testmanager sicherstellen, indem er, wie im zyklischen Ansatz, Zeitscheiben für Tests einplant. Nachteil dieser Methode ist der erhöhte Aufwand in der Erstellung des Systems und die Schwierigkeit nachzuvollziehen, wann genau ein Test durchgeführt wird. [Klug97] Um die Bibliothek in ein Projekt einbinden zu können, muss die Fehlerroutine testError() definiert werden. Diese Routine wird aufgerufen, wenn ein Fehler bei einem Selbsttest auftritt. Eine mögliche Implementierung dieser Methode zeigt der Quellcodeauszug 5.8. Dabei wird über die beiden Ports des AVR Butterfly die Fehlermeldung ausgegeben, wie sie in Abbildung 4.6 (S. 34) gezeigt ist. Außerdem wird der Fehlercode im EEPROM gespeichert. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 5.3 Bibliothek der Tests Seite 57 416 /∗ −−− F e h l e r r o u t i n e f ü r S e l b s t t e s t f e h l e r −−− ∗/ 417 void t e s t E r r o r ( ) { 418 c l i () ; 419 wdt disable () ; // I n t e r r u p t s d e a k t i v i e r e n 420 421 // I n i t i a l i s i e r e d i e P o r t s a l s Ausgang 422 // Fehlermeldung und a k t u e l l e S e l b s t t e s t n r ausgeben 423 DDRD = i S e c u r e P o r t D ; 424 DDRB = 0xFF ; 425 PORTB = i T e s t S t a t ; 426 427 eepromWrite ( i S p e i c h e r 1 , 5 ) ; // F e h l e r w e r t i n s Eeprom 428 eepromWrite ( i S p e i c h e r 2 , i T e s t S t a t ) ; 429 while (1) { 430 431 // S e t z t d i e LEDs an PORTD a u f den F e h l e r c o d e −Anzeige 432 PORTD = ( 0 x55 & i S e c u r e P o r t D ) ; 433 delay loop 2 (65535) ; 434 delay loop 2 (65535) ; 435 delay loop 2 (65535) ; 436 delay loop 2 (65535) ; 437 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 438 delay loop 2 (65535) ; 439 delay loop 2 (65535) ; 440 delay loop 2 (65535) ; 441 delay loop 2 (65535) ; } 442 443 } Quellcode 5.8: Beispielhafte Implementierung der testError() Diese Bibliothek kann in Projekten mit µC eingesetzt werden, die über den gleichen Befehlssatz und den gleichen technischen Aufbau verfügen wie der hier verwendete ATMega169P. Stimmen die verwendeten Befehle nicht mit denen des neuen µC überein, so sind einzelne Tests bis hin zur ganzen Bibliothek nicht lauffähig. Um die Tests auf Projekte mit einem absolut verschiedenen Controller zu übertragen, ist es nötig, alle Tests einzeln zu konvertieren. Eine globale Implementierung der Tests, die auf allen Prozessoren lauffähig ist, kann selber in einer Hochsprache nicht realisiert werden. Selbst µC gleicher Art - RISC, CISC - unterscheiden sich von Familie zu Familie derart, dass anders gestaltete Tests notwendig werden . Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6 Beobachtung des Verhaltens unter Umgebungsbedingungen Seite 58 6 Beobachtung des Verhaltens unter Umgebungsbedingungen Um die Frage zu klären, ob homogene Redundanz die Wahrscheinlichkeit eines Ausfalls infolge gemeinsamer Ursache erhöht, wird das System verschiedenen, extremen Umgebungseinflüssen ausgesetzt. Dabei wird beobachtet, wie sich das System bezüglich seines Ausfallverhaltens verhält. 6.1 Ausgangssituation Die Ausgangssituation für die Versuche war ein Rechnersystem mit zwei unterschiedlichen Revisionen, die mit der erstellten, zyklisch die vorgesehenen Schritte abarbeitende Software betrieben wurde. In der Software waren dabei die Standardeinstellungen eingestellt, d.h. die Synchronisation sowie die Selbsttests waren aktiv und alle weiteren Einstellungen auf einen festgelegten Wert eingestellt. Die Werte können dem Quellcode 4.1 (S. 29) entnommen werden. Dieser Aufbau wurde für alle Untersuchungen verwendet. Kontrollprüfungen einzelner Versuche zeigten keinen Unterschied zwischen einem System aus zwei Kanälen gleicher Revision oder aus einem mit zwei Kanälen unterschiedlicher Revision. Daher wird davon ausgegangen, dass der Unterschied das Verhalten des Rechnersystems nicht beeinflusst. Lediglich der definierte Ausgang hat sich im Laufe der Versuche verändert. Zu Beginn war kein fest definierter Ausgang vorgesehen. Über die Anzeigen der LEDs konnte der Status eindeutig erkannt werden. Um jedoch das Verhalten des Systems an ein System der Kategorie 3 anzunähern, wurde ein Ausgang definiert. Dazu wurde Pin 8 von Port D umfunktioniert. Im sicheren Zustand dient er als Eingang ohne jedoch die internen Widerstände geschaltet zu haben. Das bedeutet, dass eine 0 anliegt, Low-Pegel. Im unsicheren Zustand ist er Ausgang und gibt eine 1 - HighPegel - aus. Sollte einer der Versuche ein Bit zum Kippen bringen, würde dies nicht ausreichen, um den sicheren Zustand zu verlassen. Um in einen nicht sicheren Zustand zu gelangen, müssten entweder das Bit für die Porteinstellung und das Bit für das ausgegebene Signal kippen oder der Programmablauf so verändert werden, dass der µC selber die Einstellung ändert. Erst dann würde im sicheren Zustand eine 1 am definierten Ausgang anliegen. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 59 6.2 Elektromagnetische Verträglichkeit Jedes elektrische Gerät hat elektromagnetische (EM) Eigenschaften, die auf andere Geräte in der Nähe wirken. Diese Auswirkungen können Störungen - Interferenzen - hervorrufen. Ein Gerät, das nicht hinreichend gegen diese Einflüsse geschützt ist, kann durch diese Interferenzen gestört werden. Die elektromagnetische Verträglichkeit (EMV) eines System setzt voraus, dass es zufriedenstellend in einer EM-Umgebung funktioniert ohne dabei Störungen zu verursachen, die für andere Systeme unannehmbar wären. [Goed97, S.15] Abbildung 6.1: Prinzip des Interferenzen-Problems [Goed97, S.19] Auftretende Interferenzen können dabei durch unterschiedliche Emissionen der Geräte auftreten. Die Art der Einwirkung, der Kopplungsweg, kann dabei variieren. Die hier durchgeführten Untersuchungen der elektromagnetischen Verträglichkeit prüfen die Möglichkeit zwei gleiche Systeme durch Beeinflussung in den unsicheren Zustand zu bringen. Dazu wirken Störungen, wie sie in einer EM-Umgebung auftreten können, über verschiedene Kopplungswege auf das Rechnersystem ein. Um die Versuche einfach zu halten, wurde das System nicht durch Filterschaltungen oder spannungsbegrenzende Bauteile gegen Störungen geschirmt, wodurch es auch für geringe Störungen anfällig ist und somit ein Worst-Case“-Szenario darstellt. ” Eine genaue Analyse der Signale im System wurde nicht vorgenommen, da der primäre Beobachtungspunkt das Ausfallverhalten war. Es wurde lediglich geprüft, ob durch Störungen ein unsicherer Ausfall reproduzierbar erreicht werden kann. 6.2.1 Kapazitive Kopplung Kapazitive Kopplungen sind Störungen, die zwischen Leitern mit unterschiedlichem Potential auftreten können. Sie sind meistens die Folge von unzureichend oder nicht geschirmten Leitungen, können aber auch bei Verlegung von störungsbehafteten direkt neben empfindlichen Leitungen auftreten. Um das Verhalten des Rechnersystem unter den Einwirkungen von kapazitiven Kopplungen zu beobachten, wurden auf die Leitungen verschiedene Impulse gegeben. Insgesamt vier verschiedene Versuchsaufbauten wurden konstruiert. Dabei wurde zweimal auf das serielle Kabel eingekoppelt, jeweils mit anderem Bezugspunkt. Des Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 60 weiteren wurden die Impulse noch über die Versorgungsleitung und über eine, isoliert unter dem System befindliche, Koppelplatte eingekoppelt. Abbildung 6.2: Positiver Impuls (rot) und Impulsfolge (blau) Abbildung 6.2 zeigt einen positiven Impuls und eine Impulsfolge von schnell aufeinanderfolgenden, transienten Impulse, wie sie in den Versuchen verwendet wurden. Die Impulsfolge hat eine Frequenz von etwa 120 Hz, was einem Impuls etwa alle 8 ms entspricht. Der maximale Spannungswert des einzelnen Impulses liegt bei etwa 80 V, die eines Impulses des Bursts beträgt im Schnitt 130 V. Außer mit positiven wurde auch mit negativen Impulsen geprüft. Wie die positiven Impulse haben sie eine Anstiegszeit von circa zehn µs, einer Breite von circa 200 µs und erreichen bis zu -130 V. Aufbau 1a - serielle Schnittstelle Im ersten Versuchsaufbau wurde überprüft, wie empfindlich die serielle Schnittstelle auf kapazitive Kopplungen reagiert. Dazu wurde direkt auf das verbindende Kabel zwischen den zwei Kanälen eingekoppelt. Dieses Kabel ist ein, aus drei Adern bestehendes, ungeschirmtes Nullmodemkabel, weshalb die Störspannungen direkt auf die Datenleitungen einkoppeln. Der Versuch ergab, dass ein einmaliger, kurzfristiger Impuls nicht ausreicht, um das System zu stören. Die entstehende Störspannung überschreitet nicht den Wert, um von der seriellen Schnittstelle als gekipptes Bit erkannt zu werden. Erst durch eine Burst-Störung konnten die übermittelten Daten beeinflusst und die Störung des Systems erreicht werden. Je nach Art des Bursts, positiv oder negativ, trat Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 61 die Störung unmittelbar oder verzögert ein. Ein negativer Burst störte das System innerhalb kurzer Zeit (2-3 Sekunden). Trifft ein negativer Impuls des Burst in eine Übertragung, kippen durch die Störspannung die High-Pegel auf Low-Pegel, wodurch keine korrekte Synchronisation mehr möglich ist. Ein positiver Burst erzeugte keine Störspannungen, die das System stören konnten. Erst beim Abschalten des Bursterzeugers kam es durch technische Bedingtheiten zu einem satten, negativem Impuls, der das System auf die gleiche Weise beeinflusste wie ein negativer Burst. Abbildung 6.3 zeigt eine beispielhafte Störung eines Bits. Abbildung 6.3: Störung der Übertragung durch gekipptes Bit Die auftretende Störung wurde vom System über Maßnahmen erkannt und behandelt, wodurch das System trotz Störung den sicheren Zustand erreichte. Aufbau 1b - serielle Schnittstelle zu GND Auch dieser Aufbau - Abbildung 6.4 - dient der Überprüfung der seriellen Schnittstelle. Anders als beim ersten Versuchsaufbau wurde hier das Potential des Störkreises auf die Masse eines Kanals gelegt. Durch diese Änderung ergab sich eine Störung auch schon durch einen einzelnen Impuls. Zurück zu führen ist dies auf den geänderten Koppelweg und die daraus resultierende, stärkere Störung. Bereits ein einzelner Impuls erzeugt Störspannungen in einer Größenordnung, die zum Kippen eines Bits auf der seriellen Schnittstelle ausreichen. Trotzdem wurde die auftretende Störung erkannt und durch Überführung des Systems in den sicheren Zustand behandelt. Aufbau 2 - Versorgungsleitung Ob eine kapazitive Einkopplung auf die Versorgungsleitung der Kanäle einen Fehler oder gar den unsicheren Ausfall provozieren kann, wurde durch den zweiten Versuchsaufbau geprüft. Der Bezugspunkt des störenden Systems wurde, wie im vorhergehenden Versuch, auf die Masse eines Kanals gelegt, während der positive Pol auf den Leitungen vom Netzteil zu den Kanälen einkoppelte. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 62 Abbildung 6.4: Versuchsaufbau 1b - serielle Schnittstelle zu GND Das Ergebnis war, dass negative Einzelimpulse wie auch der negative Burst einen Fehler im System auslösten, während positive Impulse oder Bursts keinen Einfluss ausübten. Durch die negativen Impulse sank vermutlich die Versorgungsspannung unter die von der EIA-232-Schnittstelle benötigten 3 V, wodurch eine Übertragung von Daten zur Synchronisation nicht mehr möglich war. Dadurch konnten keine 0 High-Pegel - mehr übertragen werden und alle Bits wurden als 1 erkannt. Trotz des Spannungsabfalls reichte die Restspannung zur korrekten Datenverarbeitung des µC. Daher werden die Fehler erkannt, wodurch das System in den sicheren Zustand überführt wird. Ein unsicherer, gefahrbringender Ausfall ist nicht eingetreten. Aufbau 3 - Koppelplatte Im letzten Versuch wird die Wirkung einer kapazitiven Kopplung auf das gesamte System geprüft. Dazu wird mittels einer Platte, die sich in diesem Versuchsaufbau unter den Systemen befindet, auf die komplette Fläche der Kanäle eingekoppelt. So entstehende Störspannungen wirken auf alle Bauteilen und alle Leitungen und nicht nur an einzelnen Punkten ein. Das am stärksten gestörte Element ist wiederum die empfindliche, gegen Störungen nicht geschirmte, serielle Schnittstelle. Bei einer Störung mittels positiver oder negativer Bursts wird daher ein Synchronisationsfehler erkannt, was zum sicheren Abschalten des Systems führt. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 63 6.2.2 Elektrostatische Entladung Elektrostatische Entladungen (Elektotatic Discharge, ESD) sind Entladungen statischer Elektrizität. Sie treten immer dann auf, wenn ein statisch geladener Körper seine Ladung über einen Funken oder einen Durchschlag auf ein leitendes Material entlädt. Diese Impulse haben eine sehr geringe Anstiegszeit, häufig unter einer Nanosekunde und eine maximale Dauer von 50 ns. Während des Impuls fließen transiente Ströme, die magnetische und elektrische Felder erzeugen. Entladungen, die direkt auf Bauteile gerichtet sind, können die Zerstörung dieses Bauteils durch Durchschlag bewirken. Die Aufladung vor einem ESD erfolgt bei der Trennung von zwei sich vorher berührenden Materialien, von denen mindestens eines isolierende Eigenschaften besitzt. [Schwa96] Die dabei entstehende Spannung ist von den Materialien und der Luftfeuchtigkeit abhängig und kann bis zu 30 kV betragen. Meistens entsteht eine ESD, wenn ein Mensch einen elektrischen Leiter, etwa einen geerdeten Gegenstand aus Metall, berührt. Dabei kann es sich beispielsweise um Leitungen oder Verkleidungen von Geräten handeln. Abbildung 6.5 zeigt deutlich eine elektrostatische Entladung. Abbildung 6.5: Sichtbare ESD-Entladung Der im Versuch eingesetzt ESD-Generator erzeugte einen Impuls mit einer Spannung von annähernd 15 kV. Anders als ein Burst-Impuls ist seine Energie allerdings sehr gering. [Fis92, S. 129] In verschiedenen Versuchsaufbauten wurde das System auf unterschiedliche Weise mit dieser Entladung gestört. Eine direkte Einwirkung auf den µC wurde nicht vorgenommen, da dies möglicherweise die Zerstörung des Systems durch unzureichende EMV-Sicherung bedeuten könnte. Weiterhin ist es nicht möglich den Impuls auf beide µC gleichzeitig zu geben, so dass der sichere Zustand auch bei Komplettausfall des anderen Systems erreicht werden würde. Eine Einwirkung dieser hochsynchronen Art würde auch nicht den realen Störungen entsprechen. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 64 Folgende Aufbauten wurden vorgenommen: • kapazitive ESD-Einwirkung auf die Versorgungsleitungen • kapazitive ESD-Einwirkung über eine Koppelplatte • direkte Einwirkung auf die EIA-232-Buchse Die Untersuchungen ergaben, dass ein ESD das System dermaßen enorm stört, dass ein Reset ausgelöst wird. Der Angriffspunkt der einzelnen Aufbauten spielte dabei keine Rolle. Egal ob über kapazitive Kopplungen des Impulses oder durch direkte Einspeisung auf den Bezugspunkt, die Reaktion war immer die gleiche. Lediglich die Einkopplung über die Koppelplatte führte in einem Fall zu unterschiedlichen Reaktionen. Während das eine System durch einen Reset zurück gesetzt wurde, zeigte das andere System den Ausfall seines Gegenübers an. Der sichere Zustand wurde von beiden Systemen erreicht. Zu erklären ist dies durch die verschiedene Einwirkung des ESD über die Koppelplatte. Die Entfernung vom Punkt der Einspeisung zur Fläche der Einkopplung sowie die Toleranzen der Bauteile in den einzelnen Systemen lassen die Reaktion leicht variieren. Einen Defekt oder einen undefinierten Zustand gab es durch die ESD-Versuche nicht. Nach dem Impuls und dem daraus resultierenden Reset verblieben die Systeme im sicheren Zustand. 6.2.3 Unterbrechung der Versorgungsspannung Der in Abbildung 6.6 dargestellte Versuchsaufbau dient zur Untersuchung des Verhaltens des Rechnersystems bei plötzlich ausfallender Versorgung. Dazu wurden beide Systeme über Leitungen, deren Aufbau und Länge gleich beschaffen sind, an ein gemeinsames Netzteil angebunden. Dieses unterbrach die Versorgungsspannung in festen Abständen für eine eingestellte Dauer. Diese Dauer wurde variiert, um zu prüfen, ob ein Bereich existiert, in dem das Verhalten der Systeme nicht definiert ist. Begonnen wurde mit einer Unterbrechung von 1 ms, bei einer Periodendauer von 1 s. Die Unterbrechung für diese kurze Dauer verursachte keinerlei Störung. In dieser Zeit wird die Spannung von verbauten Kondensatoren stabilisiert. Eine Unterbrechung über 10 ms zeigte ebenfalls keinerlei Reaktion, erst ab 100 ms änderte sich das Verhalten. So wurde ab dieser Dauer ein Synchronisationsfehler erkannt. Während der Unterbrechung sinkt die Spannung unter die benötigte Betriebsspannung der EIA-232, womit keine eindeutigen High-Pegel mehr erzeugt werden können. Für den µC reicht die restliche Spannung aus, weshalb kein Reset durchgeführt wird. Dieser passiert erst ab etwa 200 ms Unterbrechungsdauer. Nach einer Unterbrechung startet das System neu, verweilt nach dem Start aber im Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 65 Abbildung 6.6: Versuchsaufbau: Spannungsunterbrechung sicheren Zustand. Abbildung 6.7 zeigt den zeitlichen Verlauf der Spannung bei einer 10 ms dauernden Unterbrechung. Wie der Abbildung entnommen werden kann, entspricht die Rasterbreite 10 ms während die Höhe jedes Kastens 2 V entspricht. 6.2.4 Austastung der Versorgungsspannung Wie im Versuch zur Unterbrechung der Versorgungsspannung, wurde auch in diesem Versuchsaufbau die Versorgungsspannung der Kanäle modifiziert. Mittels des gleichen Aufbaus - Abbildung 6.6 - wurde auch dieser Versuch durchgeführt. Allerdings wurde die Spannung nicht komplett abgeschaltet, sondern lediglich bis in den undefinierten Bereich reduziert. Um dies zu erreichen, wurde die Spannung für eine festgelegte Dauer auf 1 V gesenkt. Als Ausgangsspannung wurden 3,8 V genommen. Ein vorhergehender Versuch zeigte, dass mindestens 3,8 V benötigt werden, um einen normalen Betrieb zu erreichen. Andernfalls reicht die Spannung nicht aus um definierte High-Pegel auf der seriellen Schnittstelle erzeugen zu können. Dies liegt daran, dass der Spannungsregler, obwohl es sich um ein Very Low Drop Modell handelt, 0,45 V Spannungsabfall erzeugt, womit die dem System tatsächlich zur Verfügung stehende Spannung unter 3 V sinkt. Ab einer Austastungsdauer von 100 ms pro Sekunde wurde ein Synchronisationsfehler erkannt. Während der Austastung sank die Versorgungsspannung unter die benötigte Mindestspannung für die Peripherie, so dass eine Kommunikation über Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.2 Elektromagnetische Verträglichkeit Seite 66 Abbildung 6.7: Zeitlicher Verlauf der Spannung die serielle Schnittstelle nicht mehr möglich war und die LEDs erloschen. Dem µC reichte die verbleibende Spannung, um die Datenverarbeitung aufrecht zu erhalten. Eine Austastung der Spannung von einer halben Sekunde lies das System einen Reset durchführen. Nach diesem verblieb es, wie auch im vorher gehenden Versuch, im sicheren Zustand. Weitere Erhöhungen der Austastungsdauer führten nur zu längeren Pausen zwischen dem Ab- und dem wieder Anschalten des Systems. Ein unsicherer Zustand wurde nicht erreicht. 6.2.5 Analyse der EMV-Untersuchungen Wie die einzelnen Untersuchungen der EMV-Analyse zeigten, wirkt sich eine EMUmgebung in der überwiegenden Anzahl auf die relativ anfällige serielle Schnittstelle aus. Diese Fehler werden erkannt, da zu diesem Zeitpunkt eine Störung des µCs aufgrund seiner geringeren Anfälligkeit nicht vorliegt. Durch fehlerbehandelnde Maßnahmen reagieren die Kanäle auf die Störungen, indem der sichere Zustand eingeleitet wird. Eine Störung, die auch den µC in seiner Arbeitsweise beeinflusst, ist indes nicht aufgetreten. Wird eine bestimmte Intensität der Störungen überschritten, so führte das Rechnersystem einen Reset durch, wodurch das System ebenfalls in den sicheren Zustand gelangte. Daher ist anzunehmen, dass homogen redundante Systeme ebenso wenig für Fehler und Ausfälle infolge gemeinsamer Ursache anfällig sind wie ihre diversitäre Pendants. Solange in den SRP/CS Elemente vorhanden sind, die empfindlicher auf Störungen reagieren als die steuernden Mikroelektronik, wird eine Störung diese als erstes be- Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.3 Temperaturbeständigkeit Seite 67 einflussen, wodurch fehlerbehandelnde Maßnahmen eingeleitet werden können. Schirmungen oder andere, EMV verbessernde Maßnahmen können die Fehleranfälligkeit einzelner Elemente reduzieren, wodurch die Fehleranfälligkeit von µC im Vergleich zum restlichen System steigen kann. Im Falle einer Störung kann dann der Controller das gestörte Element sein. Dass in diesem Fall homogene Redundanz anders reagiert und dadurch häufiger oder leichter einen unsicheren Ausfall hervorruft, kann jedoch nicht gefolgert werden. Bauteiltoleranzen und Unterschiede in den Signalpfaden führen meistens dazu, dass keine exakt gleiche Arbeitsweise vorliegt. Selbst mit identischer Hard- und Software unterscheidet sich die Arbeitsweise und die Reaktionen auf Einflüsse, wodurch auch auf Störungen unterschiedlich reagiert wird. Ein Beispiel dafür ist die ESD-Prüfung über die Koppelplatte. Obwohl beide Systeme unter den gleichen Bedingungen betrieben wurden, ist nicht immer dieselbe Störung erkannt worden. 6.3 Temperaturbeständigkeit Neben den elektromagnetischen Störungen wirkt auf SRP/CS auch die Temperatur des Standorts ein. Die Umgebungstemperatur kann die Funktionsweise eines Systems dabei maßgeblich beeinflussen. Jedes elektronische System besteht zu einem Großteil, wenn nicht sogar ausschließlich, aus elektrischen Bauteilen, welche ihr Verhalten unter wechselnden Bedingungen ändern. Daher ist es wichtig zu wissen, wie sich das Verhalten der einzelnen Elemente ändert, um eine Aussage über die Funktionsweise des gesamten Systems unter Einfluss der Umgebungstemperatur treffen zu können. Eine Schaltung besteht meistens aus einer Anzahl von StandardKomponenten wie Widerständen, Kondensatoren und Transistoren. Diese verfügen über unterschiedliche Eigenschaften unter Temperaturwechseln. Widerstände werden beispielsweise in zwei Kategorien unterteilt. Es gibt sie mit positivem und negativem Temperaturkoeffizienten (α). Ein positiver Temperaturkoeffizient bedeutet, dass sich der Widerstandswert bei steigenden Temperaturen erhöht. Bei Wideständen mit negativem α verhält es sich entsprechend umgekehrt. Das Verhältnis zwischen Temperatur- und Widerstandsänderung ist in den meisten Fällen linear. Wird eine Kombination aus Widerständen mit positiven und negativen Koeffizienten verwendet, kann das Maß der Widerstandsänderung teilweise kompensiert werden. [Krue08, S. 237] Auch Kondensatoren besitzen, wie Widerstände, einen Temperaturkoeffizienten. Dieser hat Auswirkung auf die Kapazität des Kondensators. Da die Produktion von Kondensatoren aufgrund von Prozessmodellen jedoch hohen Toleranzen unterliegt, kann die Veränderung der Kapazität in den meisten Fällen vernachlässigt werden. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.3 Temperaturbeständigkeit Seite 68 Bei komplexen Filtern oder Schwingkreisen sind sie von Relevanz, in dem hier eingesetzten System jedoch nicht. Transistoren dienen in Schaltungen meistens zur Verstärkung von Stromflüssen. Eine Eigenschaft von Transistoren ist, dass bei höheren Temperaturen ein größerer Stromfluss möglich ist. Bis zu einem Punkt erhöht sich der Verstärkungsfaktor mit dem Anstieg der Temperatur. Ist dieser Punkt erreicht, brennt das Bauteil durch. Im Umkehrzug dagegen wird die Verstärkung bei niedrigen Temperaturen deutlich geringer ausfallen.[Krue08, S. 236ff] Diese Auswirkungen können auf das Rechnersystem übertragen werden. Darum ist das System in einer Klimakammer auf seine Temperaturbeständigkeit geprüft worden. Ausgangstemperatur für die Versuche war die Temperatur im Versuchsraum, etwa 20°C. Die Möglichkeit zur Regulierung der Luftfeuchtigkeit ist nicht genutzt worden. 6.3.1 Positiver Temperaturbereich Im Versuch zur Bestimmung des Verhaltens im positiven Temperaturbereich wurde das System auf das Spezifikationslimit des µCs - +85°C [ATM08a] - und, nachdem kein Ausfall stattgefunden hat, darüber hinaus erhitzt. Bis zur Obergrenze wurde in Schritten von 10°C, anschließend jeweils um 5°C erhöht. Die Gesamtdauer des Versuchs belief sich auf etwa 4 12 Stunden. Während der ersten 60 Minuten wurde das System von der Ausgangstemperatur bis zum Spezifikationslimit erhitzt. Anschließend wurde es für etwa eine halbe Stunde am Limit betrieben. In der restlichen Zeit wurde die Temperatur etwa alle 30 Minuten um weitere fünf Grad Celsius bis zur Endtemperatur von 110°C erhöht. Auf diesem Level lief das System 30 Minuten. Die Gesamtdauer des Betriebes über dem Spezifikationslimit beläuft sich damit auf circa drei Stunden. Abbildung 6.8: Schematischer Temperaturverlauf, positiver Temperaturbereich Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.3 Temperaturbeständigkeit Seite 69 6.3.2 Negativer Temperaturbereich Wie im vorhergehenden Versuch wurde das System bis an seine Spezifikationsgrenzen gebracht. Im negativen Bereich liegt diese bei -40°C [ATM08a]. Nachdem der Betrieb unter diesen Bedingungen circa 30 Minuten fehlerfrei verlief, wurde die Temperatur schrittweise bis auf -65 °C reduziert. Abbildung 6.9 zeigt den Temperaturverlauf vom Nullpunkt bis zum Spezifikationslimit. Wie der Grafik entnommen werden kann, dauerte es1 ab 0 °C eine Stunde bis zum erreichen der unteren Grenze von -40°C. Anschließend wurde das System weitere 2 12 Stunden unter dem Limit bei -55°C und -65°C betrieben. Abbildung 6.9: Schematischer Temperaturverlauf, negativer Temperaturbereich Nach dem Öffnen der Türe zur Klimakammer gefror die eindringende Luftfeuchtigkeit binnen Sekunden an den Versuchsaufbauten. Doch auch dies verhinderte nicht den reibungslosen Betrieb. 6.3.3 Analyse der Temperaturmessungen Das Verhalten des Systems unter den Einflüssen extremer Temperaturen zu beschreiben ist, mit den vorliegenden Resultaten, nur eingeschränkt möglich. Während der Versuche zeigten sich keine Probleme, jedoch stellen diese, auch wenn unter verschärften Bedingungen durchgeführt, relativ kurze Ausschnitte aus dem Leben der Systeme dar. Dass kein Ausfall aufgetreten ist, zeigt zwar, dass das System in seiner aktuellen Form, zumindest kurzzeitig, sehr temperaturresistent ist, lässt jedoch keine Aussage darüber zu, wie das System bei einer Störung reagieren würde. Höhere Belastungen würden die Bauteile des System zerstören, nicht jedoch zu weiteren Erkenntnissen führen. Derart intensive Überschreitungen von Spezifikationsgrenzen würden eine Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 6.3 Temperaturbeständigkeit Seite 70 unsachgemäße Entwicklung voraussetzen, was nicht den Anforderungen der DIN EN ISO 13849-1 entsprechen würde. Um eine gültige Aussage über das Verhalten des Rechnersystems unter längerfristig einwirkenden Temperaturen treffen zu können, müsste dieses über einen längeren Zeitraum unter moderaten Temperatureinflüssen geprüft werden. Mögliche eintretende Ausfälle müssten schließlich auf das Verhalten der Kanäle und des erreichten Zustandes - sicher oder unsicher - untersucht werden. Anschließend müsste die Ausfallrate eines gefahrbringenden Ausfalls mit denen diversitärer Pendants verglichen werden, um die Eignung von homogener Redundanz beurteilen zu können. Da es sich bei dem hier verwendeten System um eine Art Worst-Case“-Szenario ” handelt, in dem kaum Maßnahmen gegen Umgebungseinflüsse getroffen sind, kann davon ausgegangen werden, dass das Verhalten dieses Systems deutlich stärker ausgeprägt ist, als dass eines der Norm entsprechenden Systems. Daher ist anzunehmen, dass die Ausfallwahrscheinlichkeit eines industriellen SRP/CS unter solchen Einflüssen geringer ist als das des geprüften Teils. Die Tatsache, dass selbst das einfache System die Tests ohne Fehler absolviert hat, zeigt zumindest die Tendenz, dass homogene Redundanz keine direkte Schwachstelle für Temperaturempfindlichkeit bedeutet. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 7 Zusammenfassung Seite 71 7 Zusammenfassung 7.1 Ergebnisse Das im Rahmen dieser Arbeit erstellte System entspricht von der Architektur einem SRP/CS der Kategorie 3. Die Einfehlersicherheit ist über homogene Redundanz gegeben. DCavg sowie MTTFd sind nicht bekannt oder gegeben, aber auch nicht relevant. Das System ist keinesfalls als eine Struktur nach der Norm DIN EN ISO 13849-1 anzusehen, sondern soll lediglich das Verhalten homogener Redundanz unter Umgebungseinflüssen darstellen können. Die entwickelte Software sowie die implementieren Selbsttests beinhalten fehlerbehandelnde Maßnahmen. Weiterhin wird in der Software eine Pseudo-Aktion ausgeführt, wodurch eine Maschinensteuerung wie sie in der Industrie eingesetzt wird, simuliert werden soll. Die Selbsttests sind zu einer Bibliothek zusammen gefasst und können auf andere Projekte, mit einem µC mit gleichem Befehlssatz, übertragen werden. Verschiedene Untersuchungen sollten Aufschlüsse über das Verhalten von homogen redundanten Systemen unter Umgebungseinflüssen geben. Hauptaugenmerk der Untersuchungen war dabei die Frage, ob homogene Redundanz ein erhöhtes Risiko für Ausfälle infolge gemeinsamer Ursachen birgt. Wie die Ergebnisse der Untersuchungen zeigen, kann nicht pauschal gesagt werden, dass ein homogen redundant aufgebautes Rechnersystem anfälliger für Ausfälle infolge gemeinsamer Ursache ist. Das entwickelte System hat, trotz homogener Redundanz, unter Einfluss diverser Störungen keine gefahrbringenden Ausfälle gezeigt. Eine sicherheitsrelevante Architektur und passende Software zur Betreibung des System kann die Wahrscheinlichkeit der Ausfälle reduzieren. Da diese Anforderungen von der Norm DIN EN ISO 13849-1 auch an homogen redundante SRP/CS gestellt werden, kann bei konsequenter Umsetzung der Anforderung nicht von einem erhöhten Risiko ausgegangen werden. 7.2 Ausblick Die durchgeführten Prüfungen beschränken sich alle auf einen kurzen Zeitraum aus einem speziell für diese Untersuchungen entwickeltem System. Sie zeigen zwar, dass unter kurzzeitigen Belastungen auch über die Grenzen des Systems kein gefahr- Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik 7.2 Ausblick Seite 72 bringender Ausfall stattfindet, können jedoch keine Aussage über die langfristige Zuverlässigkeit des Systems machen oder repräsentativ für industrielle SRP/CS betrachtet werden. Um das zu erreichen, kann das Projekt fortgeführt werden. Angedacht sind vollautomatische Testabläufe, die selbstständig ausgewählte Untersuchungen durchführen. Da bei dieser Art der Prüfung der manuelle Eingriff entfällt oder zu Kontrollzwecken auf ein Minimum reduziert werden kann, kann der Ablauf beschleunigt und ohne dauerhafte Aufsicht durchgeführt werden. Dies würde eine fortlaufend steigende Anzahl an Prüfungen bedeuten und, je nach Länge des Projektes, auch verschiedene Abschnitte des Lebenszyklus berücksichtigen. Um die Ergebnisse der Untersuchungen zu validieren und auf andere Systeme zu übertragen, ist eine Untersuchung an einem oder mehrerer Systeme aus dem industriellen Einsatz durchzuführen. Das Verhalten eines Systems, das den Anforderungen der Norm entspricht, ist repräsentativer für eingesetzte SRP/CS als ein an die Norm angelehntes System. Weiterhin muss durch die Untersuchungen eine Aussage über den gesamten Lebenszyklus des Systems getroffen werden können, um Parameter wie Abnutzung und Alterung zu berücksichtigen. Zu diesem Zweck müssen die Bedingungen während der Prüfungen denen während des realen Einsatzes entsprechen. Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Literaturverzeichnis Seite 73 Literaturverzeichnis Fachliteratur [BGIA06] BGIA Institut für Arbeitsschutz der Deutschen Gesetzlichen Unfallversicherung: Selbsttests für Mikroprozessoren mit Sicherheitsaufgaben. http://www.dguv.de/bgia/ de/pub/rep/pdf/rep05/biar0706/Report7_2006.pdf, HVBG (Hrsg.), Report 7, November 2005 [BGIA08] BGIA Institut für Arbeitsschutz der Deutschen Gesetzlichen Unfallversicherung: Funktionale Sicherheit von Maschinensteuerung. http://www.dguv.de/bgia/de/pub/ rep/pdf/rep07/biar0208/rep2_08.pdf, DGUV (Hrsg.), Report 2, Februar 2008 [DIN07] DIN Deutsches Institut für Normung e. V.: Sicherheit von Maschinen - Sicherheitsbezogene Teile von Steuerungen - Teil 1: Allgemeine Geltungsleitsätze. Beuth Verlag GmbH, Berlin 2007 [Fis92] Fischer, P.; Balzer G.; Lutz, M.: EMV - Störfestigkeitsprüfungen. Franzis-Verlag GmbH & Co. KG, München 1992 [Goed97] Goedbloed, J. J.: EMV - Elektromagnetische Verträglichkeit. Pflaum Verlag GmbH, München et. al. 1997 [Klug97] Klug, J.; Schaefer, M.: Sicherheitstechnisches Informationsund Arbeitsblatt 330 225, 29. Lfg. VII/97, 9 S., 14 Lit., Abb. In: BGIA-Handbuch Sicherheit und Gesundheitsschutz am Arbeitsplatz. Hrsg.: Berufsgenossenschaftliches Institut für Arbeitsschutz - BGIA. 2. Auflage. Erich Schmidt Verlag, Berlin 2003 - LoseblattAusgabe. [Krue08] Krüger, M.: Grundlagen der Kraftfahrzeugelektronik. Schaltungstechnik. 2. neu bearbeitete Auflage, Carl Hanser Verlag, München 2008 [Pard05] Pardue, J.: C Programming for Microcontrollers. Smiley Micros, Knoxville (USA) 2005 [Rei99] Reinert, D.; Meffert, K.: Mikroprozessoren in sicherheitskritischen Anwendungen. Teil 1: Elektronik 48 (1999) Nr. 4, S. 56-63; Teil 2: Elektronik 48 (1999) Nr. 6, S. 48-52 [Rei01] Reinert, D.; Schaefer, M.: Sichere Bussysteme für die Automation, Hüthig GmbH & Co. KG, Heidelberg 2001 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Literaturverzeichnis Seite 74 [Schae08] Schäffer, F.: Hardware und C-Programmierung in der Praxis. elektor-Verlag, Aachen 2008 [Schwa96] Schwab, A. J.: Elektromagnetische Verträglichkeit. 4. neu bearbeitete Auflage, Springer Verlag, Berlin et. al. 1996 Datenblätter [ATM03] ATMEL: Buttefly Board Datasheet. http://atmel.com/dyn/ resources/prod_documents/doc4249.pdf, Stand: Februar 2009 [ATM08a] ATMEL: ATMega169P(V) Datasheet. http://www.atmel.com/ dyn/resources/prod_documents/doc8018.pdf, Stand: Dezember 2008 [STM] STMicroelectronics: LFxxC Datasheet. http://www.st. com/stonline/products/literature/ds/2574/lf33c.pdf, Stand: Februar 2009 Onlineliteratur [@ATM08b] ATMEL: PicoPower-Technology. http://www.atmel.com/ products/AVR/default_picopower.asp, Stand: März 2008 [@Ecr09] Ecros Technology: AVR Buttefly Carrier. http://www. ecrostech.com/AtmelAvr/Butterfly/index.htm, Stand: März 2009 [@WinAVR] WinAVR. http://winavr.sourceforge.net/, Stand: März 2009 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A Quellcode Seite 75 A Quellcode A.1 Quellcode Main-App.c 1 #i n c l u d e ”Main−App . h” 2 #i n c l u d e ” Te stLib . h” 3 4 /∗ −−− Main−App v1 . 1 −− ∗/ 5 /∗ Autor : Maxim Küpper ∗/ 6 7 v o l a t i l e int iProgStatus = 0; // 0 = Programm noch n i c h t gestartet 8 // 1 = Programm g e s t a r t e t , l ä u f t 9 // −−−−−−−−−−−−−−−− WICHTIG: −−−−−−−−−−−−−−−−−−−−−−−−− 10 // v o l a t i l e , s o n s t ä n d e r t s i c h p r o g s t a t u s n i c h t i n d e r ISR ! 11 12 char cStatus = 0 ; // c S t a t u s b e i n h a l t e t den a k t u e l l e n S t a t u s d e s Programmes 13 14 // wird z u r S y n c h r o n i s a t i o n b e n ö t i g t i n t iMaxStat = 2 5 5 ; // Maximaler S t a t u s , da 8 m ö g l i c h e z u s t ä n d e d e r LEDS 15 16 17 i n t iDelayMs = 10∗DELAY; // W a r t e z e i t z u r S y n c h r o n i s a t i o n i n ms ( n i c h t 100% genau , 18 // da T a k t f r e q u e n z s t a t t durch 1000 ( a u f kHz ) durch 1024 g e t e i l t wurde ) 19 // Maximum : ˜30ms 20 21 i n t iMaxTimeMs = 20∗DELAY; // Maximale Z e i t e i n e s S c h l e i f e n d u r c h l a u f s d e s Hauptprogramms 22 // Angabe i n ms 23 // Maximum : ˜30ms 24 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 25 Seite 76 i n t iDebugFlag = 0 ; // 1 : Programm s t a r t e t automatisch 26 // 0 : Programm w a r t e t a u f S t a r t s i g n a l 27 // S t a r t s i g n a l : S t a r t k n o p f od . externes Startsignal 28 // Für S i m u l a t o r 1 e i n s e t z e n , dann wird außerdem das Delay d e k a t i v i e r t ! // −−−−−−−−−−−−−−−− WICHTIG: 29 −−−−−−−−−−−−−−−−−−−−−−−−− // IM DEBUG−MODUS WERDEN DIE 30 SYNCHRONISATION 31 // UND DIE SELBSTTESTS DEAKTIVIERT ! 32 33 int iTestFlag = 1; // 1 : S e l b s t t e s t s werden d u r c h g e f ü h r t 34 // 0 : keine S e l b s t t e s t s 35 36 i n t iSyncFlag = 1; // Flag ob S y n c h r o n i s a t i o n d u r c h g e f ü h r t werden s o l l 37 // 0 : deaktiviert 38 // 1 : aktiviert 39 40 i n t iSyncMod = 1 0 ; // Anzahl d e r S c h r i t t e nach w e l c h e r d i e S y n c h r o n i s a t i o n d u r c h g e f ü h r t wird 41 // Minimum : 1 42 // Maximum : iMaxStat 43 44 i n t iOn = 0xFF ; // a l l e Lampen an / Port a l s Ausgang d e k l a r i e r e n 45 i n t i O f f = 0 x00 ; // a l l e Lampen aus / Port a l s Eingang d e k l a r i e r e n 46 47 48 i n t i S e c u r e P o r t D = ˜0 x80 ; 49 50 i n t iWDStatusFlag ; // S t a t u s d e s Watchdog−T e s t s 51 52 char cReceived ; 53 54 i n t i S p e i c h e r 1 = 0 x00 ; // S p e i c h e r z e l l e 1 deklarieren Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 55 i n t i S p e i c h e r 2 = 0 x01 ; Seite 77 // S p e i c h e r z e l l e 2 deklarieren 56 57 58 59 /∗ −−− Hauptmethode −−− ∗/ 60 i n t main ( v o i d ) 61 { 62 iWDStatusFlag = eepromRead ( iWDSpeicher ) ; 63 64 // Watchdog−Routine , wenn Watchdog e i n e n S y s t e m r e s e t d u r c h g e f ü h r t hat 65 i f ( (MCUSR & ( 1 << WDRF) ) ) { 66 MCUSR = 0 ; 67 wdt disable () ; 68 i f ( iWDStatusFlag < 1 | | iWDStatusFlag > 4 ) { 69 wdError ( ) ; 70 } 71 // Wenn Timer0Test zu einem Reset g e f ü h r t hat , Wird das h i e r abgefangen e l s e i f ( iWDStatusFlag == 2 ) { 72 73 iTestStat = 54; 74 testError () ; 75 } 76 e l s e i f ( iWDStatusFlag == 3 ) { 77 iTestStat = 55; 78 testError () ; 79 } 80 e l s e i f ( iWDStatusFlag == 4 ) { 81 iTestStat = 56; 82 testError () ; } 83 84 } 85 86 // Wenn T e s t s a k t i v i e r t s i n d 87 i f ( iTestFlag ){ 88 // Ruft den Watchdog−Test a u f wenn e r noch n i c h t a u f g e r u f e n wurde 89 i f ( iWDStatusFlag != 1 ) { 90 91 startTest (99) ; } Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c Seite 78 92 // s o n s t l ö s c h e Watchdog−Flag 93 else { 94 eepromWrite ( iWDSpeicher , 0 ) ; } 95 96 97 // S t a r t e t d i e Timer−T e s t s 98 startTest (96) ; // Timer 0 99 startTest (97) ; // Timer 1 100 startTest (98) ; // Timer 2 101 // Löscht das T e s t S t a t −Flag f ü r A u s g a n g s s i t u a t i o n beim 102 Programmstart 103 104 iTestStat = 0; } 105 106 // Ruft d i e Methode zum Programmstart a u f 107 programmInit ( ) ; 108 109 // Pr üfen ob Debugmodus a k t i v i e r t , wenn n e i n S y n c h r o n i s a t i o n s t a r t e n und T e s t s d u r c h f ü h r e n 110 i f ( ! iDebugFlag ) { 111 // F a l l s T e s t s gew ünscht werden 112 i f ( iTestFlag ){ 113 // Beim S t a r t e i n m a l i g a l l e S e l b s t t e s t s d u r c h f ü h r e n 114 initTest () ; 115 } 116 // S t a t u s −LEDs s e t z e n , jenachdem ob S y n c h r o n i s a t i o n erw ünscht o d e r n i c h t 117 i f ( iSyncFlag ) { 118 PORTD = iOn ; 119 } 120 e l s e i f ( ! iSyncFlag ) { 121 PORTD = 0 x33 ; } 122 123 } 124 125 // S c h l e i f e vor dem e i g e n t l i c h e n Programmstart . 126 // F ührt S e l b s t t e s t s d e r Reihe nach aus . 127 // Wartet a u f e x t e r n e s S i g n a l ( Button−Aktion o d e r S t a r t − Signal ) 128 w h i l e ( i P r o g S t a t u s != 1 ) { Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 129 doTest ( ) ; Seite 79 // Routine z u r Testauswahl aufrufen 130 wdt reset () ; // Watchdog zur ück s e t z e n 131 i f ( (UCSRA & (1<<RXC) ) && i S y n c F l a g ) { // P r ü f t ob externes Signal vorliegt i f (UDR == ’ x ’ ) { 132 // Im F a l l e das e x t e r n e s Signal ein x i s t . . 133 programmStart ( ) ; // . . f ü h r e Programmstart aus } 134 } 135 136 } 137 138 139 // −−− UNSICHERER ZUSTAND −−− 140 // −− s o l a n g e Programm n i c h t i n F e h l e r r o u t i n e g e h t b e f i n d e t e s s i c h im u n s i c h e r e n Zustand −− 141 142 /∗ 143 PORTD = i O f f ; 144 ∗/ 145 DDRD = iOn ; 146 PORTD = ˜ i S e c u r e P o r t D ; 147 DDRB = iOn ; // PortB a l s Ausgang s c h a l t e n 148 PORTB = i O f f ; // I n i t i a l w e r t dem PortB zuweisen 149 150 151 // Timer f ü r d i e E c h t z e i t −Überwachung 152 OCR0A = iMaxTimeMs ; // Lädt das Vergleichsregister 153 TCCR0A = (1<<CS00 ) |(1<<CS02 ) |(1<<WGM01) ; // I n i t i a l i s i e r t den Timer und s t a r t e t i h n 154 155 // Hauptprogamm−E n d l o s s c h l e i f e 156 // wird nur durch e i n e n F e h l e r f a l l v e r l a s s e n 157 while (1) { 158 159 TCNT0 = 0 ; // S e t z t den Timer a u f 0 zur ück Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 160 Seite 80 // . . Wenn ja , S t a t u s zur ück a u f 0 setzen 161 162 i f ( c S t a t u s < iMaxStat ) // P r ü f t ob d e r S t a t u s den h ö c h s t e n Wert e r r e i c h t hat . . 163 c S t a t u s ++; // . . wenn nein , S t a t u s inkrementieren 164 else 165 cStatus = 0; 166 167 PORTB = c S t a t u s ; // S t a t u s über d i e LEDs ausgeben . 168 i f ( i S y n c F l a g & ( c S t a t u s % iSyncMod == 0 ) ) { 169 // F a l l s Syncronisationsflag gesetzt . . 170 doSync ( ) ; // . . S y c h r o n i s a t i o n a u s f ü h r e n } 171 172 173 // f ü r den Debug−Modus d i e T e s t s d e a k t i v i e r e n 174 i f ( iTestFlag ){ 175 doTest ( ) ; // S e l b s t t e s t −Auswahl a u f r u f e n } 176 177 178 wdt reset () ; } 179 180 // Watchdog zur ück s e t z e n } 181 182 183 184 /∗ −−−− A u f r u f d e r I n i t i a l i s i e r u n g −−− ∗/ 185 v o i d programmInit ( v o i d ) { 186 // Wennn A u t o s t a r t a k t i v i e r t i s t , s e t z e P r o g s t a t u s a u f 1 zum S t a r t e n d e s Programmes 187 i f ( iDebugFlag ) { 188 iProgStatus = 1; 189 iSyncFlag = 0; 190 iTestFlag = 0; 191 } 192 193 eepromOverwrite ( ) ; 194 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c Seite 81 195 // Ruft d i e I n i t i a l i s i e r u n g s m e t h o d e a u f 196 i n i t i a l i z e r () ; 197 198 // I n i t i a l i s i e r t den Watchdog und s t e l l t i h n a u f den gew ünschten Wert 199 // WDTO 60MS e n t s p r i c h t 60mS 200 // WDTO 30MS e n t s p r i c h t 30mS 201 // WDTO 1S e n t s p r i c h t 1S 202 w d t e n a b l e (WDTO 60MS) ; 203 } 204 205 /∗ −−− Routine zum Programmstart −−− ∗/ 206 v o i d programmStart ( v o i d ) { 207 iProgStatus = 1; // Programmstatus−V a r i a b l e auf 1 s t e l l e n 208 PCMSK1 = ˜PINB MASK ; // Pin−Change−I n t e r r u p t deaktivieren 209 210 EIMSK = (0<<7) ; } 211 212 213 214 /∗ −−− g l o b a l e I n i t i a l i s i e r u n g −−− ∗/ 215 void i n i t i a l i z e r ( ) 216 { 217 // I n i t USART 218 USARTinit ( ) ; 219 220 TIMSK0 = (1<<OCIE0A) ; // Timer−I n t e r r u p t s aktivieren 221 TIMSK2 = (1<<OCIE2A) ; 222 223 224 i f ( ! iDebugFlag ) { // PortB−Pin 4 a l s Eingang s c h a l t e n & P u l l −Up Widerstände s c h a l t e n 225 DDRB = i O f f ; 226 PORTB = 0 x10 ; 227 228 /∗ 229 // PortD−Pin a l s Ausgang f ü r d i e Fehlermeldung s c h a l t e n 230 DDRD = iOn ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 231 PORTD = i O f f ; 232 ∗/ 233 DDRD = i S e c u r e P o r t D ; 234 PORTD = i S e c u r e P o r t D ; Seite 82 235 236 // Pin−Change−I n t e r r u p t f ü r PortB s c h a l t e n 237 PCMSK1 = PINB MASK ; 238 EIMSK = (1<<7) ; } 239 240 } 241 242 /∗ −−− Taster −I n t e r r u p t −Routine −−−−−− ∗/ 243 SIGNAL( PCINT1 vect ) 244 { 245 246 PinChangeInterrupt ( ) ; } 247 248 249 /∗ −−− Ausf ührende Routine d e r Taster −ISR −−− ∗/ 250 void PinChangeInterrupt ( void ) 251 { 252 char cbuttons ; 253 254 c b u t t o n s = ( ˜PINB) & PINB MASK ; 255 256 // Output v i r t u a l k e y s 257 i f ( c b u t t o n s & (1<<BUTTON O) ) { // Ü be rpr üfe ob g e d r ü c k t e Taste = T a s t e r war 258 programmStart ( ) ; // wenn ja , programmstart a u s f ü h r e n i f ( iSyncFlag ) { 259 // und f a l l s gew ünscht dem anderen System das S t a r t z e i c h e n senden 260 sendChar ( ’ x ’ ) ; } 261 } 262 263 264 EIFR = (0<<PCIF1 ) ; // Lösche Pinchange− I n t e r r u p t −Flag 265 } 266 267 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 268 /∗ −−− Daten senden −−− ∗/ 269 v o i d sendChar ( c h a r data ) 270 { 271 Seite 83 // Darauf warten , d a s s das S e n d e r e g i s t e r l e e r wird und b e r e i t f ü r neue Daten zum Senden i s t . 272 w h i l e ( ! ( UCSRA & (1<<UDRE) ) ) ; 273 274 // Daten i n s S e n d e r e g i s t e r s c h i e b e n 275 UDR = data ; 276 277 // Warte darauf , d a s s Daten g e s e n d e t werden 278 w h i l e ( ! ( UCSRA & (1<<TXC) ) ) ; 279 } 280 281 282 /∗ −−− S e r i e l l e S c h n i t t s t e l l e i n i t i a l i s i e r e n −−− ∗/ 283 v o i d USARTinit ( ) 284 { 285 286 // S e r i e l l e S c h n i t t s t e l l e a l s Sender und Empfänger initialisieren UCSRB = (1<<RXEN) |(1<<TXEN) |(0<<RXCIE) |(0<<UDRIE) ; 287 288 289 // Asynchroner Modus mit 8 B i t s , k e i n e P a r i t y und einem Stop−B i t e i n s t e l l e n UCSRC = (0<<UMSEL) |(0<<UPM0) |(0<<USBS) |(3<<UCSZ0) |(0<< 290 UCPOL) ; 291 292 // Baudratenwert ( Berechnung s i e h e Header ) dem R e g i s t e r zuweisen 293 UBRRH = ( u n s i g n e d l o n g )UBRR VAL>>8; 294 UBRRL = ( u n s i g n e d l o n g )UBRR VAL; 295 296 297 // Enable i n t e r r u p t s 298 sei () ; 299 } 300 301 302 /∗ −−− F e h l e r r o u t i n e f ü r unbekannte F e h l e r −−− ∗/ 303 void stdError ( ) { Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 304 c l i () ; Seite 84 // I n t e r r u p t −Behandlungen deaktivieren 305 wdt disable () ; // Watchdog d e a k t i v i e r e n 306 307 308 DDRB = iOn ; 309 //DDRD = iOn ; 310 DDRD = i S e c u r e P o r t D ; // P o r t s a l s Ausgang s c h a l t e n 311 312 PORTB = i O f f ; 313 314 eepromWrite ( i S p e i c h e r 1 , 6 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 315 while (1) { 316 317 // F e h l e r c o d e an PortD ausgeben . F e h l e r c o d e l a u t T a b e l l e 318 PORTD = ( 0xAA & i S e c u r e P o r t D ) ; 319 delay loop 2 (65535) ; 320 delay loop 2 (65535) ; 321 delay loop 2 (65535) ; 322 delay loop 2 (65535) ; 323 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 324 delay loop 2 (65535) ; 325 delay loop 2 (65535) ; 326 delay loop 2 (65535) ; 327 delay loop 2 (65535) ; } 328 329 } 330 331 /∗ −−− F e h l e r r o u t i n e f ü r S y n c h r o n i s a t i o n s f e h l e r −−− ∗/ 332 void syncError ( ) { 333 c l i () ; // I n t e r r u p t −Behandlungen deaktivieren 334 wdt disable () ; // Watchdog d e a k t i v i e r e n 335 336 eepromWrite ( i S p e i c h e r 1 , 4 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 337 eepromWrite ( i S p e i c h e r 2 , c S t a t u s ) ; 338 339 DDRB = iOn ; 340 //DDRD = iOn ; // P o r t s a l s Ausgang s c h a l t e n Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 341 Seite 85 DDRD = i S e c u r e P o r t D ; 342 343 PORTB = c S t a t u s ; 344 while (1) { 345 346 // F e h l e r c o d e an PortD ausgeben . F e h l e r c o d e l a u t T a b e l l e 347 PORTD = ( 0 x66 & i S e c u r e P o r t D ) ; 348 delay loop 2 (65535) ; 349 delay loop 2 (65535) ; 350 delay loop 2 (65535) ; 351 delay loop 2 (65535) ; 352 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 353 delay loop 2 (65535) ; 354 delay loop 2 (65535) ; 355 delay loop 2 (65535) ; 356 delay loop 2 (65535) ; } 357 358 } 359 360 /∗ −−− F e h l e r r o u t i n e f ü r Watchdog−Reset −−− ∗/ 361 v o i d wdError ( ) { 362 c l i () ; // I n t e r r u p t −Behandlungen deaktivieren 363 wdt disable () ; // Watchdog d e a k t i v i e r e n 364 365 eepromWrite ( i S p e i c h e r 1 , 3 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 366 367 DDRB = iOn ; 368 //DDRD = iOn ; 369 DDRD = i S e c u r e P o r t D ; // P o r t s a l s Ausgang s c h a l t e n 370 371 PORTB = i S e c u r e P o r t D ; 372 373 while (1) { 374 // F e h l e r c o d e an PortD ausgeben . F e h l e r c o d e l a u t T a b e l l e 375 PORTD = ( 0 x99 & i S e c u r e P o r t D ) ; 376 delay loop 2 (65535) ; 377 delay loop 2 (65535) ; 378 delay loop 2 (65535) ; 379 delay loop 2 (65535) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 380 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 381 delay loop 2 (65535) ; 382 delay loop 2 (65535) ; 383 delay loop 2 (65535) ; 384 delay loop 2 (65535) ; } 385 386 Seite 86 } 387 388 /∗ −−− F e h l e r r o u t i n e f ü r S e l b s t t e s t f e h l e r −−− ∗/ 389 void t e s t E r r o r ( ) { 390 c l i () ; // I n t e r r u p t −Behandlungen deaktivieren 391 wdt disable () ; 392 393 // I n i t i a l i s i e r e d i e P o r t s a l s Ausgang und gebe Fehlermeldung und a k t u e l l e S e l b s t t e s t n r . aus 394 DDRD = i S e c u r e P o r t D ; 395 DDRB = 0xFF ; 396 PORTB = i T e s t S t a t ; 397 398 eepromWrite ( i S p e i c h e r 1 , 5 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 399 eepromWrite ( i S p e i c h e r 2 , i T e s t S t a t ) ; 400 while (1) { 401 402 // S e t z t d i e LEDs an PORTD a u f den F e h l e r c o d e −Anzeige 403 PORTD = ( 0 x55 & i S e c u r e P o r t D ) ; 404 delay loop 2 (65535) ; 405 delay loop 2 (65535) ; 406 delay loop 2 (65535) ; 407 delay loop 2 (65535) ; 408 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 409 delay loop 2 (65535) ; 410 delay loop 2 (65535) ; 411 delay loop 2 (65535) ; 412 delay loop 2 (65535) ; } 413 414 } 415 416 /∗ −−− F e h l e r r o u t i n e f ü r den F a l l e i n e s A u s f a l l s d e s anderen Systems −−− ∗/ Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 417 Seite 87 void ausfError ( ) { 418 c l i () ; // I n t e r r u p t −Behandlungen deaktivieren 419 wdt disable () ; // Watchdog d e a k t i v i e r e n 420 421 eepromWrite ( i S p e i c h e r 1 , 1 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 422 eepromWrite ( i S p e i c h e r 2 , c S t a t u s ) ; 423 424 DDRB = iOn ; 425 //DDRD = iOn ; 426 DDRD = i S e c u r e P o r t D ; // P o r t s a l s Ausgang s c h a l t e n 427 428 PORTB = c S t a t u s ; 429 while (1) { 430 431 // F e h l e r c o d e an PortD ausgeben . F e h l e r c o d e l a u t T a b e l l e 432 PORTD = ( iOn & i S e c u r e P o r t D ) ; 433 delay loop 2 (65535) ; 434 delay loop 2 (65535) ; 435 delay loop 2 (65535) ; 436 delay loop 2 (65535) ; 437 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 438 delay loop 2 (65535) ; 439 delay loop 2 (65535) ; 440 delay loop 2 (65535) ; 441 delay loop 2 (65535) ; } 442 443 } 444 445 /∗ −−− F e h l e r r o u t i n e f ü r den Ablauf d e s Timers d e r H a u p t s c h l e i f e −−− ∗/ 446 447 void z e i t E r r o r ( ) { c l i () ; // I n t e r r u p t −Behandlungen deaktivieren 448 wdt disable () ; // Watchdog d e a k t i v i e r e n 449 450 eepromWrite ( i S p e i c h e r 1 , 2 ) ; // F e h l e r w e r t i n s Eeprom s c h r e i b e n 451 DDRB = iOn ; 452 //DDRD = iOn ; // P o r t s a l s Ausgang s c h a l t e n Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 453 Seite 88 DDRD = i S e c u r e P o r t D ; 454 while (1) { 455 456 // F e h l e r c o d e an PortD ausgeben . F e h l e r c o d e l a u t T a b e l l e 457 PORTD = ( iOn & i S e c u r e P o r t D ) ; 458 PORTB = iOn ; 459 delay loop 2 (65535) ; 460 delay loop 2 (65535) ; 461 delay loop 2 (65535) ; 462 delay loop 2 (65535) ; 463 PORTD = ( i O f f & i S e c u r e P o r t D ) ; 464 PORTB = i O f f ; 465 delay loop 2 (65535) ; 466 delay loop 2 (65535) ; 467 delay loop 2 (65535) ; 468 delay loop 2 (65535) ; } 469 470 } 471 472 473 /∗ −−−− S e l b s t t e s t −A u f r u f −−− ∗/ 474 v o i d doTest ( ) { 475 selectTest () ; // Methode z u r Testauswahl aufrufen 476 i T e s t S t a t ++; 477 i f ( iTestStat > iTestAnzahl ) // Z ä h l e r erhöhen // Wenn Z ä h l e r g r ö ß e r a l s Testanzahl . . 478 479 iTestStat = 0; // . . Z ä h l e r zur ück s e t z e n } 480 481 /∗ −−− S y n c h r o n i s a t i o n s r o u t i n e −−− ∗/ 482 /∗ −−− empfängt und s e n d e t a k t u e l l e n S t a t u s −−− ∗/ 483 v o i d doSync ( ) { 484 485 // a k t u e l l e n S t a t u s senden 486 i f ( c S t a t u s <= iMaxStat ) { 487 sendChar ( c S t a t u s ) ; 488 } 489 else 490 stdError () ; 491 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.1 Quellcode Main-App.c 492 // Watchdog Seite 89 zur ück s e t z e n um k e i n e n Alarm beim Warten a u f S t a t u s a n t w o r t zu s c h l a g e n 493 wdt reset () ; 494 495 delay loop 2 (4000) ; 496 497 TCNT2 = 0 ; 498 OCR2A = iDelayMs ; // Lädt das Vergleichsregister 499 TCCR2A = (1<<CS20 ) |(1<<CS21 ) |(1<<CS22 500 ) |(1<<WGM21) ; // I n i t i a l i s i e r t den Timer und s t a r t e t i h n 501 502 // S c h l e i f e z u r ü b e r p r ü f u n g ob S y n c h r o n i s a t i o n s t a t t g e f u n d e n hat 503 w h i l e ( ! ( UCSRA & (1<<RXC) ) ) ; // P r ü f e ob Daten empfangen wurden 504 505 c R e c e i v e d = UDR; 506 i f ( c R e c e i v e d != c S t a t u s ) { 507 // Wenn Daten empfangen mit a k t u e l l e m S t a t u s v e r g l e i c h e n 508 syncError () ; // Bei u n g l e i c h h e i t S y c h r o n i t ä t s v e r l u s t melden } 509 510 TCCR2A &= ˜((1<<CS20 ) |(1<<CS21 ) |(1<<CS22 ) ) ; 511 anhalten 512 } 513 514 /∗ −−− Timer0−I n t e r r u p t −Routine −−− ∗/ 515 SIGNAL( TIMER0 COMP vect ) 516 { 517 TCCR0A &= ˜((1<<CS00 ) |(1<<CS02 ) ) ; 518 zeitError () ; 519 } 520 521 /∗ −−− Timer2−I n t e r r u p t −Routine −−− ∗/ 522 SIGNAL( TIMER2 COMP vect ) 523 { 524 TCCR2A &= ˜((1<<CS20 ) |(1<<CS21 ) |(1<<CS22 ) ) ; 525 ausfError () ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik // Timer A.1 Quellcode Main-App.c 526 Seite 90 } 527 528 /∗ −−− Funktion um i n s EEEPROM zu s c h r e i b e n −−− ∗/ 529 530 v o i d eepromWrite ( i n t i S p e i c h e r , i n t i E r r o r ) { eeprom write byte ( ( u i n t 8 t ∗) iSpeicher , i E r r o r ) ; 531 532 } 533 534 /∗ −−− Ü b e r s c h r e i b t d i e S p e i c h e r z e l l e n im EEPROM mit 0 −−− ∗/ 535 /∗ −−− f a l l s d i e s e n i c h t schon 0 s i n d . −−− ∗/ 536 v o i d eepromOverwrite ( ) { i f ( eepromRead ( i S p e i c h e r 1 ) != 0 ) { 537 538 eepromWrite ( i S p e i c h e r 1 , 0 ) ; } 539 540 i f ( eepromRead ( i S p e i c h e r 2 ) != 0 ) { 541 542 eepromWrite ( i S p e i c h e r 2 , 0 ) ; } 543 544 } 545 546 /∗ −−− Funktion um aus dem EEPROM zu l e s e n −−− ∗/ 547 i n t eepromRead ( i n t i S p e i c h e r ) { return eeprom read byte ( ( u i n t 8 t ∗) i S p e i c h e r ) ; 548 549 } Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.2 Quellcode Main-App.h Seite 91 A.2 Quellcode Main-App.h 1 #i n c l u d e <avr / i o . h> 2 #i n c l u d e <avr / i n t e r r u p t . h> 3 #i n c l u d e < s t d l i b . h> 4 #i n c l u d e <avr / s i g n a l . h> 5 #i n c l u d e <s t d i o . h> 6 #i n c l u d e <avr /wdt . h> 7 #i n c l u d e <avr / d e l a y . h> 8 #i n c l u d e <avr / eeprom . h> 9 10 #i f n d e f EEMEM 11 // a l l e T e x t s t e l l e n EEMEM im Q u e l l c o d e durch attribute . . . ersetzen 12 #d e f i n e EEMEM attribute ( ( s e c t i o n ( ” . eeprom ” ) ) ) 13 #e n d i f 14 15 16 #d e f i n e BUTTON O 4 // Wenn Center g e d r ü c k t wird , wird PortB Pin4 g e s e t z t 17 18 #d e f i n e PINB MASK (1<<PINB4 ) 19 20 #d e f i n e FOSC 8000000UL 21 #d e f i n e BAUD 38400UL // T a k t f r e q u e n z i n Hz // Baud−Rate i n B i t s pro Sekunde 22 #d e f i n e UBRR VAL FOSC/16/BAUD−1 // Berechnung d e s Wertes f ü r das R e g i s t e r UBBR ( 1 6 Bit−R e g i s t e r ) 23 24 #d e f i n e DELAY FOSC/1000/1024 // Umrechnungswert f ü r Delayfunktion 25 26 27 void i n i t i a l i z e r ( void ) ; 28 v o i d USARTinit ( v o i d ) ; 29 char isCharAvailable ( void ) ; 30 char receiveChar ( void ) ; 31 v o i d sendChar ( c h a r ) ; 32 void sendString ( char ∗) ; 33 v o i d programmInit ( v o i d ) ; 34 v o i d programmStart ( v o i d ) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.2 Quellcode Main-App.h 35 void statusSenden ( void ) ; 36 void parseInput ( char ∗) ; 37 void PinChangeInterrupt ( void ) ; 38 void stdError ( void ) ; 39 void syncError ( void ) ; 40 void ausfError ( void ) ; 41 void z e i t E r r o r ( void ) ; 42 void t e s t E r r o r ( void ) ; 43 v o i d wdError ( v o i d ) ; 44 v o i d doTest ( v o i d ) ; 45 v o i d doSync ( v o i d ) ; 46 v o i d getSync ( v o i d ) ; 47 v o i d eepromWrite ( i n t , i n t ) ; 48 v o i d eepromOverwrite ( v o i d ) ; 49 i n t eepromRead ( i n t ) ; 50 // v o i d CRCSet ( v o i d ) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 92 A.3 Quellcode TestLib.c Seite 93 A.3 Quellcode TestLib.c 1 #i n c l u d e ” Te stLib . h” 2 #i n c l u d e ”Main−App . h” 3 4 // 0 − 31 5 // 32 6 // 33 − 38 : Arithmetische Tests 7 // 39 − 45 : Tests der l o g i s c h e n Bitoperationen 8 // 46 − 48 : T e s t s d e r l o g i s c h e n O pe ra t io ne n 9 // 49 − 52 : T e s t s d e r T r a n s f e r −B e f e h l e 10 // 53 : RAM−Test 11 // 54 : Flash−Test 12 // 55 : Port−Test 13 // 96 − 98 14 // 99 : Registertests : Push−Pop−Return−Jump−Test : Timer−T e s t s : Watchdog−Test 15 16 i n t iTestAnzahl = 54; // Die Anzahl d e r z y k l i s c h zu durchlaufenden Tests 17 int iTestStat = 0; // Der a k t u e l l a u s g e w ä h l t e selbsttest 18 19 i n t iWDSpeicher = 0 x02 ; // S p e i c h e r z e l l e 3 d e k l a r i e r e n 20 21 22 // V a r i a b l e b e i n h a l t e t d i e e r s t e zu t e s t e n d e Ramzelle 23 u n s i g n e d c h a r ∗ c E r s t e R a m Z e l l e = ( u n s i g n e d c h a r ∗ ) 0 x0100 ; 24 // Anzahl d e r zu t e s t e n d e n Ramzellen pro Z yk l us 25 u n s i g n e d i n t iRamTestLaenge = 1 0 ; 26 // Anfang und Ende vom Ram 27 u n s i g n e d c h a r ∗RamA = ( u n s i g n e d c h a r ∗ ) 0 x0100 ; 28 u n s i g n e d c h a r ∗RamE = ( u n s i g n e d c h a r ∗ ) 0x04FF ; 29 30 31 // Z e i g e r a u f a k t u e l l e P o s i t i o n d e s F l a s h s p e i c h e r s 32 u n s i g n e d c h a r ∗ c F l a s h Z e i g e r = ( u n s i g n e d c h a r ∗ ) 0 x0000 ; 33 // Anzahl d e r zu t e s t e n d e n F l a s h z e l l e n pro Z yk l us 34 unsigned i n t iFlashTestLaenge = 10; 35 // a k t u e l l e r CRC−Wert 36 u n s i g n e d i n t iCRC ; 37 // e r w a r t e t e r CRC−Wert Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c Seite 94 38 u n s i g n e d i n t iCRCCheck ; 39 // Anfang und Ende d e r CRC−Berechnung d e s Flash−S p e i c h e r s 40 u n s i g n e d c h a r ∗ FlashA = ( u n s i g n e d c h a r ∗ ) 0 x0000 ; 41 u n s i g n e d c h a r ∗ FlashE = ( u n s i g n e d c h a r ∗ ) 0x3FFC ; 42 43 44 void s e l e c t T e s t ( ) { 45 46 startTest ( iTestStat ) ; } 47 48 // f ü h r t den Gewählten Test aus ! 49 void s t a r t T e s t ( i n t iTestNr ) { 50 iTestStat = iTestNr ; 51 switch ( iTestNr ) { 52 53 // R e g i s t e r t e s t s 54 c a s e 0 : TEST R0 ( ) ; break ; 55 c a s e 1 : TEST R1 ( ) ; break ; 56 c a s e 2 : TEST R2 ( ) ; break ; 57 c a s e 3 : TEST R3 ( ) ; break ; 58 c a s e 4 : TEST R4 ( ) ; break ; 59 c a s e 5 : TEST R5 ( ) ; break ; 60 c a s e 6 : TEST R6 ( ) ; break ; 61 c a s e 7 : TEST R7 ( ) ; break ; 62 c a s e 8 : TEST R8 ( ) ; break ; 63 c a s e 9 : TEST R9 ( ) ; break ; 64 c a s e 1 0 : TEST R10 ( ) ; break ; 65 c a s e 1 1 : TEST R11 ( ) ; break ; 66 c a s e 1 2 : TEST R12 ( ) ; break ; 67 c a s e 1 3 : TEST R13 ( ) ; break ; 68 c a s e 1 4 : TEST R14 ( ) ; break ; 69 c a s e 1 5 : TEST R15 ( ) ; break ; 70 c a s e 1 6 : TEST R16 ( ) ; break ; 71 c a s e 1 7 : TEST R17 ( ) ; break ; 72 c a s e 1 8 : TEST R18 ( ) ; break ; 73 c a s e 1 9 : TEST R19 ( ) ; break ; 74 c a s e 2 0 : TEST R20 ( ) ; break ; 75 c a s e 2 1 : TEST R21 ( ) ; break ; 76 c a s e 2 2 : TEST R22 ( ) ; break ; 77 c a s e 2 3 : TEST R23 ( ) ; break ; 78 c a s e 2 4 : TEST R24 ( ) ; break ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 79 c a s e 2 5 : TEST R25 ( ) ; break ; 80 c a s e 2 6 : TEST R26 ( ) ; break ; 81 c a s e 2 7 : TEST R27 ( ) ; break ; 82 c a s e 2 8 : TEST R28 ( ) ; break ; 83 c a s e 2 9 : TEST R29 ( ) ; break ; 84 c a s e 3 0 : TEST R30 ( ) ; break ; 85 c a s e 3 1 : TEST R31 ( ) ; break ; 86 87 // Push−Pop−Ret−Test 88 c a s e 3 2 : PPRJ TEST ( ) ; break ; 89 90 // A r i t h m e t i s c h e T e s t s 91 c a s e 3 3 : ADD TEST( ) ; break ; 92 c a s e 3 4 : ADDC TEST( ) ; break ; 93 c a s e 3 5 : SUB TEST ( ) ; break ; 94 c a s e 3 6 : INC TEST ( ) ; break ; 95 c a s e 3 7 : DEC TEST( ) ; break ; 96 c a s e 3 8 : MUL TEST( ) ; break ; 97 98 // T e s t s d e r l o g i s c h e n B i t o p e r a t i o n e n 99 c a s e 3 9 : CLR TEST ( ) ; break ; 100 c a s e 4 0 : COM TEST( ) ; break ; 101 c a s e 4 1 : LSL TEST ( ) ; break ; 102 c a s e 4 2 : LSR TEST ( ) ; break ; 103 c a s e 4 3 : ROL TEST( ) ; break ; 104 c a s e 4 4 : ROR TEST( ) ; break ; 105 c a s e 4 5 : SWAP TEST( ) ; break ; 106 107 // T e s t s d e r l o g i s c h e n Op e ra t io ne n 108 c a s e 4 6 : AND TEST( ) ; break ; 109 c a s e 4 7 : OR TEST( ) ; break ; 110 c a s e 4 8 : EOR TEST( ) ; break ; 111 112 // T e s t s d e r T r a n s f e r −B e f e h l e 113 c a s e 4 9 : m o v t e s t ( ) ; break ; 114 c a s e 5 0 : movw test ( ) ; break ; 115 c a s e 5 1 : l d i t e s t ( ) ; break ; 116 c a s e 5 2 : l d t e s t ( ) ; break ; 117 118 // Test d e s Rams 119 c a s e 5 3 : Ram Test ( ) ; break ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 95 A.3 Quellcode TestLib.c Seite 96 120 121 // Test d e s Flashroms 122 c a s e 5 4 : F l a s h T e s t ( ) ; break ; 123 124 // Port−Test 125 c a s e 5 5 : PortTest ( ) ; break ; 126 127 // T e s t s d e r Timer 128 c a s e 9 6 : Timer0Test ( ) ; break ; 129 c a s e 9 7 : Timer1Test ( ) ; break ; 130 c a s e 9 8 : Timer2Test ( ) ; break ; 131 132 // Watchdog−Test 133 c a s e 9 9 : WDTest ( ) ; break ; 134 135 // S o n s t i g e s 136 d e f a u l t : s t d E r r o r ( ) ; break ; } 137 138 } 139 140 // f ü h r t a l l e vorhanden S e l f T e s t s aus 141 // Bsp . f ü r S t a r t ü b e r p r ü f u n g ! 142 void i n i t T e s t ( ) { w h i l e ( i T e s t S t a t <= i T e s t A n z a h l ) { 143 144 selectTest () ; 145 i T e s t S t a t ++; 146 } 147 iTestStat = 0; 148 } 149 150 151 // Methode um d i e P o r t s a u f k o r r e k t e Funktion zu ü b e r p r ü f e n 152 v o i d PortTes t ( ) { 153 u i n t 8 t iPruefVar = 0; 154 i n t iDDRB = DDRB; // Pr üf−V a r i a b l e // Wert d e r a l t e n Port− Zustände s p e i c h e r n 155 i n t iDDRD = DDRD; 156 i n t iPortB = PORTB; 157 i n t iPortD = PORTD; 158 159 DDRB = 0 x00 ; // PortB a l s Eingang Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 160 DDRD = 0xFF ; Seite 97 // PortD a l s Ausgang 161 162 // Pr üf −0−Test 163 i P r u e f V a r = ˜0 x01 ; 164 PORTD = i P r u e f V a r ; 165 f o r ( i n t i =0; i <=7; i ++){ 166 // Pr üf −0 v o r l a d e n i f (PINB != i P r u e f V a r ) // V e r g l e i c h e n von PortB und p r u e f V ar und f a l l s n ö t i g , 167 testError () ; // i n Fehlermeldung s p r i n g e n 168 i P r u e f V a r = ( i Prue fVar <<1) | 0 x01 ; 169 PORTD = i P r u e f V a r ; // 0 s c h i e b e n } 170 171 172 // Pr üf −1−Test 173 /∗ 174 i P r u e f V a r = 0 x01 ; 175 PORTD = i P r u e f V a r ; 176 f o r ( i n t i =0; i <=7; i ++){ 177 // Pr üf −1 v o r l a d e n i f (PINB != i P r u e f V a r ) // V e r g l e i c h e n von PortB und p r u e f V ar und f a l l s n ö t i g , 178 testError () ; // i n Fehlermeldung s p r i n g e n 179 i P r u e f V a r = ( i P r u e f V a r << 1 ) ; 180 PORTD = i P r u e f V a r ; 181 } 182 ∗/ // 1 s c h i e b e n 183 184 // a l t e Zustände zur ück s e t z e n 185 DDRB = iDDRB ; 186 PORTB = iPortB ; 187 188 DDRD = iDDRD ; 189 PORTD = iPortD ; 190 191 } 192 193 // Routine f ü r den e i n f a c h e r e n RAM−Test 194 v o i d Ram Test ( ) { 195 i f ( ( c E r s t e R a m Z e l l e + iRamTestLaenge ) > RamE) { // Pr üfen ob Prüfrahmen über Ramende h i n a u s 196 u n s i g n e d i n t iRamTestLaengeTemp = ( c E r s t e R a m Z e l l e + iRamTestLaenge ) − RamE; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 197 Ram Check ( cErsteRamZelle , RamE) ; Seite 98 // Wenn ja , b i s zum Ende p r ü f e n und 198 c E r s t e R a m Z e l l e = RamA; // P o i n t e r a u f Anfang setzten 199 Ram Check ( cErsteRamZelle , ( c E r s t e R a m Z e l l e + iRamTestLaengeTemp ) ) ; 200 } 201 else 202 // Ram Test d u r c h f ü h r e n . 203 Ram Check ( cErsteRamZelle , ( c E r s t e R a m Z e l l e + iRamTestLaenge ) ) ; 204 205 // Ramzelle a u f n ä c h s t e Z e l l e s e t z e n ( f a l l s Ramende , dann a u f Ramanfang ) 206 cErsteRamZelle = cErsteRamZelle + 1 ; 207 i f ( c E r s t e R a m Z e l l e > RamE) 208 c E r s t e R a m Z e l l e = RamA; 209 210 } 211 212 // e i g e n t l i c h e r Ram Test 213 v o i d Ram Check ( u n s i g n e d c h a r ∗ cStartAddr , u n s i g n e d c h a r ∗ cEndAddr ) 214 { 215 unsigned char cOriginalByte ; 216 v o l a t i l e u n s i g n e d c h a r ∗ cTestAddr ; 217 218 f o r ( cTestAddr = cStartAddr ; cTestAddr < cEndAddr ; cTestAddr++ ) { c O r i g i n a l B y t e = ∗ cTestAddr ; 219 220 221 ∗ cTestAddr = 0 x55 ; 222 i f ( ∗ cTestAddr != 0 x55 ) 223 testError () ; 224 225 ∗ cTestAddr = 0xAA ; 226 i f ( ∗ cTestAddr != 0xAA ) 227 testError () ; 228 ∗ cTestAddr = c O r i g i n a l B y t e ; 229 230 } Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 231 Seite 99 } 232 233 // Test d e s Flash−S p e i c h e r s 234 void Flash Test ( ) { i f ( ( c F l a s h Z e i g e r + i F l a s h T e s t L a e n g e ) >= FlashE ) { 235 236 u n s i g n e d i n t iFlashTestLaengeTemp = ( c F l a s h Z e i g e r + i F l a s h T e s t L a e n g e ) − FlashE ; 237 f o r ( i n t i = 0 ; i <= iFlashTestLaengeTemp ; i ++){ // i f ( ( i n t ) c F l a s h Z e i g e r != 0x041B | | ( i n t ) c F l a s h Z e i g e r 238 != 0 x0428 ) 239 iCRC = c r c c c i t t u p d a t e (iCRC , pgm read byte ( c F l a s h Z e i g e r++)) ; 240 // e l s e 241 // c F l a s h Z e i g e r ++; 242 } 243 // Pr üfen ob e r m i t t e l t e CRC mit e r w a r t e t e r Übereinstimmt 244 iCRCCheck = ( eepromReadFrom ( 8 ) <<8) | eepromReadFrom ( 9 ) ; 245 i f ( iCRCCheck != iCRC) { 246 // wenn n i c h t , F e h l e r r o u t i n e a u f r u f e n 247 testError () ; 248 } 249 // Z e i g e r a u f F l a s h a n f a n g zur ück s e t z t e n 250 c F l a s h Z e i g e r = FlashA ; 251 // a k t u e l l e CRC nach Pr üfen zur ück s e t z t e n 252 iCRC = 0 ; 253 } 254 else{ 255 f o r ( i n t i = 0 ; i <= i F l a s h T e s t L a e n g e ; i ++){ // i f ( ( i n t ) c F l a s h Z e i g e r != 0x041B | | ( i n t ) c F l a s h Z e i g e r 256 != 0 x0428 ) 257 iCRC = c r c c c i t t u p d a t e (iCRC , pgm read byte ( c F l a s h Z e i g e r++)) ; 258 // e l s e 259 // c F l a s h Z e i g e r ++; } 260 } 261 262 263 } 264 265 266 // Watchdog−T e s t r o u t i n e Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 267 Seite 100 v o i d WDTest ( ) { 268 eepromWriteTo ( iWDSpeicher , 1 ) ; // Watchdog−Test− S t a t u s im EEPROM f e s t h a l t e n 269 270 w d t e n a b l e (WDTO 15MS) ; 271 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 272 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 273 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; 274 d e l a y l o o p 2 ( 5 ∗ DelayMS ) ; // Watchdog a u f z i e h e n // Warten // Wenn e r h i e r n i c h t zuschnappt i s t e r wohl d e f e k t 275 276 277 testError () ; // i n Fehlermeldung s p r i n g e n } 278 279 // Timer0−T e s t r o u t i n e 280 v o i d Timer0Test ( ) 281 { 282 int iZeit [5] , i ; 283 284 OCR0A = 10∗DELAY; // Lädt das V e r g l e i c h s r e g i s t e r ( 1 5mS) 285 TCNT0 = 0 ; 286 TCCR0A = (1<<WGM01) ; // I n i t i a l i s i e r t den Timer 287 288 // eepromWriteTo ( iWDSpeicher , 2 ) ; // Im EEPROM f e s t h a l t e n , d a s s Timer0Test l ä u f t . 289 // w d t e n a b l e (WDTO 15MS) ; // A k t i v i e r t den Watchdog 290 291 f o r ( i = 0 ; i < 5 ; i ++) 292 { TCCR0A = (1<<CS00 ) |(1<<CS02 ) ; 293 294 d e l a y l o o p 2 ( DelayMS ) ; 295 TCCR0A &= ˜((1<<CS00 ) |(1<<CS02 ) ) ; 296 i Z e i t [ i ] = TCNT0; 297 i f ( i Z e i t [ i ] != ( ( i +1) ∗ DELAY) ) // Timer s t a r t e n // Timer l a u f e n l a s s e n // Timer s t op pe n // V e r g l e i c h e n mit Erwartungshaltung 298 299 testError () ; } 300 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 301 Seite 101 // w d t d i s a b l e ( ) ; // D e a k t i v i e r t den Watchdog 302 } 303 304 // Timer1−T e s t r o u t i n e 305 v o i d Timer1Test ( ) 306 { 307 unsigned i n t i Z e i t [ 1 0 ] , i ; 308 309 OCR1A = 10∗DELAY; // Lädt das V e r g l e i c h s r e g i s t e r ( 1 5mS) 310 TCNT1 = 0 ; 311 TCCR1A = (1<<WGM11) ; // I n i t i a l i s i e r t den Timer 312 313 // eepromWriteTo ( iWDSpeicher , 3 ) ; // Im EEPROM f e s t h a l t e n , d a s s Timer0Test l ä u f t . 314 // w d t e n a b l e (WDTO 15MS) ; // A k t i v i e r t den Watchdog 315 316 f o r ( i = 0 ; i < 5 ; i ++) 317 { TCCR1B = (1<<CS10 ) |(1<<CS12 ) ; 318 319 // Timer s t a r t e n d e l a y l o o p 2 ( DelayMS ) ; // Timer l a u f e n l a s s e n 320 TCCR1B &= ˜((1<<CS10 ) |(1<<CS12 ) ) ; 321 i Z e i t [ i ] = TCNT1; 322 i f ( i Z e i t [ i ] != ( ( i +1) ∗ DELAY) ) // Timer s t op pe n // V e r g l e i c h e n mit Erwartungshaltung 323 testError () ; } 324 325 326 // w d t d i s a b l e ( ) ; // D e a k t i v i e r t den Watchdog 327 } 328 329 // Timer2−T e s t r o u t i n e 330 v o i d Timer2Test ( ) 331 { 332 int iZeit [5] , i ; 333 Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.3 Quellcode TestLib.c 334 OCR2A = 10∗DELAY; Seite 102 // Lädt das V e r g l e i c h s r e g i s t e r ( 1 5mS) 335 TCNT2 = 0 ; 336 TCCR2A = (1<<WGM21) ; // I n i t i a l i s i e r t den Timer 337 338 // eepromWriteTo ( iWDSpeicher , 4 ) ; // Im EEPROM f e s t h a l t e n , d a s s Timer0Test l ä u f t . 339 // w d t e n a b l e (WDTO 15MS) ; // A k t i v i e r t den Watchdog 340 341 f o r ( i = 0 ; i < 5 ; i ++) 342 { TCCR2A = (1<<CS20 ) |(1<<CS21 ) |(1<<CS22 ) ; // Timer s t a r t e n 343 344 d e l a y l o o p 2 ( DelayMS ) ; // Timer l a u f e n l a s s e n TCCR2A &= ˜((1<<CS20 ) |(1<<CS21 ) |(1<<CS22 ) ) ; 345 // Timer stoppen 346 i Z e i t [ i ] = TCNT2; 347 i f ( i Z e i t [ i ] != ( ( i +1) ∗ DELAY) ) // V e r g l e i c h e n mit Erwartungshaltung 348 testError () ; } 349 350 351 // w d t d i s a b l e ( ) ; // D e a k t i v i e r t den Watchdog 352 } 353 354 355 // Routine um i n den EEPROM zu s c h r e i b e n 356 v o i d eepromWriteTo ( i n t i S p e i c h e r , i n t i I n f o ) { eeprom write byte ( ( u i n t 8 t ∗) iSpeicher , i I n f o ) ; 357 358 } 359 360 // Routine um aus dem EEPROM zu l e s e n 361 i n t eepromReadFrom ( i n t i S p e i c h e r ) { return eeprom read byte ( ( u i n t 8 t ∗) i S p e i c h e r ) ; 362 363 } Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.4 Quellcode TestLib.h Seite 103 A.4 Quellcode TestLib.h 1 #i n c l u d e <avr /wdt . h> 2 #i n c l u d e <avr / d e l a y . h> 3 #i n c l u d e <avr / eeprom . h> 4 #i n c l u d e <avr / c r c 1 6 . h> 5 #i n c l u d e <avr / pgmspace . h> 6 7 #d e f i n e FOSC 8000000UL 8 #d e f i n e DelayMS FOSC/4/1000 // T a k t f r e q u e n z i n Hz // DelayMs e n t s p r i c h t 1mS 9 #d e f i n e DELAY FOSC/1000/1024 10 11 e x t e r n i n t iWDSpeicher ; // S p e i c h e r z e l l e i n d e r d e r S t a t u s d e s WD−T e s t s f e s t g e h a l t e n wird 12 13 14 // V a r i a b l e d e f i n i e r e n 15 extern int iTestStat ; 16 extern i n t iTestAnzahl ; 17 18 // Methode z u r Auswahl d e s T e s t s d e k l a r i e r e n 19 void s e l e c t T e s t ( void ) ; 20 void startTest ( i n t ) ; 21 void i n i t T e s t ( void ) ; 22 23 // S o n s t i g e 24 v o i d eepromWriteTo ( i n t , i n t ) ; 25 i n t eepromReadFrom ( i n t ) ; 26 27 // R e g i s t e r t e s t s 28 e x t e r n v o i d TEST R0( v o i d ) ; 29 e x t e r n v o i d TEST R1( v o i d ) ; 30 e x t e r n v o i d TEST R2( v o i d ) ; 31 e x t e r n v o i d TEST R3( v o i d ) ; 32 e x t e r n v o i d TEST R4( v o i d ) ; 33 e x t e r n v o i d TEST R5( v o i d ) ; 34 e x t e r n v o i d TEST R6( v o i d ) ; 35 e x t e r n v o i d TEST R7( v o i d ) ; 36 e x t e r n v o i d TEST R8( v o i d ) ; 37 e x t e r n v o i d TEST R9( v o i d ) ; 38 e x t e r n v o i d TEST R10 ( v o i d ) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik A.4 Quellcode TestLib.h 39 e x t e r n v o i d TEST R11 ( v o i d ) ; 40 e x t e r n v o i d TEST R12 ( v o i d ) ; 41 e x t e r n v o i d TEST R13 ( v o i d ) ; 42 e x t e r n v o i d TEST R14 ( v o i d ) ; 43 e x t e r n v o i d TEST R15 ( v o i d ) ; 44 e x t e r n v o i d TEST R16 ( v o i d ) ; 45 e x t e r n v o i d TEST R17 ( v o i d ) ; 46 e x t e r n v o i d TEST R18 ( v o i d ) ; 47 e x t e r n v o i d TEST R19 ( v o i d ) ; 48 e x t e r n v o i d TEST R20 ( v o i d ) ; 49 e x t e r n v o i d TEST R21 ( v o i d ) ; 50 e x t e r n v o i d TEST R22 ( v o i d ) ; 51 e x t e r n v o i d TEST R23 ( v o i d ) ; 52 e x t e r n v o i d TEST R24 ( v o i d ) ; 53 e x t e r n v o i d TEST R25 ( v o i d ) ; 54 e x t e r n v o i d TEST R26 ( v o i d ) ; 55 e x t e r n v o i d TEST R27 ( v o i d ) ; 56 e x t e r n v o i d TEST R28 ( v o i d ) ; 57 e x t e r n v o i d TEST R29 ( v o i d ) ; 58 e x t e r n v o i d TEST R30 ( v o i d ) ; 59 e x t e r n v o i d TEST R31 ( v o i d ) ; 60 61 62 // Push−Pop−Ret−Test 63 e x t e r n v o i d PPRJ TEST( v o i d ) ; 64 65 // A r i t h m e t i s c h e T e s t s 66 e x t e r n v o i d ADD TEST( v o i d ) ; 67 e x t e r n v o i d ADDC TEST( v o i d ) ; 68 e x t e r n v o i d SUB TEST( v o i d ) ; 69 e x t e r n v o i d INC TEST( v o i d ) ; 70 e x t e r n v o i d DEC TEST( v o i d ) ; 71 e x t e r n v o i d MUL TEST( v o i d ) ; 72 73 // T e s t s d e r l o g i s c h e n B i t o p e r a t i o n e n 74 e x t e r n v o i d CLR TEST( v o i d ) ; 75 e x t e r n v o i d COM TEST( v o i d ) ; 76 e x t e r n v o i d LSL TEST ( v o i d ) ; 77 e x t e r n v o i d LSR TEST( v o i d ) ; 78 e x t e r n v o i d ROL TEST( v o i d ) ; 79 e x t e r n v o i d ROR TEST( v o i d ) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 104 A.4 Quellcode TestLib.h 80 e x t e r n v o i d SWAP TEST( v o i d ) ; 81 82 // T e s t s d e r l o g i s c h e n Op e ra t i o ne n 83 e x t e r n v o i d AND TEST( v o i d ) ; 84 e x t e r n v o i d OR TEST( v o i d ) ; 85 e x t e r n v o i d EOR TEST( v o i d ) ; 86 87 // T e s t s d e r T r a n s f e r −B e f e h l e 88 extern void mov test ( void ) ; 89 e x t e r n v o i d movw test ( v o i d ) ; 90 extern void l d i t e s t ( void ) ; 91 extern void l d t e s t ( void ) ; 92 93 // Port−T e s t s 94 v o i d PortTes t ( v o i d ) ; 95 96 // Timer−T e s t s 97 v o i d Timer0Test ( v o i d ) ; 98 v o i d Timer1Test ( v o i d ) ; 99 v o i d Timer2Test ( v o i d ) ; 100 101 // Watchdog−Test 102 v o i d WDTest( v o i d ) ; 103 104 // RAM−Test 105 v o i d Ram Test ( v o i d ) ; 106 v o i d Ram Check ( u n s i g n e d c h a r ∗ , u n s i g n e d c h a r ∗ ) ; 107 108 // Flash−Test 109 void Flash Test ( void ) ; Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 105 B Tabelle der Anforderung für Kategorien B Tabelle der Anforderung für Kategorien Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 106 B Tabelle der Anforderung für Kategorien Abbildung B.1: Tabelle der Anforderung für Kategorien [BGIA08, S. 46f] Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 107 B Tabelle der Anforderung für Kategorien C Schaltplan Abbildung C.1: Schaltplan eines Kanals Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik Seite 108 D CD-ROM mit Inhalten der Bachelor-Thesis Seite 109 D CD-ROM mit Inhalten der Bachelor-Thesis Diese Bachelor-Thesis ist als PDF-Dokument auf der beiliegenden CD-ROM enthalten. Weiterhin sind die entwickelte Software, sowie diverse Fotoaufnahmen der Testabläufe auf dem optischen Medium zu finden. Die Ordnerstruktur der CD-ROM ist in Abbildung D.1 dargestellt. Abbildung D.1: Ordnerstruktur der CD-ROM Maxim Küpper - Hochschule Bonn-Rhein-Sieg - FB02 - Informatik