Langversion - All

Transcription

Langversion - All
uClinux als Embedded-Betriebsystem für einen DSP
Dipl.-Ing(FH) Michael Hennerich
In den vergangenen Jahren, entwickelte sich Linux zunehmend zu einem
Betriebsystem für Embedded-Anwendungen. Dies gilt zum einen besonders für den
Produktbereich der Unterhaltungselektronik, aber auch für viele andere
industrielle Anwendungen.
Für Firmen, die im Bereich der Unterhaltungselektronik Produkte entwickeln, ist die
Zuverlässigkeit der Plattform, niedrige Kosten und eine schnelle Markteinführung
Grundvoraussetzung. Auf Grund der Modularität von uClinux ist es einfach, das System
aufs Notwendigste zu verkleinern, indem man Dienst- und andere Systemprogramme
entfernt, die in einer Embedded-Umgebung nicht benötigt werden. Einer der
Hauptvorteile von uClinux als voll funktionsfähiges Betriebsystem ist die breitbandige
Unterstützung fast aller Dateisystem- und Netzwerkprotokolle, die durch die Konvergenz
von Audio-, Video- und Kommunikationsanwendungen eine zunehmend größere Rolle
spielen. Als starke und unentgeltliche Open Source-Plattform stellt sich uClinux diesen
Anforderungen. Sie ist daher besonders für preisempfindliche Entwicklungen geeignet.
Die Blackfin™ Embedded-Media-Prozessoren von Analog Devices Inc. vereinen in sich
DSP-Rechenleistung und Funktionalität von Mikrocontrollern, und sie werden damit den
Ansprüchen moderner Audio-, Video- und Kommunikationsanwendungen im Hinblick
auf Rechenleistung und Energiebedarf gerecht. Die Kombination eines erstklassigen
DSP-Prozessors und einer traditionellen Mikrocontroller-Architektur auf einem Chip
vermeidet zudem die Einschränkungen, die Komplexität und die höheren Kosten
heterogener Dual-Prozessor-Systeme. Neben der gängigen Peripherieausstattung (SPI,
UART mit IrDa®-Unterstützung, Timer, RTC, Watchdog, und Event Controller),
verfügen alle Mitglieder der Blackfin Familie über zwei serielle Dual-Channel-Ports
(SPORTs), für je vier Stereo-I²S-Kanäle, die Datenraten bis 100MBit/s erlauben. Darüber
hinaus enthalten die neusten Mitglieder der Blackfin-Familie (ADSP-BF531, ADSPBF532, ADSP-BF533) ein „Parallel Peripheral Interface (PPI)“, das eine nahtlose
Verbindung mit Video-Konvertern (CCIR-656, 27Mhz), TFT-Flat Panels herstellt oder
z.B. als parallele Schnittstelle für AD/DA-Wandler bis 65 MSPS dient. Der äußerst
flexible und vom Core-Prozessor unabhängige DMA-Controller (Direct Memeory
Access) erlaubt sowohl Datenübertragungen von internem zu externem Speicher als auch
an die DMA-taugliche Peripherie, und zwar in jeder erdenklichen Richtung. Tabelle 1
zeigt die derzeit verfügbare Blackfin-Produktpalette.
Part
Clock
Speed
(MHz)
MMACS
(Max)
Memory
(kBytes)
External
Memory
Bus
PCI 2.2
USB UARTs,
PPI Master/
Dev. Timers
Slave
Watchdog
Timer, RTC
Core
Voltage
Reg.
ADSP-BF535P
350
700
308
32bit
Nein
Ja
Ja
Ja
Ja
Nein
260 PBGA
ADSP-BF531
400
800
84
16bit
Ja
Nein
Nein
Ja
Ja
Ja
160 MiniBGA, 176
LQFP
ADSP-BF532
400
800
116
16bit
Ja
Nein
Nein
Ja
Ja
Ja
160 MiniBGA, 176
LQFP
ADSP-BF533
600
1,200
148
16bit
Ja
Nein
Nein
Ja
Ja
Ja
160 MiniBGA
Package
Tabelle 1 Blackfin Produktpalette
Linux auf einem DSP ?
Obwohl Linux ursprünglich nicht für den Einsatz in Embedded-Systemen konzipiert
wurde, bahnte Linux sich den Weg dorthin. Seit der Version 2.0.x ist ein stark
wachsender Trend für den Einzug in die Welt der Embedded System zu erkennen. Eine
ähnliche Erscheinung ist in der Welt der Digitalen Signalprozessoren (DSPs) zu
verzeichnen. Gründe hierfür sind vielfältig. Auf der einen Seite fallen die Preise dieser
„Rechenknechte“; sie liegen im Preisleistungsverhältnis bereits unter denen der
herkömmlichen Prozessoren oder Mikrocontroller. Der ADSP-BF531 wird z.B. bereits
für US-$ 5 in Stückzahlen angeboten. Auf der anderen Seite haben Weiterentwicklungen
auf Systemarchitekturebene alle Vorbehalte gegen einen Einsatz ausgeräumt. Die von
Analog Devices und Intel zusammen entwickelte „Micro Signal Architecture (MSA)“ ist
ein Beweis hierfür und soll hier kurz vorgestellt werden.
Bild 1:Micro Signal Architecture
Der Blackfin-Core basiert auf einer modifizierten Harvard-Architektur. Instruktionen und
Daten sind in verschiedenen L1-Speicherbereichen untergebracht, teilen sich aber einen
gemeinsamen L2-Speicher. L1 und L2 beschreiben die Level im hierarchischen
Speichersystem. Am schnellsten ist der L1-Speicher, da er dem Core-Prozessor am
nächsten liegt. Aus diesem Grund ist die MSA in der Lage, mehrere Speicherzugriffe in
einem Instruktionszyklus gleichzeitig durchzuführen. Parallel zum Holen eines Befehls
werden die dazu benötigten Operanden geladen und die Ergebnisse der vorherigen
Operation in den Speicher geschrieben. Während der Prozessor die MAC-Operation
(Multiply-Accumulate-Operation) ausführt, werden parallel dazu der Messwert und der
Koeffizient für die Berechnung geladen. Um dies zu ermöglichen, verfügt der Blackfin
über mehrere on-chip-Bussysteme und on-chip-Speicher (multi-ported, zero-latency) in
unabhängigen Speicherbänken. Beide L1-Speicherbereiche können sowohl als SRAM als
auch als Instruktions- und Daten-Cache konfiguriert werden. Die Benutzung des Cache
ermöglicht ein äußerst effizientes, automatisiertes und daher einfach zu benutzendes
Speichermanagement und ist bestens in Verbindung mit C/C++- Compilern geeignet, da
die Speicherzugriffsoptimierung nicht vom Programmierer oder Compiler, sondern vom
Core selbst erledigt wird. Der Blackfin Prozessor besitzt 5 unabhängige
Berechnungseinheiten: zwei arithmetisch-logische Einheiten (ALU), zwei MultiplizierAkkumulier-Einheiten (MAC) und einen Barrel Shifter. Mit dieser Anordnung können in
einem Befehlszyklus zwei 40-bit Additionen, zwei 16 x 16-bit Multiplikationen, zwei 32-
bit Adressberechnungen und zwei Speicherzugriffsoperationen ausgeführt werden. Die
Ausführung solcher Operationen war bis vor kurzem nur den teuren VLIW-Prozessoren
vorbehalten (Very Long Instruction Word). Die MSA geht neue Wege und vereinigt die
Vorteile einer RISC-Architektur (Reduced Instruction Set Code) mit der eines DSP, der
über einen sehr kompakten und für den Betrachter intuitiv lesbaren MaschinencodeBefehlsatz verfügt. Dabei stehen prinzipiell zwei Instruktionsarten zur Verfügung: Die
für Audio- und Video-Anwendungen optimierten Befehle und die gewöhnlichen
Programmabarbeitungs-Instruktionen. Letztere lassen sich von einem C/C++ Compiler
sehr gut interpretieren und erzeugen einen sehr effektiven Code.
Aus den oben genannten Gründen eignet sich der Blackfin Embedded-Media-Prozessor
für die Portierung eines uClinux Betriebsystems. uClinux ist ein Derivat des aktuellen
Linux-Kernels, speziell für Prozessoren ohne Memory Management Unit (MMU). Linux
und andere Unix-ähnliche Betriebssysteme setzen normalerweise das Vorhandensein
einer MMU voraus. Diese erfüllt wichtige Aufgaben wie die Bereitstellung eines
virtuellen Adressraums und des wechselseitigen Speicherschutzes für die verschiedenen
Applikationen. In der Regel ist der Entwickler eines Embedded-Systems mit den
Eigenschaften und der Programmierung seines Systems vertraut. Die Anwender haben
jedoch nur Zugriff über sichere Schnittstellen und können somit den Funktionsumfang
nicht verändern. Bei sorgfältigem Entwurf der Anwendungen hinsichlich des
Speicherbedarfs und des Zusammenwirkens von Applikationen kann also durchaus auf
die virtuelle Speicherverwaltung verzichtet werden. Einige weitere Einschränkungen von
uClinux gegenüber Linux ergeben sich ebenfalls aus dem Fehlen der MMU. Für die
meisten Einschränkungen existieren jedoch Alternativen, und diese sind für die
Anwendung in Embedded Systemen meist unerheblich. Der Entwickler eines uClinux
Systems kann sich hierüber im Internet unter www.uclinux.org informieren [4].
Entwicklung mit uClinux
Bei der Arbeit mit uClinux geht man so vor, dass man sich einen speziell auf die
gewünschte Applikation zugeschnittenen Kernel unter Berücksichtigung der vorhandenen
Hardware generiert. Bei Änderungen in der Applikation ist es daher unausweichlich, den
uClinux Kernel neu zu konfigurieren und dann zu kompilieren. Für die Konfiguration des
Kernels stehen grafische Werkzeuge zur Verfügung. Selbst für einen Linux-Neuling stellt
die Erzeugung eines neuen uClinux Kernels im Allgemeinen kein großes Problem dar.
Was die Funktionalität angeht, erschließen sich dem Systementwickler durch die
Verwendung eines uClinux-Betriebsystems enorme Möglichkeiten: er erhält Netzwerkund Dateisystem-Unterstützung, Treiberunterstützung für fast jede gängige Hardware,
verschiedenste Protokolle und Programme, darunter auch MP3-Decoder, Audio-Recorder
und vieles mehr. Der spezielle uClinux-Port für den ADSP-BF535 [1] enthält darüber
hinaus Treiber für die gesamte interne Peripherieausstattung (DMA, PCI, RTC, SPI,
SPORT, SPORT AC97 CODEC, TIMER, USB). Die Benutzung dieser Peripherie ist
sehr einfach. Linux verwaltet alle Geräte (serielle Schnittstellen, Speicher, Dateien etc.)
über das so genannte Virtuelle File System (VFS). Dem Programmierer einer User
Space-Anwendung steht somit eine einfache Schnittstelle zur Peripherie zur Verfügung.
Die Benutzung dieser Schnittstelle entspricht der beim Zugriff auf Dateien. Wichtige
Parameter wie Sample Rate, Sample Format werden mittels ioctl-Funktionsaufrufe
eingestellt [5]. Der Anschluss eines AC97 Audio-CODECs z.B. AD1885, AD1836 an
den Blackfin erfolgt nahtlos ohne Verwendung weiterer aktiver Bauelemente [3]. Bild 2
zeigt das Verbindungsdiagramm für den ADSP-BF535.
SDATA_IN
DR0
SDATA_OUT
DT0
RCLK0
BIT_CLK
SYNC
AD1885
TCLK0
RFS0
ADSP-BF535
Bild 2: AD1885-Verbindungsdiagramm
main(){
...
fd = open("/dev/dsp", O_RDONLY, 0);
...
int speed = 44100 // 44.1kHz
ioctl(fd, SNDCTL_DSP_SPEED, &speed)
...
read(fd, buffer_rx, number_of_bytes);
...
close(fd);
}
Beispiel: Lesen vom AC97 CODEC
Echzeitfähigkeit von uClinux
Über die Echzeitfähigkeit von uClinux wurde in der Vergangenheit oft diskutiert.
Viele von Embedded-Systems gesteuerte Anwendungen müssen bestimmte zeitliche
Anforderungen erfüllen. Früher war es deshalb üblich, für zeitkritische Anwendungen
proprietäre Hardware zu verwenden. Bei sehr hohen Anforderungen ist dies auch heute
noch der Fall. Aus Kostengründen ist es aber vorteilhaft, einen geeigneten Prozessor, der
rechenintensive Algorithmen effizient bearbeitet, in Verbindung mit einem uClinuxBetriebssystem einzusetzen. Dies führt in der Regel zu einer effizienten Entwicklung, da
beispielsweise Netzwerkfähigkeit implizit vorhanden ist. Eine Audio-/Video-Wiedergabe
sollte möglichst störungs- und ruckfrei ablaufen. Ein hin und wieder verlorenes Frame
einer Videosequenz oder eine kurze Unterbrechung bei der Musikwiedergabe kann
toleriert werden, solange es nicht vom Betrachter als störend empfunden wird. Dabei
handelt sich in solchen Fällen um ein weiches Echtzeitproblem, da einzelne
Überschreitungen erlaubt sind. Linux ist kein hartes Echtzeit-System; dafür wurde es
auch nie konzipiert. Es existieren jedoch Erweiterungen für Linux, die als Patches
eingefügt werden können und die Eigenschaften stark verbessern (low latency / kernel
preemption). Im Kernel 2.6 sind diese Verbesserungen bereits implementiert. Weiche
Echtzeit, nicht nur für Audio/Video Anwendungen, stellt somit kein Problem dar. Die in
den Tabellen 2 und 3 angegebenen theoretischen Werte für die Ausführungszeiten
gängiger Multimedia- und Kommunikationsalgorithmen beziehen sich auf einen ADSPBF533, ohne Betriebsystem. Über die Prozessorgrundlast eines uClinux-Betriebsystems
kann man nur schwierig eine Aussage machen, da diese vom Konfigurationsumfang und
der Anzahl der gleichzeitig ablaufenden Prozesse abhängt. Generell sind Werte im
einstelligen Prozentbereich möglich, wobei man jedoch nicht die systemabhängigen
Latenzzeiten vernachlässigen darf.
Video Codec
Image
MHz Req.
MPEG-2 Player
MPEG-4 SP Player
H.264 Player
MPEG-2 Player
MPEG-4 SP Player
H.264 Player
Audio Codec
WMA ver. 8 Player
WMA PRO ver. 9 Player
MP3 Player
MP3 Pro Player
D1 (720 x 480) @ 30 fps
D1 (720 x 480) @ 30 fps
D1 (720 x 480) @ 30 fps
CIF (360 x 240) @ 30 fps
CIF (360 x 240) @ 30 fps
CIF (360 x 240) @ 30 fps
Sample Rate
48 kHz, 128 kHz
290 MHz
311 MHz
446 MHz
73 MHz
78 MHz
111 MHz
% Loading
(of 600 MHz)
48%
52%
74%
12%
13%
19%
50 MHz
125 MHz
19 MHz
70 MHz
8%
21%
3%
12%
Tabelle 2
Speech Codec
MHz Req.
G.728
G.726
G.729AB
G.723.1A
DTMF
G.168 (64 ms Sparse)
RTP/RTCP/JIB
AMR
27 MHz
6.5 MHz
14 MHz
22 MHz
1.5 MHz
8.0 MHz
1.0 MHz
16.0 MHz
Instr. Mem.
(kBytes)
14.4
4.35
36.0
29.0
4.2
9.0
12.0
49.0
Data Mem.
(kBytes, Common)
3.0
0.58
12.0
24.0
0.2
1.4
0.8
37.8
Data Mem.
(kBytes/Ch.)
7.0
0.12
3.6
2.0
0.8
3.0
2.0
-
% Loading
(of 600 MHz)
4.5%
1.0%
2.3%
3.6%
0.3%
1.3%
0.2%
2.6%
Tabelle 3
Bezugsquellen
Alle Quellcodes, Werkzeuge (Compiler, Binutils), die zur Erzeugung eines uClinuxKernels für den Blackfin benötigt werden, können von der URL-Adresse
www.blackfin.uclinux.org bezogen werden. Jedoch ist hierfür ein PC mit einem LinuxBetriebssystem erforderlich (SuSE, RedHat). Wer gänzlich bei der Entwicklung auf einen
Linux-PC verzichteten möchte, kann unter www.blackfin.org/linux.php eine kostenlose
Alternative finden, die besonders einfach zu installieren ist: die Cygwin ADSP-BF-535
uClinux-Distribution. Compiler und andere Werkzeuge für die Erzeugung eines uClinuxKernels arbeiten dabei in einer Windows- Umgebung. Das Paket ist besonders für
Entwickler geeignet, die aus Gründen der Netzsicherheit ein Linux-Betriebssystem am
Arbeitsplatz nicht installieren dürfen.
Perspektive und Fazit
Der Blackfin-Prozessor bietet für seine Leistungsklasse (1200MMAC @ 600MHz) ein
sehr gutes Preis-Leistungs-Verhältnis, wobei sich die fehlende MMU durch die
Verwendung des stabil arbeitenden uClinux-Betriebssystems verschmerzen lässt. Zudem
arbeitet der Prozessor sehr viel stromsparender als vergleichbare Prozessoren mit MMU.
Seine DSP- und Multimedia- Fähigkeiten machen den Blackfin zu einem idealen
Prozessor. Nicht nur für Audio-/Video-Anwendungen, sondern auch zum Einsatz im
Industrie- und automobilen Bereich. Ein weiterer Vorteil und Nutzen von Linux ist, dass
die Software für viele Dienste und Protokolle bereits vorliegt. Nur auf der Treiberebene
sind gelegentlich noch Anpassungen auszuführen. Sind dennoch Neuentwicklungen
erforderlich, so steht ein ausgereiftes, gut dokumentiertes und standardisiertes Konzept
zur Verfügung.
Offiziell ist der uClinux-Port (Kernel 2.4.6) nur für den ADSP-BF535 erhältlich. Jedoch
erfreut sich dieser uClinux-Port großer Beliebtheit, und einige Open Source Entwickler
arbeiten schon an der Portierung des ADSP-BF533 mit einem aktuelleren Kernel (2.4.22).
In der zweiten Hälfte diesen Jahres soll dann offiziell ein Kernel 2.6.x für den ADSPBF533 erscheinen, der auch umfangreiche Treiberunterstützung für Video-CODECs
enthält.
Links:
[1] www.blackfin.uclinux.org
[2] www.blackfin.org
[3] www.analog.com/blackfin
[4] www.uclinux.org
[5] http://www.4front-tech.com/pguide/oss.pdf