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