Datenspeicherung unter Echtzeit im Embedded

Transcrição

Datenspeicherung unter Echtzeit im Embedded
Datenspeicherung unter Echtzeit im Embedded System einer
Bohrlochsonde
Bachelorarbeit
für die Prüfung zum
Bachelor of Engineering
des Studienganges Informationstechnik
an der
Dualen Hochschule Baden-Württemberg Karlsruhe
von
Daniel Schembri
6. September 2013
Matrikelnummer:
Kurs:
Ausbildungsfirma:
Betreuer:
Zweitbetreuer:
6048889
TiT10
Karlsruher Institut für Technlogie
Dipl. Ing. Stefan Dietze
Dipl. Ing. Bernhard Merkel
Bachelorarbeit
Daniel Schembri
Erklärung
gemäß § 5 (2) der „Studien- und Prüfungsordnung DHBW Technik“ vom
18. Mai 2009.
Ich habe die vorliegende Arbeit selbstständig verfasst und keine anderen als die
angegebenen Quellen und Hilfsmittel verwendet.
Ort, Datum
Unterschrift
B
Abstract
Diese Bachelorarbeit behandelt die Verarbeitung und Speicherung von Messund Bilddaten einer Bohrlochsonde unter Echtzeit. Die Sonde befindet sich dabei
4000m unter der Oberfläche, bei einer Umgebungstemperatur von bis zu 165°C
und 400Bar Druck. Die Bilddaten von Kameras, Messdaten und Statusmeldungen
sollen zur späteren Analyse auf einem Massenspeicher, zeitlich rekonstruierbar,
archiviert werden. Dazu ist es notwendig ein Verfahren zu entwerfen, mit dem
die Daten zuverlässig und bei ausreichender Performance gespeichert werden.
Dabei müssen verschiedene Anwendungsfälle und Szenarien der Messfahrt berücksichtigt werden. Das System wird zum Schluss getestet und bewertet.
Abstract
The duty of this bachelorthesis is to process and record measurment and videodata with realtime treatment in a borehole inspection vehicle. The vehicle is 4000m
down in the waterfiled pipe with temperature of 165°C and under pressure of
400Bar. The videodata, measurementdata and statusmessages has to been saved on a mass storage, mind the correct timestamp. Therefore it is necessary to
develop a performant and reliable method. Besides different usecases has to be
considered. At last the systemparts will be tested and evaluated.
Bachelorarbeit
Daniel Schembri
Inhaltsverzeichnis
Inhaltsverzeichnis
II
Abbildungsverzeichnis
IV
Abkürzungsverzeichnis
VII
1 Einleitung
1
2 Stand der Technik
2
3 Aufgabenstellung und Zielsetzung
6
4 Verbesserung des SD-Karten-Controllers
4.1 Einführung SPI-Bus mit SD-Karten
10
. . . . . . . . . . . . . . . . . 10
4.1.1 SPI-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.1.2 SD-Karten
. . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2 Der SPI-Memory-Controller-Core von Gaisler™ . . . . . . . . . . . 16
4.2.1 Der Aufbau des Cores . . . . . . . . . . . . . . . . . . . . 16
4.2.2 Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Erweiterung der Statemachine für SDHC-Karten . . . . . . . . . . 23
5 Entwicklung von Softwaretreibern für SD-Karten
29
5.1 SPI-SD Schicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.2 Das UMSG-Datenformat . . . . . . . . . . . . . . . . . . . . . . . 35
5.2.1 Das UMSGV-Bilddatenformat . . . . . . . . . . . . . . . . . 37
5.3 Messdaten-Filesystem . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3.1 Messfahrtinformationen im Header . . . . . . . . . . . . . . 38
5.3.2 Recovery der Messdaten . . . . . . . . . . . . . . . . . . . 38
II
Bachelorarbeit
Daniel Schembri
6 Messdatenverarbeitung in der Sonde
39
6.0.3 Der Begriff Echtzeit . . . . . . . . . . . . . . . . . . . . . . 39
6.1 Einführung in das Echzeitbetriebssystem eCos . . . . . . . . . . . 40
6.1.1 Multithreading . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.1.2 Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.2 Implementierung des Zeitstempelverfahrens . . . . . . . . . . . . . 42
6.3 Systemaufbau und Prozesse im HiTES . . . . . . . . . . . . . . . 44
6.4 Tests der gesamten HiTES-Firmware . . . . . . . . . . . . . . . . 44
6.4.1 Geschwindigkeits-Test . . . . . . . . . . . . . . . . . . . . 45
6.4.2 Filesystem-Test . . . . . . . . . . . . . . . . . . . . . . . . 46
6.4.3 Multithreading-Test . . . . . . . . . . . . . . . . . . . . . . 46
7 Fazit und Ausblick
48
8 Literatur- und Quellenverzeichnis
49
9 Anhang
54
III
Bachelorarbeit
Daniel Schembri
Abbildungsverzeichnis
2.1 HiTES verbunden mit dem Bedienstand[internes Plakat abgeändert]
2
2.2 Der Innere Aufbau des FPGAS . . . . . . . . . . . . . . . . . . . .
4
2.3 Die HiTES-Platine. Vorder- und Rückseite[7]
5
. . . . . . . . . . . .
4.1 SPI-Master und Slaves . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 SPI Timing Diagram CHPA = 0 [13 Kap.8.3.2] . . . . . . . . . . . . 12
4.3 SPI Timing Diagram CHPA = 1 [13 Kap.8.3.3] . . . . . . . . . . . . 13
4.4 SD- und mikro-SD-Karte [15] . . . . . . . . . . . . . . . . . . . . . 13
4.5 Aufbau einer SD-Karte [14 Kap.3.7] . . . . . . . . . . . . . . . . . 14
4.6 Blockdiagramm des Spimctrl-Cores von Gaisler[15 Kap.78.1] . . . . 17
4.7 Adress Offset der Spimctrl-Register[16 Kap.78.3] . . . . . . . . . . 17
4.8 Konfigurationsregister des Spimctrl-Cores[16 Kap.78.3] . . . . . . . 17
4.9 Kontrollregister des Spimctrl-Cores[16 Kap.78.3] . . . . . . . . . . 18
4.10 Statusregister des Spimctrl-Cores[16 Kap.78.3] . . . . . . . . . . . 18
4.11 Empfangsregister des Spimctrl-Cores[16 Kap.78.3] . . . . . . . . . 19
4.12 Senderegister des Spimctrl-Cores[16 Kap.78.3] . . . . . . . . . . . 19
4.13 GRMON: Auflistung der SPIM-Befehle . . . . . . . . . . . . . . . . 22
4.14 GRMON: SPIM-Status . . . . . . . . . . . . . . . . . . . . . . . . 23
4.15 Flussdiagramm des Spimctrl-Core . . . . . . . . . . . . . . . . . . 24
4.16 Flussdiagramm des Spimctrl-Core (Fortsetzung) . . . . . . . . . . 26
4.17 Zustandsdiagramm für den Initialisierungsprozess des Spimctrl-Core 27
4.18 GRMON: Ausgabe des CSD-Registers der SD-Karte über SPIM . . 28
5.1 Treiberschichten nach dem OSI-Modell . . . . . . . . . . . . . . . 29
5.2 Single- und Multiple-Blockread . . . . . . . . . . . . . . . . . . . . 30
IV
Bachelorarbeit
Daniel Schembri
5.3 Single- und Multiple-Blockwrite . . . . . . . . . . . . . . . . . . . . 32
5.4 links die UMSG, rechts der Header
. . . . . . . . . . . . . . . . . 35
5.5 Datenbereich bestehend aus einer Allgemeinen Nachricht . . . . . 36
5.6 Datenbereich bestehend aus einer TAB-Info . . . . . . . . . . . . . 36
5.7 Datenbereich bestehend aus CAN-Nachrichten . . . . . . . . . . . 36
5.8 UMSGV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.9 Datenbereich bestehend aus großer Textnachricht oder Frame . . . 37
6.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2 Aufbau des Systems mit SD-Karte (geänderte Abb. von [17 Kap.5.2
Abb.4.1]) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.3 Benchmark: Schreiben von 10MByte Testdaten auf die SD-Karte . . 45
6.4 Benchmark: Schreiben eines UMSGFS-Headers mit einem Eintrag
auf die SD-Karte . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.5 Benchmark: Test des Multithreading in eCos
V
. . . . . . . . . . . . 47
Bachelorarbeit
Daniel Schembri
Quellcodeverzeichnis
VI
Bachelorarbeit
Daniel Schembri
Abkürzungsverzeichnis
CAN
Controller Area Network
CPOL
Clock Polarity
CPHA
Clock Phase
CID
Card Identification Register
CSD
Card Specific Data
DSR
Deferred Service Routine
eCos
Embedded Configurable Operating System
FPGA
Field Programmable Gate Array
GRETH
Gaisler Research Ethernet
HC
High Capacity
HiTES
High Temperature Embedded System
I2C
Inter-Integrated Circuit
IP-Core
Intellectual Property Core
ISR
Interrupt Service Routine
JPEG
Joint Photographic Expert Group
LSB
Least Significant Bit
MISO
Master-In-Slave-Out
MMC
Interrupt Service Routine
MOSI
Master-Out-Slave-In
MSB
Most Significant Bit
OCR
Operation Condition Register
RCA
Relative Card Address Register
SCR
SD-Card Configuration Register
SD
Secure Data
SPI
Serial Peripheral Interface
SVGA
Super Video Graphics Array
UDP
User Datagram Protocol
UMSG
Universal Message
UMSGFS
Universal Message File System
UMSGT
Universal Message Trust
VII
Bachelorarbeit
Daniel Schembri
UMSGV
Universal Message Videodata
VHDL
VHSIC Hardware Description Language
W-LAN
Wireless Local Area Network
XC
extended Capacity
VIII
Bachelorarbeit
1
Daniel Schembri
Einleitung
Am 1.Oktober 2009 gab es einen Zusammenschluss zwischen der Universität
Karlsruhe und dem Forschungszentrum Karlsruhe. Daraus entstand das Karlsruher Institut für Technologie, kurz KIT [1]. Im Institut für Angewandte Informatik (IAI)
im Karlsruher Institut für Technologie wird eine Bohrlochsonde für die Geothermie
entwickelt die bis 200°C Umgebungstemperatur eingesetzt werden soll, um bei
Bohrungen bis ca. 4000m Tiefe, Mess- und Videodaten zu übermitteln. Die Daten
werden mit Hilfe eines Embedded Systems verarbeitet und mit UDP/IP-Protokoll
gebündelt durch ein Kabelmodem oder einen Übertrager für Glasfaser übermittelt. Das Hardwareprojekt wurde HiTES (High Temperature Embedded System)
genannt. Die HiTES-Platine befindet sich im gekühlten Bereich und verträgt bis
125°C.
Zwei Kameras liefern ihre Bilddaten seriell und werden hardcodiert von IP-Cores1
umgeformt und komprimiert. Dadurch kann man die volle Rechenleistung des
FPGAs ausnutzen, denn alle zusätzlichen IP-Cores arbeiten eigenständig und unabhängig von dem CPU-IP-Core. Die komprimierten Bilddaten werden anschließend in den RAM übertragen. Da die Bilddaten mit einem Kabelmodem nicht alle
unmittelbar übertragen werden können, sollen Mess- und Bilddaten zur späteren Auswertung auf einem Massenspeicher archiviert werden. Dazu gilt es ein
geeignetes Speichermedium zu finden, einen Treiber zu implementieren und ein
zweckmäßiges Dateisystem einzusetzen. Weiterhin sollen zeitkritische Aufgaben
und Zeitstempelverfahren zuverlässig ausgeführt werden. Hierzu ist ein passendes Betriebssystem notwendig.
1
Ein IP-Core ist ein Intelligent Property Core.
1
Bachelorarbeit
2
Daniel Schembri
Stand der Technik
HiTES soll zur Kommunikation mit der Sonde dienen. Es sollen Daten aufbereitet
und an einen Bedienstand(Host) an der Oberfläche gesendet werden. Folgend
ist das Zusammenspiel der Komponenten von der Sonde bis zum Bedienstand
dargestellt. Im gekühlten Bereich (bis 90Grad Celsius) befindet sich die HiTESPlatine:
Abbildung 2.1: HiTES verbunden mit dem Bedienstand[internes Plakat abgeändert]
Die Platine ist mit mehreren integrierten Schaltkreisen bestückt: einem Spartan6LX75T-FPGA[2, siehe auch 3 Kap.3] mit seriellem Netzlistenflash der Firma
Xilinx, einem 4MByte SRAM, einem Dual-PHY mit Ethernet-Schnittstelle, ADDA-Wandlern und Temperatursensoren. Zusätzlich wird es eine weitere HiTESPlatine geben, die komplett belegt wird durch die Implementierung des Kabelmodems.
2
Bachelorarbeit
Daniel Schembri
Die Sonde ist über ein 4000m langes Kabel mit dem Bedienstand verbunden. Die
besonderen Umgebungsbedingungen (200Grad Celsius, 400Bar Druck) und die
Länge des Kabels verlangen eine hohe Robustheit des Übertragungsmaterials.
Da es durch Marktzwang kaum Alternativen gibt, kommen nur Glasfaser und Koaxialkabel in Betracht.
Auf dem Bedienstand, an der Oberfläche, befindet sich bereits Software, die die
Bild- und Messdaten visualisiert und weiterverarbeitet. Die Anwendung wurde
Geo-GUI[4] genannt. Sie bietet eine Anbindung an eine SQL-Datenbank auf der
die Zeitstempel und zusätzliche Informationen archiviert werden. Durch ein Multithreadingverfahren ist es möglich bei gleichzeitiger Aufnahme von Daten, die
bereits empfangenen Daten erneut abzuspielen. Dadurch ist eine Analyse bereits
während einer laufenden Messfahrt möglich[4 Kap.6]. Die Bilddaten werden zurzeit noch direkt auf dem Dateisystem gespeichert. Bislang gibt es verschiedene
Testprogramme, um ankommende Sondendaten über UDP zu simulieren.
Im Folgenden wird der interne Aufbau des FPGAs, das für die Datenverarbeitung
und Steuerung der Sonde zuständig ist, beschrieben:
3
Bachelorarbeit
Daniel Schembri
Abbildung 2.2: Der Innere Aufbau des FPGAS
Die Sonde besitzt serielle Kameras, die mit einer Frequenz von 144MHz Bilddaten über LVDS überträgt. Die Bilder werden von den IP-Cores[3 Kap.3] umgeformt
und im SRAM gespeichert. Dort ist ein 4MByte großer Adressraum mit 32Bit Datenbreite vorhanden. Die Bilder können durch hinzuschalten eines SVGA-Cores
zu Testzwecken auf einem Monitor ausgegeben werden. Ein JPEG-Core ist so
eingestellt, dass er die Bilddaten der Kamera mindestens um den Faktor 21 komprimiert. Durch weitere Anpassungen, wie die Verringerung der Farbtiefe, Anpassung der Bildqualität, etc. kann der Kompressionsfaktor noch gesteigert werden.
An den internen Hochgeschwindigkeitsbus AHB des AMBA2.0 Bussystems[5]1
können bis zu 16 Komponenten angebunden werden.
Von der HiTES-Platine[6] gibt es mehrere Versionen. Folgend eine Abbildung der
zweiten Version:
1
Näheres siehe [3 Kap.4].
4
Bachelorarbeit
Daniel Schembri
Abbildung 2.3: Die HiTES-Platine. Vorder- und Rückseite[7]
5
Bachelorarbeit
3
Daniel Schembri
Aufgabenstellung und Zielsetzung
In HiTES entstehen Mess- und Steuerkommandos, Statusmeldungen, sowie komprimierte Bilddaten von zwei Kameras. Die eine Kamera blickt axial ins Rohr, während die zweite Kamera, fixiert, durch ein Fenster senkrecht auf die Rohrwand gerichtet ist. Die Sonde lässt sich rotieren und somit kann die ganze Rohrwand inspiziert werden. Ein Teil der Sensoren und Aktoren werden über ein CAN-Bussystem
angebunden, andere mit I2C und manche werden direkt per PWM angesteuert.
Im Moment kann über ein Kabelmodem nur eine schmalbandige Verbindung zur
Oberfläche hergestellt werden. Vorgesehen ist eine Übertragung mit ca. 1MBit/s.
Bei einer Messfahrt, die ca. sechs Stunden dauern kann, sind zwei Stunden für
die Fahrtzeit in 4000m Tiefe eingeplant; vier Stunden fallen für die Beobachtungszeit an. Während der ganzen Zeit muss beobachtet werden. Daher ist es notwendig die Datenpakete mit einem Zeitstempel zu versehen und in einem geeigneten Format auf einem Massenspeicher zu archivieren. Dazu kommen Messdaten,
Statusnachrichten und Kommandos, die aber einen geringes Volumen im Vergleich zu den Bildern besitzen. Daher sind diese in der folgenden Abschätzung
des Datenvolumens zu vernachlässigen.
Die JPEG-Bilder haben momentan eine niedrige Auflösung und sind mindestens
21-fach komprimiert. Damit ergibt sich eine Bildgröße von ca.:
640 ∗ 480 ∗ 24Bit : 21 = 44KByte.
Bei der JPEG-Komprimierung werden die Parameter der Komprimierung nochmals komprimiert. Da viele Bilder in unserem Fall eine geringen Informationsgehalt aufweisen, z.B. weniger Farben besitzen, kann die anzunehmende Datengröße mindestens halbiert werden:
44KByte : 2 = 22KByte
Eine Kamera hat bei 25Bildern/s eine Bandbreite von:
25Bilder/sec ∗ 22KByte/Bild = 0, 550MByte/s
6
Bachelorarbeit
Daniel Schembri
Folglich haben zwei Kameras:
2 ∗ 0, 550MByte/s = 1, 0742MByte/s
Beide Kameras liefern, bei Dauerbetrieb, über sechs Stunden eine Datenmenge
von:
1, 10MByte/s ∗ 6 ∗ 3600sec = 23, 20GByte.
Der Massenspeicher sollte daher eine Mindestgröße von 32GByte aufweisen.
Um zeitkritische Aufgaben und das Zeitstempelverfahren zuverlässig ausführen
zu können wird ein Echtzeitbetriebssystem (siehe Kap. 6) eingesetzt. Die Zeiterfassung wird auf 100 Mikrosekunden genau erfolgen.
Nach Bergung der Sonde sollen die gesammelten Daten auf den Bedienstand zur
weiteren Analyse übertragen werden. Da die Sonde sich in einem Dewargefäß[8]
befindet und somit völlig isoliert ist und möglichst nicht geöffnet werden soll, sollen
die Daten über ein WLAN-Modul übermittelt werden.
Für die Sonde müssen zwei Anwendungsfälle berücksichtigt werden:
Anwendungsfall A: In Situ Messfahrt der Sonde mit Speicherung der Daten auf
dem Massenspeicher
• Szenario 1: Alle anfallenden Mess- und Bilddaten werden auf dem Massenspeicher gespeichert.
• Szenario 2: Es sind Bilder mit hoher Rate für den Bedienstand nötig, daher werden diese mit niedrigerer Qualität erzeugt und versendet. Daraus
entsteht die Notwendigkeit, manuell hochauflösende Schnappschüsse aufzunehmen. In diesem Fall sind die Bilddaten in ausreichend hoher Qualität
und die Schnappschüsse zu speichern.
Anwendungsfall B: Nach Bergung der Sonde werden die in der Sonde gespeicherten Daten per WLAN übertragen und mit den auf dem Bedienstand vorhandenen Daten zusammengeführt.
Um die Aufgabenstellung zu lösen, wurde nach einem geeigneten Speichermedium gesucht. Man hat sich für mikro-SD-Karten (siehe Kap.4.1) entschieden, da
diese, bei geringen Maßen, eine entsprechend große Kapazität aufweisen und
einen ausreichenden Datendurchsatz bieten. Aus Zeitgründen und aufgrund der
von der Firma Gaisler vorhandenen IP-Cores[9] wurde beschlossen die SD-Karte
7
Bachelorarbeit
Daniel Schembri
im SPI-Modus zu betreiben. SPI ist ein gängiges serielles Bussystem in Embedded Systems und bietet ausreichend Datendurchsatz.
Es sind folgende Teilaufgaben zu lösen:
• Implementierung und Test eines SPI-Memory-Controllers mit ausreichender
Bandbreite
• Anpassung des SPIMCTRL-Cores in VHDL[10,11,12] zur Kommunikation
mit SDHC-Karten
• Schreiben von Softwaretreibern, um SD-Karten ansprechen und rudimentäre Schreib-/Leseoperationen ausführen zu können
• Entwurf und Implementierung eines Dateisystem-Treibers, um Dateien im
UMSG-Format(siehe Kap.5.2) archivieren zu können
• Implementierung des Zeitstempelverfahrens unter einem Echtzeitbetriebssystem
• Einsatz von Schedulingmechanismen, um einen reibungslosen Ablauf der
Threads/Interrupts zu garantieren
• Benchmark und Bewertung des Gesamtsystems
Es muss folgende Randbedingung erfüllt werden: Nach einem Stromausfall muss
die Aufzeichnung der Messfahrt nach dem letzten gültigen Datenpaket fortgesetzt
werden; es dürfen keine Daten überschrieben werden.
Der Core von Gaisler ist zu Testen und den Anforderungen entsprechend zu erweitern. Der Treiber ist so umzusetzen, dass dieser bei Verwendung alternativer
Übertragungsverfahren leicht austauschbar bzw. erweiterbar ist, so das z.B. zwei
SD-Karten gleichzeitig betrieben werden können.
Um Konflikte innerhalb des Systems zu vermeiden muss der Ressourcenzugriff
der Threads mit Hilfe von Mutexen bzw. Semaphoren koordiniert werden(siehe
Kap.6.1). Da im System nur vier MByte SRAM verbaut sein werden, ist das Programm effizient umzusetzen.
Es sind verschiedene Benchmarks durchzuführen, um den maximal möglichen
Datendurchsatz des Systems zu ermitteln. Des weiteren ist das Gesamtverhalten
des Systems zu überprüfen und zu bewerten.
Um die Aufgaben umzusetzen, wird die Hardwarebeschreibungssprache VHDL
in der Entwicklungsumgebung ISE Design Suite 14.3 von der Firma Xi-
8
Bachelorarbeit
Daniel Schembri
linx™verwendet. Zum Testen der Hardwareimplementierung wird GRMON, ein
Debuggingtool für Leon3, von der Firma Gaisler™verwendet. Um den Signalverlauf zu überprüfen, wird der Logicanalyzer Chipscope von Xilinx™verwendet.
Simulationen werden mit ISim von Xilinx™durchgeführt. Um die C-Programme
auf dem Leon-Prozessorsystem zu testen wird Eclipse mit CDT und integriertem GRMON verwendet. Als Testsystem fungiert die vom IAI1 eigens entwickelte
HiTES-Platine(siehe Kap.2).
1
Institut für angewandte Informatik
9
Bachelorarbeit
4
Daniel Schembri
Verbesserung des SD-Karten-Controllers
Die im Projekt anfallenden Messdaten sollen zur späteren Analyse archiviert werden. Dazu soll an einem SPI-BUS[13 Kap.8] ein Massenspeicher angebunden
werden.
4.1 Einführung SPI-Bus mit SD-Karten
4.1.1 SPI-Bus
SPI steht für Serial Peripheral Interface und ist eine serielle Kommunikationsschnittstelle der Firma Motorola™. Ein SPI-Bus ist nach dem Master-Slave Prinzip aufgebaut. Es gibt keinen strikten Standard. Der SPI-BUS wird vor allem bei
Mikrocontrollern zur Kommunikation mit Peripheriegeräten eingesetzt, aber auch
bei der Kommunikation innerhalb eines Prozessorsystems findet er Anwendung.
Eine ähnliche Schnittstelle stellt Microwire von der der Firma National Semiconductor™dar.
Folgend der Aufbau eines SPI-Bussystems:
10
Bachelorarbeit
Daniel Schembri
Abbildung 4.1: SPI-Master und Slaves
Der SPI-Master gibt den Takt vor und treibt den SPI-Slave. ’MOSI’ steht für
’Master-Out-Slave-In’ und ist die Sendeleitung des SPI-Masters. ’MISO’ steht für
’Master-In-Slave-Out’ und stellt die Empfangsleitung des SPI-Masters dar. Mit
’Slave Select (SS)’ wird der entsprechende SPI-Slave ausgewählt. Wird nur mit
einem SPI-Slave kommuniziert, so kann die SS-Leitung auf Masse gelegt werden. Eine SPI-Kommunikation kann in vier verschiedenen Modi stattfinden die
folgend aufgeführt sind:
SPI-Modus
CPOL
CPHA
0
0
0
1
0
1
2
1
0
3
1
1
11
Bachelorarbeit
Daniel Schembri
Bei SPI wird das Most-Significant-Bit (MSB) zuerst übertragen. Mit jeder steigenden Taktflanke werden die Daten übernommen. Es werden 8 Bit seriell übertragen. Zwischen jedem Byte kann das SS-Signal für einen Takt auf Low gezogen
werden. ’CPOL’ gibt die Takt-Polarität an. Bei ’CPOL=0’ ist der Idle-Takt low. Bei
’CPOL=1’ ist der Idle-Takt High.
’CHPA’ gibt die Takt-Phase an. Bei ’CHPA=0’ werden die Daten mit der ersten Taktephase übernommen; bei ’CHPA=1’ erst mit der zweiten. Folgend zwei TimingDiagramme mit den verschiedenen Modi:
Abbildung 4.2: SPI Timing Diagram CHPA = 0 [13 Kap.8.3.2]
Abbildung 4.3: SPI Timing Diagram CHPA = 1 [13 Kap.8.3.3]
12
Bachelorarbeit
Daniel Schembri
4.1.2 SD-Karten
Eine SD-MemoryCard[14] ist ein digitales Massenspeichermedium, das auf Flashspeicher basiert. Die SD-Karte wurde 2001 von Sandisk™entwickelt und stellt
eine Erweiterung der Multimedia Card (MMC) dar. Das ’SD’ steht für ’Secure Digital’ und gibt an, dass zusätzliche Funktionen für eine digitale Rechteverwaltung
(’DRM’) auf der Karte verwendbar sind.
SD-Karten werden üblicherweise im SD-Mode betrieben. Dabei werden 4 Bit parallel übertragen. Fast alle SD-Karten unterstützen den seriellen SPI-Mode. Dieser
ist wesentlich einfacher zu implementieren und wird generell unterstützt.
Für eine höhere Datenrate können mehrere SD-Karten parallel betrieben werden.
Mit jeder weiteren Karte würde sich neben der Schreibgeschwindigkeit, die Kapazität erhöhen.
Aufbau und Typen
Abbildung 4.4: SD- und mikro-SD-Karte [15]
Folgend der Aufbau von SD-Karten:
13
Bachelorarbeit
Daniel Schembri
Abbildung 4.5: Aufbau einer SD-Karte [14 Kap.3.7]
Die SD-Karte enthält einen internen Controller, der die internen Operationen ausführt. Der Speicherbereich gliedert sich in zwei Teile: den sechs Registern und
dem Datenbereich. Man kann einen Reset der Karte bewirken, indem man die
Karte einige Zeit vom Strom nimmt.
Für SD-Karten gibt es sechs vordefinierte Register: ’OCR’, ’CID’, ’CSD’, ’RCA’,
’DSR’ und ’SCR’. Diese können nur über die entsprechenden Befehle angesprochen werden.
Das ’Operation Condition Register (OCR)’ enthält Informationen zur Spannungsversorgung der Karte. Außerdem enthält es ein Statusbit, dass gesetzt wird,
wenn die Karte nach dem Anschalten initialisiert wurde.
Im ’Card Identification-Register (CID)’ stehen Herstellerinformationen und die
Seriennummer der Karte.
Das ’Card Specific Data-Register (CSD)’ enthält Information zur Kommunikation
mit der SD-Karte, wie beispielsweise die Version der Karte ,Blocklänge, und die
maximale Transferrate.
Das ’Relative Card Adress-Register (RCA)’ enthält die Adresse die nach der
Kartenidentifikation an den Host im SD-Mode versendet wird.
14
Bachelorarbeit
Daniel Schembri
Das ’Driver Stage-Register (DSR)’ ist ein optionales Register, mit dem die BusPerformance im SD-Mode erhöht werden kann.
Das ’SD-Card Configuration Register (SCR)’ ist eine Erweiterung zum CSDRegister. Es enthält Informationen zu speziellen Eigenschaften der SD-Karte.
Folgend eine Tabelle die die Pins beschreibt:
Pin
Name
Porttyp
Beschreibung
1
DAT2
2
CD/DAT3
In
Slave Select
3
CMD
In
Data In/Master out Slave in
4
Vdd
Support
Stromversorgung
5
CLK
6
Gnd/Vss
Support
Masse
7
DAT0
Out
Data out/Master in Slave out
8
DAT1
Nicht verwendet
Taktleitung
Nicht verwendet
Die erste Generation von SD-Karten mit der Version 1.0 unterstützen bis zu 4
GByte. Die Adressierung der Daten ist byteorientiert. SDHC-Karten entsprechen
der SD-Version 2.0 und sind die zweite Generation. Die Adressierung ist blockorientiert mit einer standardmäßigen Blockgröße von 512 Byte. SDHC-Karten unterstützen Kapazitäten von bis zu 32 GByte. Die dritte Generation mit der SD-Version
3.0 sind SDXC-Karten. Das ’XC’ steht für ’extended Capacity’. Diese Karten sind
ebenfalls blockorientiert adressiert. Die Standardblockgröße beträgt, wie bei den
SDHC-Karten, 512 Byte. Es werden bis zu 2 TByte unterstützt. Bei allen Versionen werden 32-Bit Adressen verwendet.
Unterschied zwischen SPI- und SD-Mode
Der SPI-Mode wird von allen SD-Kartentypen bis mindestens 25 MHz unterstützt.
Der SPI-Mode wird bei Verwendung von SD-Karten mit Mikrocontrollern eingesetzt, da dieser leichter zu implementieren ist und vom Datendurchsatz meist
ausreicht.
Beim SD-Mode werden auf vier Leitungen parallel Daten übertragen. Dadurch
sind Übertragungsgeschwindigkeiten bis zu 10 MByte/s (Class 10) und mehr
möglich. Die Implementierung des SD-Modes ist deutlich aufwändiger. Aus Zeitgründen wurde deshalb davon abgesehen.
15
Bachelorarbeit
Daniel Schembri
Geschwindigkeitsklassen
Sowohl für SDHC- als auch SDXC-Karten gibt es Geschwindigkeitsklassen. Es
gibt die Geschwindigkeitsklassen 2, 4, 6, 8 und 10. Diese legen die Mindestschreibgeschwindigkeit in MByte/s fest. Da der Geschwindigkeitszuwachs durch
internen parallelen Aufbau und bessere Flashtechnik erreicht wird, ist davon auszugehen, dass auch auch die SPI-Schreibgeschwindigkeit steigt.
Bei SDHC- und SDXC-Karten gibt es zudem die Abkürzung UHS-I und UHS-II.
Dies steht für ’Ultra High Speed’. Die Karte SanDisk Extreme Pro SDXC/SDHC
UHS-1 erreicht beispielsweise ein Schreibgeschwindigkeit bis zu 95 MByte/s.
SDHC-Karten können standardmässig im SPI-Modus mit bis zu 25MHz betrieben werden.
Dies ergibt ein Brutto-Datenrate von:
25MHz /(1024*1024*8Bit) = 2,9802322 MByte/sec
4.2 Der SPI-Memory-Controller-Core von Gaisler™
4.2.1 Der Aufbau des Cores
Der SPI-Memory-Controller-Core von Gaisler™, kurz SPIMCTRL[16 Kap.78],
dient zur Anbindung von SD-Karten und Flash-Speichermedien über den SPIBus an das LEON3-System. Der Core wird über Kontrollregister gesteuert, die
in den AMBA-AHB-Adressbereich eingeblendet sind, gesteuert. Sowohl der SPITakt als auch der Initialisierungstakt werden aus dem Systemtakt erzeugt. Der
Systemtakt ist auch der AMBA-Takt. Dieser wird im Spimctrl-Core mindestens
halbiert. Der Core ist über die vier Leitungen ’SCK’, ’MISO’, ’MOSI’ und ’CSN’ mit
dem Speichermedium verbunden. Die Leitungen ’ERRORN’, ’READY’ und ’INITIALIZED’ geben den Zustand des Cores wieder. Zwei Statemachines regeln die
Kommunikation zwischen dem extern angebundenen Speichermedium und dem
Prozessorsystem. Da der Core ein internes 8Bit-Register sowohl zum Senden
als auch Empfangen von Daten verwendet, wird eine Datenübertragung nur im
Halb-Duplex-Modus durchgeführt.
Folgend der Aufbau des Spimctrl-Cores:
16
Bachelorarbeit
Daniel Schembri
Abbildung 4.6: Blockdiagramm des Spimctrl-Cores von Gaisler[15 Kap.78.1]
Zur Steuerung des Cores gibt es verschiedene Register die per Software angesprochen werden können. Diese haben folgenden Offset im AMBA-Adressraum:
Abbildung 4.7: Adress Offset der Spimctrl-Register[16 Kap.78.3]
Folgend der Aufbau des Konfigurationsregisters:
Abbildung 4.8: Konfigurationsregister des Spimctrl-Cores[16 Kap.78.3]
Folgend der Aufbau des Kontrollregisters:
Abbildung 4.9: Kontrollregister des Spimctrl-Cores[16 Kap.78.3]
17
Bachelorarbeit
Daniel Schembri
Wird das User-Control-Bit (USRC) gesetzt ist es möglich einzelne Bytes über
die SPI-Schnittstelle des Cores zu senden. Dazu muss das Byte in das Transmitregister des Cores geschrieben werden. Dieses hat den Adressoffset 0x10. Der
Usercontrolmode wird benötigt, um mit eigens geschriebenen Programmen eine
Kommunikation mit dem Speichermedium realisieren zu können. Der im Projekt
behandelte Softwaretreiber benötigt den User-Control-Mode.
Interrupt Enable (IEN): Ist dieses Bit gesetzt, dann wird nach jedem Transfer im
User-Mode ein Interrupt ausgelöst
Enable Alternate Scaler: Durch Setzen des EAS-Bits wird der (EAS) alternative
Takt als SPI-Takt verwendet
Chip Select (CSN): Die Chipselect-Leitung dient zur Auswahl des Slaves.
Reset Core (RST): Indem dieses Bit gesetzt wird, wird ein Reset des SpimctrlCores durchgeführt. Dies hat den gleichen Effekt wie ein System Reset
Die Bits 5 bis 31 sind reserviert und werden daher nicht weiter beachtet.
Folgend der Aufbau des Statusregisters:
Abbildung 4.10: Statusregister des Spimctrl-Cores[16 Kap.78.3]
Das ’Operation-Done’-Bit (DONE) wird gesetzt, wenn der Core ein Byte im Usermode gesendet hat.
Das Init-Bit (INIT) wird gesetzt, wenn die SD-Karte erfolgreich initialisiert wurde.
Das Error-Bit (ERR) wird gesetzt, wenn der Core sich im Error-Modus befindet.
Das Bit wird im User-Mode nicht automatisch gesetzt.
Das Timeout-Bit (TO) wird automatisch gesetzt, wenn beim Warten auf eine Antwort der SD-Karte ein Timeout des Cores ausgelöst wird. Dies kann beispielsweise bei der Initialiserung auftreten. Bei Verwenden des User-Modes wird dieses Bit
nicht mehr automatisch gesetzt.
Das ’Card-Detect’-Bit (CD) wird nur in Verbindung mit dem SD-Mode des Cores
verwendet. Gesetzt zeigt es an, dass eine SD-Karte an den SD-Slot angeschlos-
18
Bachelorarbeit
Daniel Schembri
sen ist. Durch Überwachen dieses Bits in einem Programm, kann festgestellt werden, ob eine Karte gewechselt, bzw. erneut an das System angeschlossen wurde.
Dementsprechend kann dann ein Core-Reset ausgeführt werden.
Die Bits 6 bis 31 sind reserviert und werden daher nicht weiter beachtet.
Folgend das Empfangsregister
Abbildung 4.11: Empfangsregister des Spimctrl-Cores[16 Kap.78.3]
Im Register ’RDATA’ sind die über SPI empfangenen Daten enthalten. Es werden
jeweils 8Bit empfangen. Ein Anliegen der Daten wird durch ein auf ’0’ zurückgesetztes Busy-Bit angezeigt. Da der SPI-Master den Takt des Slaves treibt, müssen
zum Empfangen von Daten Bytes gesendet werden. Die Bits 8 bis 31 sind reserviert.
Folgend das Senderegister:
Abbildung 4.12: Senderegister des Spimctrl-Cores[16 Kap.78.3]
In die ersten acht Bits, also in das ’TDATA’-Register, müssen die über SPI zu
sendenden Daten geschrieben werden. Es kann immer nur byteweise gesendet
werden. Während dem Senden ist das Busy-Bit gesetzt. Wurde ein Byte gesendet
wird das Busy-Bit auf ’0’ zurückgesetzt und das Done-Bit gesetzt. Dadurch kann
eine Anwendung feststellen, wann das nächste Byte in das TX-Register geschrieben werden kann. Die Bits 8 bis 31 sind reserviert.
4.2.2 Tests
Anfangs wurde eine 1GB SD-Karte (Version 1.0) von Sandisk getestet, da diese sich durch den unveränderten SPI-Memory-Controller von Gaisler ansprechen
lies.
19
Bachelorarbeit
Daniel Schembri
Folgend der Code für das User-Constraint-File:
1
# Enable when SPI−sdcard used , sd
2
NET s p i _ s c k
LOC = L3 | IOSTANDARD = LVCMOS33 ; # LVDS_CLK_P
3
NET spi_miso
LOC = M8 | IOSTANDARD = LVCMOS33 ; # I2C_SCL
4
NET spi_mosi
LOC = F3 | IOSTANDARD = LVCMOS33 ; # LVDS_D_P
5
NET s p i _ s p i s e l LOC = E4 | IOSTANDARD = LVCMOS33 ; # LVDS_D_N
Durch folgenden Eintrag in der Config.vhd werden die Parameter zur Implementation in VHDL gesetzt:
1
−− SPI memory c o n t r o l l e r
2
constant CFG_SPIMCTRL : i n t e g e r : = 1 ;
3
constant CFG_SPIMCTRL_SDCARD : i n t e g e r : = 1 ;
4
constant CFG_SPIMCTRL_READCMD : i n t e g e r : = 16#0#;
5
constant CFG_SPIMCTRL_DUMMYBYTE : i n t e g e r : = 0 ;
6
constant CFG_SPIMCTRL_DUALOUTPUT : i n t e g e r : = 0 ;
7
constant CFG_SPIMCTRL_SCALER : i n t e g e r : = 2 ; −−ca . 25MHz
8
constant CFG_SPIMCTRL_ASCALER : i n t e g e r : = 8 ; −− ca . 300KHz
9
constant CFG_SPIMCTRL_PWRUPCNT : i n t e g e r : = 8 0 ;
Die
ersten
beiden
Konstanten
’CFG_SPIMCTRL’
und
’CFG_SPIMCTRL_SDCARD’ geben an, dass der SPI-Memory-Core zum
Ansprechen von SD-Karten verwendet wird. ’CFG_SPIMCTRL_SCALER’ und
’CFG_SPIMCTRL_ASCALER’ legen den Betriebs- bzw. Initialisierungstakt fest.
Die restlichen Konstanten werden zur Anbindung von Flash-Chips benötigt und
sind daher uninteressant.
Der Spimctrl-Core wird im Leon3-System durch folgenden VDHL-Code implementiert:
1
2
3
spimc : i f CFG_SPICTRL_ENABLE = 0 and CFG_SPIMCTRL = 1 generate
−− SPI Memory C o n t r o l l e r
spimctrl0 : spimctrl
generic map ( hindex => 4 , h i r q => 4 , f a d d r => 16#a00 # ,
fmask => 16# f f 0 # ,
4
i o a d d r => 16#100# , iomask => 16# f f f # ,
5
s p l i t e n => CFG_SPLIT , oepol
6
sdcard => CFG_SPIMCTRL_SDCARD,
7
s c a l e r => CFG_SPIMCTRL_SCALER,
8
a l t s c a l e r => CFG_SPIMCTRL_ASCALER)
9
=> 0 ,
port map ( r s t n , clkm , ahbsi , ahbso ( 4 ) , spmi , spmo ) ;
20
Bachelorarbeit
Daniel Schembri
’hindex’ und ’hirq’ geben den AMBA-AHB-Index und die dazugehörige Interruptleitung an. Mit ’faddr’ wird die Startadresse und mit ’fmask’ der Speicherbereich
festgelegt.
Folgend die Verbindung der PINS mit den internen Signalen:
1
sd_miso_pad : inpad generic map ( t e c h => padtech )
port map ( spi_miso , spmi . miso ) ;
2
3
4
5
6
7
8
mosi_pad : outpad generic map ( t e c h => padtech )
port map ( spi_mosi , spmo . mosi ) ;
sck_pad
: outpad generic map ( t e c h => padtech )
port map ( spi_sck , spmo . sck ) ;
s l v s e l 0 _ p a d : iopad generic map ( t e c h => padtech )
port map ( s p i _ s p i s e l , spmo . csn , spmo . cdcsnoen , spmi . cd ) ;
9
10
nospimc : i f ( ( CFG_SPICTRL_ENABLE = 0 and CFG_SPIMCTRL = 0 ) or
11
( CFG_SPICTRL_ENABLE = 1 and CFG_SPIMCTRL = 1 ) )
12
13
14
15
16
17
generate
mosi_pad : outpad generic map ( t e c h => padtech )
port map ( spi_mosi ,
sck_pad
’0 ’) ;
: outpad generic map ( t e c h => padtech )
port map ( s p i _ c l k ,
’0 ’) ;
end generate ;
Wird der Core nicht verwendet, so werden die Signale auf ’0’ gezogen.
Der SPIMCTRL-Core kann nun in GRMON angesprochen werden. Durch den
Befehl ’spim’ werden die spezifischen Befehle aufgelistet:
21
Bachelorarbeit
Daniel Schembri
Abbildung 4.13: GRMON: Auflistung der SPIM-Befehle
Durch den Befehl ’spim reset’ kann der Core zurückgesetzt werden. Dies entspricht einem System-Reset. Der Core führt anschließend die Initialisierung erneut aus. Mittels ’spim tx’ kann ein Byte über das SPI-Senderegister gesendet
werden.
Der Befehl ’spim status’ gibt den aktuellen Status des Cores wieder. Dazu werden die Control- und Status-Register aufgelistet:
Abbildung 4.14: GRMON: SPIM-Status
Bei einer erfolgreichen Initialisierung sind ’Card Detect’ und ’Initialized’ gesetzt.
Fazit: die ’alten’ SD-Karten funktionieren, deren Kapazität reicht jedoch nicht aus.
22
Bachelorarbeit
Daniel Schembri
Die Lösung, acht SD-Karten zu je 4GB parallel anzubinden ist zu aufwändig. Somit muss der Core zur Unterstützung von SDHC- und SDXC-Karten erweitert
werden.
4.3 Erweiterung der Statemachine für SDHC-Karten
Die Statemachine des SPI-Memory-Controllers initialisiert nur SD-Karten der
Version 1.0. Damit SDHC- und SDXC-Karten ebenfalls verwendet werden können, müssen das Kommando ’CMD8’ und die Checksumme ’0x87’ hinzugefügt
werden. ’CMD8’ überprüft die unterstützte Spannung der SD-Karten. Folgend
eine Auflistung der implementierten SD-Kommandos in VHDL:
1
−−CRCs
and B l o c k l e n g t h
2
constant SD_BLEN : i n t e g e r : = 4 ;
3
constant SD_CRC_BYTE : s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) : = X"95" ;
4
constant SDHC_CRC_BYTE : s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) : = X"87"
;
5
constant SD_BLOCKLEN : s t d _ l o g i c _ v e c t o r (31 downto 0 ) : =
6
c o n v _ s t d _ l o g i c _ v e c t o r (SD_BLEN, 32) ;
7
−− Commands
8
constant SD_CMD0
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "000000" ;
9
constant SD_CMD8
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "001000" ;
10
constant SD_CMD16
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "010000" ;
11
constant SD_CMD17
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "010001" ;
12
constant SD_CMD55
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "110111" ;
13
constant SD_CMD58
: s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "111010" ;
14
constant SD_ACMD41 : s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "101001" ;
15
constant SD_DUMMYCMD : s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) : = "111111" ;
Zudem muss die Initialisierungssequenz erweitert werden. Im folgenden wird die
neue Initialisierungssequenz erläutert:
23
Bachelorarbeit
Daniel Schembri
Abbildung 4.15: Flussdiagramm des Spimctrl-Core
Nach dem Einschalten des Systems sollte die Karte einige Millisekunden unter
Strom stehen. Anschließend müssen 80 Takte bei einer Initialisierungsfrequenz
von 100 bis 400KHz übertragen werden. Die Karte befindet sich nun im Idle-State
des SD-Modes. Da die Kommunikation über den SPI-Bus erfolgen soll, muss die
Karte in den Idle State des SPI-Modes gebracht werden. Dies geschieht durch
Senden des Befehls CMD0. Sobald die Karte im Idle-State ist, liefert sie als
Response eine ’1’ im ersten Bit des Response-Bytes zurück. Andernfalls wird
’CMD0’ erneut gesendet.
24
Bachelorarbeit
Daniel Schembri
Abbildung 4.16: Flussdiagramm des Spimctrl-Core (Fortsetzung)
Bei SDHC-Karten muss nun zusätzlich CMD8 gesendet werden. Dieser Befehl
teilt der SD-Karte die verwendete Versorgungsspannung mit und frägt ab ob diese unterstützt wird. Ältere SD-Karten liefern als Antwort ’Illegal Command’ zurück.
Dies ist nicht problematisch, da das darauf folgende Kommando ohne weiteres
ausgeführt wird. Diese Initialisierungssequenz kann also für alte SD-, als auch
neuere SDHC- und SDXC-Karten verwendet werden. Anschließend wird durch
senden des CMD55 ein spezieller Applicationcommand angekündigt. Durch den
darauf folgenden ACMD41 wird die Host Capacity Information an die SD-Karte
gesendet und der Initialisierungsprozess der gestartet. Nach dem Senden des
Befehls wird ebenfalls auf eine Antwort gewartet. Einigen Karten müssen die beiden Befehl CMD55 und ACMD41 öfter gesendet werden. Ist die Karte initialisiert,
wird durch CMD16 die Blocklänge auf 512 festgelegt. Kommt von der Karte als
Antwort nicht 0x00, dann ist die Initialisierung fehlgeschlagen und die entsprechenden Error-Bits im Status-Register des Cores werden gesetzt. Ansonsten ist
die Karte nun einsatzbereit.
25
Bachelorarbeit
Daniel Schembri
Einige SD-, als auch SDHC-Karten scheinen von der offiziellen Spezifikation etwas abzuweichen und lassen sich nicht initialisieren. Es kommt zu Timeouts des
Spimctrl-Cores. Im Projekt kommt daher eine 8GB bzw. 16GByte micro SDHCKarte der Geschwindigkeitsklasse 4 von Lexar zum Einsatz.
Bei der Erweiterung der Statemachine in VHDL gibt es einige Besonderheiten zu
beachten, die im Folgenden näher erläutert werden:
Abbildung 4.17: Zustandsdiagramm für den Initialisierungsprozess des Spimctrl-Core
26
Bachelorarbeit
Daniel Schembri
Die zwei Zustände ’Send_CMD’ und ’Get_Resp’ folgen nach den meisten Zuständen im Diagramm. Dabei werden im Zustand ’Send_CMD’ die sechs Bytes
eines SD-Kommandos gesendet. Ein Zähler gibt an welches Byte gesendet wird.
Anschließend wird eine ein Byte große Antwort im Zustand ’Get_Response’ empfangen. Ist kein Kommando mehr aktiv wird dies mit dem Signal ’r.go’ auf 0 angezeigt. Bei fallender Taktflanke wird dann in den nächsten State gewechselt.
Bei den SD-Befehlen wird immer ein Offset von 0x40 addiert. Dieser Offset wird
durch Konkatenation im CMD_Send-State dem jeweiligen Register hinzugefügt.
Da an der Schnittstelle des SPIMCTRL nichts geändert wurde, wird der Core wie
oben beschrieben implementiert.
Folgend die Ausgabe des CSD-Registers, bei Verwendung des neuen Cores:
Abbildung 4.18: GRMON: Ausgabe des CSD-Registers der SD-Karte über SPIM
Das CSD-Register der SDHC gibt die SD-Version der Karte an. 0x1 ist als Version
2.0 definiert.
Fazit: Die Lexar-Karte mit 8 und 16GByte funktioniert. Ein Test mit 32GByte steht
noch aus.
27
Bachelorarbeit
5
Daniel Schembri
Entwicklung von Softwaretreibern für SD-Karten
Der SPI-Memory-Controller stellt die unterste Treiberschicht dar. In ihm wird die
Initialisierung des SPI-Modes durchgeführt. Um eine Datenübertragung mit SDKarten durchführen zu können wird eine Treiberschicht in ’C’ entwickelt. Darauf
aufbauend steht ein Dateisystemtreiber, um die anfallenden Bild- Mess- und Steuerdaten im UMSG- bzw. UMSGV-Format([17 Kap.3] und siehe Kapitel 5.2) abzuspeichern. Das Dateisystem wurde ’UMSGFS’ ’Universal User Message File System’ genannt. Eine Anwendung kann diese Treiber zur Kommunikation einbinden.
Folgend eine Abbildung der Treiberschichten, klassifiziert nach dem OSISchichtenmodell[18]:
Abbildung 5.1: Treiberschichten nach dem OSI-Modell
Der SPI-Memory-Controller führt die Initialisierung der SD-Karte durch. Darauf
aufbauend steht die SD-Schicht, über die blockweise Lese- und Schreibzugriffe
mit der SD-Karte durchgeführt werden. Als Transportschicht steht das vom IAI
entwickelte UMSG-Format.
28
Bachelorarbeit
Daniel Schembri
5.1 SPI-SD Schicht
Damit überhaupt SD-Kommandos gesendet werden können, wird vor jedem Kommando vorausgesetzt das der Core korrekt initialisiert wurde und das UsercontrolBit gesetzt ist. Dazu werden im Unterprogramm ’Spim-Init()’ die Register überprüft
und ggf. eine Fehlermeldung ausgegeben.
Folgend das Flußdiagramm für einen Single-Blockread bzw. Mulltiple-Blockread:
Abbildung 5.2: Single- und Multiple-Blockread
Zu Beginn werden sechs Bytes versendet, die das eigentliche SD-Kommando
darstellen. Das erste Byte ist der Befehl CMD17 bzw. CMD18. Die folgenden vier
Bytes sind die zu lesende Blockadresse. Das letzte Byte ist die Checksumme. Da
die CRC-Funktion deaktiviert ist, wird ein Dummybyte gesendet. Nach dem Befehl
29
Bachelorarbeit
Daniel Schembri
wird ein weiteres Dummybyte gesendet, um der Karte einen Zyklus Zeit zu geben
den Befehl auszuwerten. Liefert die SD-Karte 0x00 zurück, dann wurde der Befehl
akzeptiert. Andernfalls liegt ein Fehler vor, der der Tabelle ’R1-Response-Token’
auf Seite 33 entnommen werden kann.
Nun wird auf das Start-Token ’0xFE’ der SD-Karte gewartet. Da der SPI-Master
den Takt und somit den SPI-Slave treibt, müssen in einer Schleife Dummybytes
gesendet werden. Nach einigen Zyklen (in Tests bis zu 128) kann nun mit dem
Auslesen begonnen werden. Nun müssen ebenfalls 512 Dummybytes gesendet
werden. Die Daten werden in einem ’Unsigned-Char-Array’ gespeichert. Der Singleread ist beendet, das Done-Bit wird gesetzt und das Char-Array als Returnwert
zurückgegeben.
Bei einem Multiple-Blockread wird erneut auf das Start-Token für den nächsten
Block gewartet. Wurde die angegebene Anzahl an Blöcken ausgelesen, muss
ein Stop-Tranmission-Befehl gesendet werden. Nun wird ebenfalls das Done-Bit
gesendet und das Char-Array zurückgegeben.
Folgend das Flußdiagramm für einen Single-Blockwrite bzw. Multiple-Blockwrite:
30
Bachelorarbeit
Daniel Schembri
Abbildung 5.3: Single- und Multiple-Blockwrite
Wie bei anderen Kommandos werden zu Beginn sechs Bytes versendet, die das
SD-Kommando darstellen. Das erste Byte ist hier der Befehl CMD24 bzw. CMD25.
Die folgenden vier Bytes sind die zu beschreibende Blockadresse. Das letzte Byte
ist eine optionale Checksumme. Da die Checksummenfunktion deaktiviert ist wird
ein Dummybyte gesendet. Nach dem Befehl wird ein weiteres Dummybyte gesendet, um der Karte einen Zyklus Zeit zu geben den Befehl auszuwerten. Liefert
die SD-Karte 0x00 zurück, dann wurde der Befehl akzeptiert. Andernfalls liegt ein
31
Bachelorarbeit
Daniel Schembri
Fehler vor der der Tabelle ’R1-Response-Token’ auf Seite 33 entnommen werden
kann.
Nun wird das Start-Token ’0xFE’ an die SD-Karte gesendet. Anschließend werden
in einer Schleife die Daten Byte für Byte gesendet. Nach dem ein 512Byte-Block
geschreiben wurde, wird gewartet, bis die SD-Karte die Daten akzeptiert hat. Dies
kann einige Zyklen andauern (bei Tests bis zu 256). Anschließend sendet die
Karte eine Checksumme an den Host. Der Single-Blockwrite ist beendet und das
Done-Bit wird gesetzt.
Bei einem Multiple-Blockwrite wird, nach akzeptieren der Daten, erneut das StartToken gesendet und die obige Prozedur wiederholt. Wurden die angegebenen
Blöcke ausgegeben, muss ein Stop-Transmission-Befehl gesendet werden. Nun
wird ebenfalls das Done-Bit gesetzt.
Folgend eine Tabelle mit den im Treiber SD-Treiber implementierten Befehlen, den
dazugehörige Bitmustern und den Response-Tokens:
Cmd
Bits
Mnemonik
Resp
Beschreibung
CMD12
001100
STOP_TRANS
R1b
Stoppe Übertragung
R1
Lese einen Block Daten aus
R1
Lese mehrere Blöcke aus
R1
Schreibe einen Block Daten
R1
Schreibe mehrere Blöcke aus
MISSION
CMD17
010001
READ_SINGLE
_BLOCK
CMD18
010010
READ_MULTIPLE
_BLOCK
CMD24
011000
WRITE_SINGLE
_BLOCK
CMD25
011001
WRITE_MULTIPLE
_BLOCK
Auf jeden gesendeten Befehl folgt eine Antwort der SD-Karte in Form eines
Response-Tokens. Durch das Auslesen der Response-Tokens wird eine Fehlererkennung und ggf. eine Fehlerbehandlung ermöglicht.
Folgend der Inhalt des ein Byte großen R1 Response-Tokens:
32
Bachelorarbeit
Daniel Schembri
Bit
Status
Beschreibung
0
In idle state
Die Karte befindet sich im Idle-State und
führt den Initialisierungsprozess aus
1
Erase reset
2
Illegal command
Ein nicht zulässiger Befehl wurde erkannt
3
Communication CRC error
Die CRC-Prüfung des Befehls schlug fehl
4
Erase sequence error
Ein Fehler während der Erase-Sequenz
trat auf
5
Addres error
Eine fehlerhafte Adresse
6
Parameter error
Die angegeben Adresse befindet sich
außerhalb des Adressraums
7
MSB
Immer Null
Das R1b Token hat den selben Inhalt wie das R1-Token. Nach dem Token folgen
beliebig viele Nullbytes, die angeben, dass die Karte beschäftigt ist. Sobald ein
Byte ungleich Null empfangen wird, ist die Karte für den nächsten Befehl bereit.
Das Response-Token R2 ist zwei Byte groß. Das erste Byte ist ein R1-Token.
Das zweite Byte enthält die folgend angegebenen Daten:
Bit
Status
Beschreibung
0
Card is locked
Das Bit ist gesetzt, wenn die
Karte durch den Benutzer gesperrt wurde
1
Write protect Erase skip
Das Bit wird gesetzt, wenn versucht
|lock/unlock command failed
wird einen schreibgeschützten Sektor
zu löschen oder
2
Error
Ein allgemeiner oder unbekannter Fehler
trat auf
3
CC error
Interner Fehler des Kartencontrollers
4
Card ECC failed
Der karteninterne ECC wurde verwendet,
konnte die Daten jedoch nicht korrigieren
5
Write protect violation error
Es wurde versucht auf einen schreibgeschützen Block zu schreiben
6
Erase param
Ungültige Auswahl des Sektors für
Erase-Sequenz
7
out of range | csd overwrite
33
Bachelorarbeit
Daniel Schembri
Das R3-Token enthält fünf Bytes. Das erste Byte entspricht dem R1-Token. Die
restlichen vier Bytes entsprechen dem OCR-Register.
Das R7-Token enthält fünf Bytes, die als Antwort auf CMD8 von der Karte versendet werden. (14 Kap.7.3.2)
5.2 Das UMSG-Datenformat
UMSG steht für Universal Message und ist ein vom IAI eigens entwickeltes Datenformat zur Archivierung der Messdaten(Verweis AF oder RH).
Eine UMSG besteht aus einem Header, einer Messagenr und dem Datenbereich.
Eine UMSG hat eine Größe von 40Bytes:
Abbildung 5.4: links die UMSG, rechts der Header
Der Header besteht aus der Magicnr, die als Identifikations-Prefix bei der Übertragung über UDP dient, dem Timestamp, der die Messzeit auf 100 Mikrosekunden
genau angibt und einer ID, die den UMSG-Typ angibt.
Der Datenbereich der UMSG hat eine Größe von 28Byte und kann aus einem
der folgenden Datentypen bestehen:
34
Bachelorarbeit
Daniel Schembri
Abbildung 5.5: Datenbereich bestehend aus einer Allgemeinen Nachricht
Allgemeine Nachrichten können z.B. kurze Statusmeldungen oder Antworten auf
Befehle der Sonde sein.
Abbildung 5.6: Datenbereich bestehend aus einer TAB-Info
In einer TAB-Info können Tabelleninformationen oder eine Referenz auf den Zeitstempel TS0 enthalten sein.(Verweis auf DSPrSem3 Kapitel 6.1)
Abbildung 5.7: Datenbereich bestehend aus CAN-Nachrichten
Es können CAN-Nachrichten gespeichert werden.
35
Bachelorarbeit
Daniel Schembri
5.2.1 Das UMSGV-Bilddatenformat
UMSGV(Verweis DS) ist die Abkürzung für ’Universal User Message Videodata’
und dient zum Archivieren von Bilddaten und größeren Textnachrichten der Sonde. Eine UMSGV besteht aus dem UMSG-Header und einem 1462 Byte großen
Datenbereich. Der Datenbereich ist dabei als Union in ’C’ umgesetzt, d.h. es kann
entweder eine Textnachricht, bestehend aus bis zu 1460 Zeichen, oder eine Teilinformation eines Bildes enthalten sein:
Abbildung 5.8: UMSGV
Folgend der Datenbereich des UMSGV-Paketes:
Abbildung 5.9: Datenbereich bestehend aus großer Textnachricht oder Frame
Das UMSGV-Print besteht aus der Länge des Textes und dem Datenbereich. Das
36
Bachelorarbeit
Daniel Schembri
UMSGV-Frame hat eine ID, eine Partnr, mit der sich ein Bild in mehrere Teilpakete
aufteilen lässt. Eine Size, die die Gesamtgröße des Bildes bis 4GByte angibt und
den Datenbereich.
5.3 Messdaten-Filesystem
5.3.1 Messfahrtinformationen im Header
Der Header des Filesystems verwaltet bis zu 32 Messfahrten. Jeder Eintrag hat
eine Größe von 16Bytes. Dadurch wird genau ein Block der SD-Karte als Header
verwendet.
Folgend der Aufbau des 16Byte großen Eintrages im Header:
Name
Größe
Beschreibung
Measurment_ID
4Byte
ID der Messfahrt. Datum
Measurment_Nr
1Byte
Nummer der Messfahrt
Measurment_Status
1Byte
Status (1: aktiv, 2:abgeschlossen)
Measurment_Startsector
4Byte
Startsektor der Daten auf der SD-Karte
Measurment_Lastumsg_MSB
4Byte
Blocknr der letzten gültige UMSG
Measurment_Lastumsg_LSB
2Byte
Byteadresse innerhalb des Blocks der
letzten gültigen UMSG
Die Messdaten werden als UMSG-Pakete verpackt im Datenbereich nacheinander abgespeichert.
5.3.2 Recovery der Messdaten
Nach den Randbedingungen von Kapitel 3 kann es vorkommen, dass die Sonde
ab und wieder angeschaltet wird. Dabei konnte die Adresse der letzten, gültigen
UMSG nicht gesichert werden. Da die Sonde während dem Schreiben ausgeschaltet wurde, so ist es nötig diese wieder herzustellen. Durch eine binäre Suche wird der Adressbereich der SD-Karte begrenzt. Da die Größe für UMSG- und
UMSGV-Pakete fest vorgegeben ist, arbeitet sich der Algorithmus zum letzten Datum vor und überprüft das Paket auf eine gültige UMSG-ID. Ist dies nicht der Fall,
wird rückwärts die letzte gültige ID ermittelt und die Adresse in den Header geschrieben.
37
Bachelorarbeit
6
Daniel Schembri
Messdatenverarbeitung in der Sonde
6.0.3 Der Begriff Echtzeit
Unter Echtzeit versteht man nach DIN 44300 Deutsche Industrienorm[19]:
.. den Betrieb eines Rechensystems, bei dem Programme zur Verarbeitung anfallender Daten ständig betriebsbereit sind, derart, dass
die Verarbeitungsergebnisse innerhalb einer vorgegebenen Zeitspanne verfügbar sind. Die Daten können je nach Anwendungsfall nach
einer zeitlich zufälligen Verteilung oder zu vorherbestimmten Zeitpunkten anfallen.
Der Begriff Echtzeit umfasst dabei zwei Definitionen:
Harte Echtzeit
Bei einem System mit harter Echtzeit muss eine Deadline für die Ausführung bestimmter Operationen erfüllt sein. Ansonsten würde es zu fatalen Systemstörungen bzw. Gefahren kommen. Ein Beispiel wäre die Flugsteuerung in einem Flugzeug.
Weiche Echtzeit
Bei der weichen Echtzeit wird eine gelegentliche Überschreitung der Deadline
toleriert. Bei einem Multimediasystem beispielsweise hat die Überschreitung der
Deadline vergleichsweise geringe Auswirkungen, zum Beispiel Bildflackern.
[20]
Damit die Messungen zuverlässig ausgeführt werden, werden Interrupt-Handling
und Scheduling-Verfahren eingesetzt. Dazu wird ein Echtzeitbetriebssystem eingesetzt. Dadurch soll garantiert werden, dass die Ausführung bestimmter Prozesse bis zu einer bestimmten Deadline abgeschlossen ist. Der Einsatz von eCos
wird in [17 Kap.4.2.2] begründet.
38
Bachelorarbeit
Daniel Schembri
6.1 Einführung in das Echzeitbetriebssystem eCos
eCos [21] steht für ’Embedded Configurable Operating System’ und ist ein quelloffenes Echtzeitbetriebssystem der Firma eCoscentric Limited.
Der große Vorteil an eCos ist seine Skalierbarkeit. Es kann nach Bedarf angepasst werden und unterstützt, unter anderem, die SPARC Architektur des LEON3Prozessors. Hierfür gibt es ein ’Configuration Tool’.
6.1.1 Multithreading
Ein Thread ist ein Teilprozess von mehreren innerhalb eines Programms. Ein
Thread hat in eCos einen eigenen Stack. Multithreading bezeichnet das gleichzeitige Abarbeiten mehrerer Threads in einer Anwendung. Da es nur begrenzte
Ressourcen gibt, muss durch Scheduling der Zugriff auf diese geregelt werden.
Hierfür gibt es verschiedene Möglichkeiten:
Mutex
Ein Mutex (’mutal exclusion’) ist ein Synchronisationsverfahren, durch den ein
gleichzeitiger Zugriff mehrerer Threads auf eine Ressource verhindert wird. Ein
Thread sperrt eine Ressource indem er vor Verwendung derselben die Funktion
Mutex.lock() aufruft. Im Gegensatz zu einer Semaphore, kann nur der aktuelle
Thread die Sperrung wieder aufheben. Ein mögliches Problem ist die sogenannte Prioritätsinversion. Dieser Fall kann auftreten, wenn ein nieder priorer Thread
eine Ressource sperrt und ein höher priorer Thread auf deren Freigabe wartet.
Dann ist es möglich das ein Thread mit mittlerer Priorität den Ablauf unterbricht
und einen Wechsel zum höher prioren Thread verzögert, bzw. verhindert. eCos
bietet als Lösung zwei Verfahren an:
• Die Prioritätsvererbung
• Die Prioritätsgrenze
Semaphore
Eine Semaphore regelt den Zugriff mehrerer Threads auf mehrere Ressourcen.
Sie enthält einen Zähler der die Anzahl freier Ressourcen darstellt. Bei Freiga-
39
Bachelorarbeit
Daniel Schembri
be durch einen Thread wird der Zähler inkrementiert; bei Belegen dekrementiert.
Warten mehrere Threads auf eine Freigabe der Semaphore, dann bekommt der
höchst priore Thread den Zugriff zuerst. Im Gegensatz zum Mutex kann eine Semaphore auch von einem anderen Thread entsperrt werden.
Condition-Variablen
Eine Condition-Variable, zu Deutsch Bedingungsvariable, wird zusammen mit
einem Mutex verwendet, um den Zugriff auf Ressourcen zwischen mehreren
Threads zu steuern. Dabei wird der Mutex gesperrt. Die anderen Threads warten auf Freigabe des Threads. Im Gegensatz zur alleinigen Verwendung von Mutexen kann hierbei entschieden werden, ob ein Thread oder alle Threads ’geweckt’ werden sollen. Bedingungsvariablen eignen sich besonders beim Einsatz
von Erzeuger- und Verbaucher-Threads.
Flags
Ein Flag ist ein Synchronisationsmechanismus der in einem 32-Bit Wort umgesetzt ist. Jedes Bit des Flags repräsentiert eine mögliche Bedingung auf die ein
Thread warten kann. Auch eine Kombination mehrerer dieser Bedingungen ist
möglich. Der Thread selbst legt fest, wann seine Bedingungen erfüllt sind und er
aktiviert wird. Ein anderer Thread setzt oder löscht die Bits des Flags.
Message Boxes
Ecos bietet Message Boxes, auch Mail Boxes genannt an, damit zwei Threads
untereinander kommunizieren können. Im Gegensatz zu anderen Mechanismen
können hier größere Informationen übermittelt werden. Die Nachrichten werden
dabei in einer Warteschlange eingereiht. [21 Kap.6]
6.1.2 Interrupts
Ein Interrupt ist ein asynchrones externes Signal, das während der Programmausführung auftreten und eine Unterbrechung auslösen kann. Dieser wird durch
40
Bachelorarbeit
Daniel Schembri
ein Ereignis ausgelöst: z.B. das Überlaufen eines Timers, das Drücken eines Buttons oder das Empfangen eines Ethernet-Paketes sein. Wird ein Interrupt ausgelöst, dann wird der aktuelle Programmfluss unterbrochen und ein bestimmtes
Unterprogramm, die sogenannte ’Interrupt-Service-Routine (ISR)’ ausgeführt.
Dadurch wird ein gezieltes Abarbeiten von zeitkritischen Aufgaben ermöglicht.
Nach Beendigung des Unterprogramms wird an der letzten Stelle des Programms
fortgesetzt. Der LEON3-Prozessor hat bis zu 16 Interrupt-Leitungen für Hardwarekomponenten, die an den AMBA-Bus des Systems angeschlossen sind. Ein
besonders wichtiger Aspekt ist die Latenz zwischen dem Auslösen des Interrupts
und dem Ausführen der ISR.
Die Abarbeitung von Interrupts in eCos gliedert sich in zwei Teilbereiche: die ISR
und die DSR (Deferred Service Routine). Die ISR soll möglichst schlank gehalten werden, um eine niedrige Latenz zu erzielen. Bei komplexeren Aufgaben
sollte eine DSR verwendet werden, in der zeitintensivere Befehle ausgeführt werden. Dadurch ist es höher prioren Interrupts möglich, die Ausführung der DSR zu
unterbrechen. Zudem können die oben erläuterten Sperrmechanismen verwendet
werden. Man sollte ggf. darauf achten, dass die DSR nicht zu spät abgearbeitet
wird, da das System fehlerhaft arbeiten könnte: Beispielsweise in dem eine Komponente immer wieder Interrupts auslöst, die aber nie verarbeitet werden.
ISRs haben immer eine höhere Priorität als DSRs. DSRs haben immer eine höhere Priorität als Threads.
Die oben beschriebenen Sperrmechanismen sind für ISRs deaktiviert und deshalb nur in DSRs zu verwenden. Die Verwendung in einer ISR kann zu undefiniertem Verhalten führen. [21 Kap.3]
6.2 Implementierung des Zeitstempelverfahrens
Das Zeitstempelverfahren ist eine eigene Funktion in eCos und wurde zusammen
mit einem Hardwaretimer realisiert. Der Timer wurde so eingestellt, dass er mit
1MHz zählt und alle 10ms einen Reload durchführt.
Folgend das Flußdiagramm:
41
Bachelorarbeit
Daniel Schembri
Abbildung 6.1
Zu Beginn wird der Inhalt des Hardware-Timers in die Variable Time_us geladen.
Dabei handelt es sich um einen Zeitwert auf 100 Mikrosekunden genau. Zu beachten ist dabei, dass der Hardware-Timer den Wert dekrementiert.
Anschließend wird die Timebase der Variablen Time_10ms zugewiesen. Nach der
Zuweisung der Time_us gibt es zwei kritische Zeitpunkte, die im Diagramm dargestellt sind. Es kann zu einem Überlauf des Timers und somit zu einem Interrupt
kommen. Dabei wird die Timebase um weitere 10 Millisekunden aktualisiert. Daher muss anschließend überprüft werden, ob es zu diesem Überlauf kam. Ist der
Wert des Hardware-Timers niedriger als der Variablen, so gab es einen Überlauf.
Hat die Timebase zudem den gleichen Wert der Variablen Time_10ms, so muss
Time_10ms dekrementiert werden. Da sich die Timebase nur alle 10 Millisekunden aktualisiert, wird der Thread vor einer weiteren Aktualisierung beendet sein.
Es daher nicht von weiteren Fehlerquellen auszugehen.
42
Bachelorarbeit
Daniel Schembri
6.3 Systemaufbau und Prozesse im HiTES
In der eCos-Anwendung gibt es zwei zentrale Threads und einen 512KByte
großen Speicher, der in zwei 256KByte große Bereiche aufgeteilt ist. Diese Bereich dienen zum Puffern der UMSG- und UMSGV-Pakete. Ein Thread nimmt
Messdaten entgegen und generiert Zeitstempel. Daraus werden UMSG-Pakete
erzeugt, die auf den Speicher gepuffert werden. Nachdem 256KByte Daten geschrieben wurden, sendet der Thread einem anderen Thread ein Startsignal. Dieser schreibt die Daten auf eine SD-Karte. Dabei verwendet er Funktionen des
Filesystem-Treibers. Gleichzeitig wird auf dem zweiten Speicherbereich die Pufferung der Daten fortgeführt. Ist auch der zweite Bereich gefüllt, wird wieder mit
dem ersten fortgefahren. Wichtig ist hierbei, dass die Threads nicht auf den Bereich des anderen zugreifen.
Folgend eine Darstellung des Gesamtsystems:
Abbildung 6.2: Aufbau des Systems mit SD-Karte (geänderte Abb. von [17 Kap.5.2
Abb.4.1])
43
Bachelorarbeit
Daniel Schembri
Zu Beginn wird eine Initialisierung der Variablen und eine Speicherallokation
durchgeführt. Anschließend werden Testdaten generiert und eine UMSG erzeugt.
Der Zugriff auf die beiden Speicherbereiche ist mit Zeigern realisiert.
Durch dieses Puffer-Verfahren wird es möglich die UMSG-Pakete zum Transfer
über W-LAN abzuzweigen. Hierzu muss lediglich ein weiterer Thread implementiert werden, der einen Zeiger auf die entsprechenden Daten besitzt. Ggf. muss
das Scheduling der Threads angepasst werden.
6.4 Tests der gesamten HiTES-Firmware
Die Firmware wurde auf Performance, Multithreading-Funktionalität und korrekte
Implementierung des Filesystem-Treibers getestet.
6.4.1 Geschwindigkeits-Test
Folgend der Benchmark zur Messung der Schreibgeschwindigkeit des Treibers
auf die SD-Karte:
Abbildung 6.3: Benchmark: Schreiben von 10MByte Testdaten auf die SD-Karte
Um die Geschwindigkeit zu Testen wird ein Benchmark ausgeführt das 10MByte
an Testdaten auf 20480 Sektoren der SD-Karte schreibt. Dabei wird ein MultipleBlockwrite ausgeführt. Die SD-Karte benötigte 76677 Taktzyklen, um die Daten
in ihre Flashspeicher zu schreiben. Das Schreiben war erfolgreich und benötigte
9,5145 Sekunden. 2316 Byte des Stacks wurden dabei belegt.
44
Bachelorarbeit
Daniel Schembri
6.4.2 Filesystem-Test
Folgend der Benchmark zum Test des Schreibens eines UMSGFS-Headers:
Abbildung 6.4: Benchmark: Schreiben eines UMSGFS-Headers mit einem Eintrag auf die
SD-Karte
Bei diesem Test wird ein 512Byte großer Block mit UMSGFS-Headerdaten geschrieben. Dabei wird ein Single-Blockwrite ausgeführt. Das Schreiben des Headers dauert 3,416 Millisekunden und auf dem Stack wurden 2308Bytes belegt.
6.4.3 Multithreading-Test
Folgend ein Benchmark zum Test des Multithreadings in eCos:
Abbildung 6.5: Benchmark: Test des Multithreading in eCos
45
Bachelorarbeit
Daniel Schembri
Bei diesem Benchmark gibt es zwei Threads die abwechselnd Text auf der Konsole ausgeben. Dabei zeigen sie die Verzögerung in Taktzyklen bis zu ihrem Aufruf
an.
Fazit: Der Grundaufbau des Systems funktioniert. Es stehen noch Tests zum
Schreiben von Testmessdaten und zum Betrieb unter Volllast aus.
46
Bachelorarbeit
7
Daniel Schembri
Fazit und Ausblick
Das Ziel dieser Bachelorthesis ist der Entwurf und die Implementierung von Messdatenaufzeichnung einer Bohrlochsonde. Kamerabilder und Messdaten werden
dazu mit einem Zeitstempel versehen und auf eine SD-Karte gespeichert. Zu diesem Zwecke wurde der vorgegebene SD-Controller auf Schaltungsebene erweitert und spricht nun SDHC- und SDXC-Karten an. Die entwickelten Treiber bieten
ausreichend Performance, um alle anfallenden Mess- und Bilddaten auf der SDKarte abzuspeichern. Der Dateisystem-Treiber erzeugt einen Header und erlaubt
es weitere Messfahrteinträge, nach einem Systemreset, hinzuzufügen. Durch Implementierung des Zeitstempelverfahrens in dem Echtzeitbetriebssystem eCos
werden die Datenpakete, zeitlich rekonstruierbar, archiviert. Durch das entwickelte Pufferungs-Verfahren ist es möglich, die anfallenden Mess- und Bilddaten der
Sonde abzuzweigen und diese zeitgleich über das Ethernet zu übermitteln. Auf
einen zuverlässigen Ablauf des Multithreading und der Interruptbehandlung wurde Wert gelegt.
Der Grundaufbau des Systems und die Treiberschichten wurde sowohl bezüglich
der Performance, als auch der Zuverlässigkeit getestet. Ein Test unter Volllast des
Systems mit allen angeschlossenen Sensoren steht noch aus.
47
Bachelorarbeit
8
Daniel Schembri
Literatur- und Quellenverzeichnis
[1] Karlsruher Institut für Technologie KIT
http://www.kit.edu/kit/
Auf der Internetseite finden sich u.A. Informationen zu Instituten
und Forschungsprojekten des KIT.
[2] Xilinx Inc.
DS160 Spartan-6 Family Overview [Online]
http://www.xilinx.com/support/documentation/data_sheets/
ds160.pdf
Das Family-Overview gibt eine Übersicht über die einzelnen FPGAS von
Xilinx.
[3] Daniel Schembri
Implementierung von IP-Cores an den AMBA-Bus eines FPGA-Prozessorsystems zur Realisierung von nebenläufiger Bildverarbeitung
Duale Hochschule Baden-Württemberg Karlsruhe, Projektbericht
4.Semester
In diesem Projektbericht wird auf die Entwicklung von eigenen AMBAIP-Cores eingegangen. Diese können an das Leon3-System angebunden
werden und dienen als Vorlage für andere Cores.
Das AMBA-AHB-Protokoll wird näher erläutert.
48
Bachelorarbeit
Daniel Schembri
[4] Daniel Schembri
Entwicklung und Optimierung von Komponenten und Multitasking einer
Mess-und Bilddaten-GUI, Duale Hochschule Baden-Württemberg
Karlsruhe, Projektbericht 3.Semester
Der Projektbericht behandelt die Verarbeitung der Mess- und Bilddaten am
Bedienstand. Es wird auf die Entwicklung verschiedener Verfahren zur
Optimierung der Datenverarbeitung eingegangen. Darunter Multithreading
und ein Zeitstempelverfahren.
[5] ARM Infocenter
AMBA-Spezifikation [online]
http://infocenter.arm.com/help/index.jsp
Die AMBA-Spezifikation beschreibt ausführlich das AMBA-Bussystem.
Dabei wird auf den Hochgeschwindigkeitsbus AHB und den Peripheriebus
APB eingegangen.
[6] KIT - Institut für Angewandte Informatik
Geothermieprojekt ZWERG [online]
http://geothermiewiki.iai.kit.edu/
Auf der Webseite findet man Informationen zum Geothermieprojekt
ZWERG. Es gibt eine Sammlung wissenschaftlicher Arbeiten rund um
die Bohrlochsonde.
[7] Isele, Jörg
Zwischenbericht - Kamerainspektionssystem für tiefe Geothermiebrunnen GeoKam, KIT, 2013
Im Zwischenbericht wird auf die technischen Komponenten der Sonde
eingegangen. Außerdem wird ein Resümee zum aktuellen Stand des
Projektes gezogen.
49
Bachelorarbeit
Daniel Schembri
[8] Antes, Martin
Entwicklung und Konstruktion eines Gehäuses zum Wärmemanagement
einer Inspektionssonde für Geothermiebrunnen, Diplomarbeit, KIT, 2013
Die Diplomarbeit geht näher auf das Dewargefäß in der Sonde ein.
[9] Aeroflex Gaisler AB.
GRLIB IP-Library
Die GRLIB ist eine Sammlung von IP-Cores, die sich an das LEON3System von Gaisler anbinden lassen. Dieses wird z.B. in Satelliten der
ESA eingesetzt.
[10] Reichardt, Jürgen und Schwarz, Bernd
VHDL-Synthese – Entwurf digitaler Schaltungen und Systeme,
München : Oldenbourg-Verlag, 2007
Sehr praxisnahes Buch das von Grund auf die Entwicklung mit VHDL
erläutert.
[11] Sauer, Peter
Hardware-Design mit FPGA – Eine Einführung in den Schaltungsentwurf
mit FPGA-Bausteinen. Aachen : Elektor-Verlag, 2010.
Das Buch bietet eine kompakte Zusammenfassung und Beispiele zu VHDL.
[12] Kesel, Frank und Bartholomä, Ruben
Entwurf von digitalen Schaltungen und Systemen mit HDLs und FPGAs –
Einführung mit VHDL und SystemC. München : Oldenbourg-Verlag, 2009.
Das Buch beschreibt sehr ausführlich die wichtigsten Aspekte über den
Entwurf von digitalen Schaltungen mit VHDL. Dabei wird auch auf
typische Anfängerfehler eingegangen.
50
Bachelorarbeit
Daniel Schembri
[13] Motorola Mobility LLC.
M68HC11 Reference Manual
In Kapitel 8 wird auf das SPI-Protokoll eingegangen.
[14] SD Group
SD Specifications Part 1 Physical Layer Simplified Specification
Version 4.10
https://www.sdcard.org/downloads/pls/simplified_specs/
part1_410.pdf
Das Dokument enthält die wichtigsten Spezifikation zu SD-Karten.
[15] Chlazza
Secure Digital (SD) Card Spec and Info [online], 2010
www.chlazza.net/sdcardinfo.html
Die Webseite erläutert das SPI-Protokoll im Zusammenhang mit SD-Karten.
[16] Aeroflex Gaisler AB.
GRIP
Die GRIP beschreibt den Aufbau der IP-Cores von Gaisler
und geht auch auf die konkrete Implementierung ein.
[17] Frueh, Aaron
Entwicklung eines Echtzeit-Kernel zur Hochgeschwindigkeitsubertragung
für das High-Temperature-Embedded-System einer Bohrlochsonde,
Duale Hochschule Baden-Württemberg Karlsruhe, Bachelorarbeit
Die Bachelorarbeit von Aaron Frueh geht auf die Konzeption eines Echtzeitsystems basierend auf eCos ein.
51
Bachelorarbeit
Daniel Schembri
[18] International Telecommunication Union (ITU)
ITU-T Recommendation X.200
http://www.itu.int/rec/T-REC-X.200-199407-I
Das Dokument spezifiziert das OSI-Schichtenmodell.
[19] Deutsches Institut für Normung
Informationsverarbeitung - Begriffe, DIN43000.
Beuth-Verlag, Berlin, Köln, 1985
[20] Scholz, Peter
Softwareentwicklung Eingebetteter Systeme
Das Buch geht auf Echzeit in eingebettenen System ein
[21] Embedded Software Development wirth eCos
eCos Developer Guide
Das Dokument erläutert Hintergrundinformationen und die Vorgehensweise
zur Anwendungsentwicklung mit eCos
52
Bachelorarbeit
9
Daniel Schembri
Anhang
Die wichtigsten Dokumente und der Quellcode dieser Bachelorarbeit sind auf der
beigelegten CD enthalten.
Darunter:
• Quellen im PDF-Format und ggf. den dazugehörigen Quellcode
• Der Modifizierte SPIM-Ctrl-Core
• Die Treiber und die eCos-Anwendung
• Die Bachelorarbeit als PDF
53