SlideShare a Scribd company logo
1 of 42
Download to read offline
Eine CPU kann rechnen, 
aber ein DSP kann zaubern 
Harald Kipp 
HaSi-Talk am 21.08.2014 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Wer ist der Typ da vorne? 
Harald Kipp 
Geschäftsführer der egnite GmbH 
● Entwicklung, Produktion und Vertrieb von 
Mikrocontroller Boards 
● Distribution von Ethernet-Sensoren, Audio-Codecs etc. 
● www.egnite.de 
Gründer und Admin des Ethernut Projekts 
● Open Source Hardware und Software 
● www.ethernut.de 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Wer sitzt im Publikum? 
● Hardwarekenntnisse 
– Erfahrung mit Spannung und Strom 
– Allgemeine Struktur einer CPU ist bekannt (Register, Bus) 
● Softwarekenntnisse 
– Erste Erfahrungen mit C-Programmierung 
– Erste Erfahrungen mit Assemblerprogrammierung 
● Mathematikkenntnisse 
– Grundrechenarten 
– Lesen von Diagrammen 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Worum es geht hier eigentlich? 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
D igitaler 
S ignal- 
P rozessor 
Eine CPU kann rechnen, aber ein DSP kann zaubern 
– Signalverarbeitung im Schnelldurchgang (0:10) 
– Nachteile von universellen Prozessoren (0:05) 
– Hacking eines MP3-Decoders (0:15) 
– Kurze Pause (0:05) 
– Anleitung zum Bau eines Filters (0:15) 
– Demonstration eines Audioeffekts (0:10)
Signal 
Ein Signal ist eine sich kontinuierlich ändernde 
physikalische Größe, die Information enthält. 
Gesäusel (Luftdruck 
ändert sich kontinuierlich) 
Telefondraht (Elektrische 
Spannung ändert sich 
Bundesarchiv, Bild 183-57339-0018 
Mr. Dagger Complex kontinuierlich) 
„prüft“ kontinuierlich 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Verstärken 
● Ein elektrisches Signal wird verstärkt, um es über eine 
große Entfernung übertragen zu können. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Graphics made 
by SciLab
Modulieren 
● Das Signal wird auf einen Träger aufmoduliert. 
Signal 
Träger 
Modulierter Träger 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Mischen und Filtern 
● Modulierte Trägerwel-len 
zusammenfassen 
um mehrere Signale 
über eine Leitung zu 
transportieren. 
● Am Leitungsende ein-zelne 
Träger durch 
Filter trennen und das 
Ursprungssignal mit 
Demodulator zurück-gewinnen. 
● Das ist Signalverarbei-tung. 
Signal 1 
Träger 1 AM 1 
Signal 2 Träger 2 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
AM 2 
Summe
Analog und digital 
● Analog 
– Kontinuierliche 
Funktionen 
– Realisierung mit 
Hardware 
● Digital 
– Diskrete Werte 
– Realisierung 
überwiegend in 
Software 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Roger McLassus 
Creative Commons Attribution-Share Alike 3.0 Unported
Digitalisierung 
Durch Digitalisierung erhält man zu konkreten Zeiten 
konkrete Werte 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Mathematische Methoden 
Hardware Mathematik 
Verstärken 
UOUT = 2 * UIN 
Modulieren 
UOUT = US * UT 
Summieren 
UOUT = U1IN + U2IN + ... 
Filtern 
UOUT = Σ coeff[i] * UIN[n-i] 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Anforderungen an digitale 
Signalverarbeitung 
● Kontinuierliche Verarbeitung von Datenströmen... 
– Hauptsächlich Multiplikation und Addition von 
Vektoren 
– Behandlung von Überläufen 
● ...in Echtzeit 
– Effektive Speicherzugriffe 
– Effektive Schleifen 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Programmschleifen 
Compiler C-Programm Assemblerprogramm 
/* Verstärker */ 
for (i = 0; i < 100; i++) { 
u_out[i] = u_in[i] * amp; 
} 
● Universeller Prozessor 
– Die meisten Befehle werden 
für die Schleifensteuerung 
benötigt 
– Daher hohe Taktrate für 
Echtzeitverarbeitung 
erforderlich 
– Viele MIPS, wenig GRIPS 
LDI R1, 0 
LDI R2, 100 
LD R3, AMP 
LOOP: 
CMP R1, R2 
JGE END 
LDX R4, U_IN, [R1] 
MUL R4, R3 
STX R4, U_OUT, [R1] 
INC R1 
JMP LOOP 
END: 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Kontinuierliche Multiplikation und 
Addition 
● Filter sind die typische Anwendung bei der digitalen 
Signalverarbeitung 
z.B. 
C-Programm 
/* Filter */ 
for (k = 0; k <= bufsiz; k++) { 
for (i = 0; i <= m; i++) { 
y[k] = y[k] + h[i] * u[k - i]; 
} 
} 
Schleifen sind nicht gut 
für universelle CPUs. 
Viel Rechnerei, aber es 
kommt noch dicker. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Überlauf 
Alarm 
Sättigungsarithmetik 
Beispiel: Zweifache Verstärkung von 128V am Eingang 
und maximal 255V Ausgangsspannung (Wertebereich) 
Hardware: 128V * 2 = 255V 8-Bit Software: 128V * 2 = 0V 
/* Handle overflow using 16-bit math */ 
u_out[i] = u_in[i] * 2; 
if (u_out[i] > 255) 
u_out[i] = 255; 
Einfache Lösung 
funktioniert mit 
Einschränkungen. 
Vorzeichen? 
Nachkommastellen?
Überlauf anschaulich gemacht 
A + B = Sättigungsarithmetik 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Standardarithmetik 
● Bildhelligkeit erhöhen 
Original + Offset 
Screenshot of Blender 2.41
Aktueller Leistungsvergleich 
● High-End DSPs ● High-End PC 
Texas Instruments C6000 
32-Bit CPU 
1,2Ghz Taktfrequenz 
8MB 2nd-Level Cache 
Optionale Fließkomma-Einheit 
Analog Devices SHARC / (Blackfin) 
400MHz Taktfrequenz 
Offizielle GNU Toolchain (für Blackfin) 
Intel Haswell 
64-Bit CPU mit FPU 
3,9Ghz Taktfrequenz (Turbo) 
84 Watt 
Und was ist mit Cortex-M4? 
Freescale StarCore 
Multi-Core 
1Ghz Taktfrequenz 
Theodor Fontane schreibt: 
Ein fester Kessel, 
ein doppelter Dampf, 
die bleiben Sieger 
in solchem Kampf. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Historischer Leistungsvergleich 
1995 
● WinPlay3, der erste real-time 
MP3-Decoder für 
PCs, benötigte 
● 32-Bit 468DX2 66MHz 
● FPU 
● 8kB Cache 
● 6W Stromverbrauch 
(nur CPU) 
1999 
● Single-Chip MP3 De-coder 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
auf DSP-Basis 
benötigte 
● 16-Bit mit 25MHz 
● Keine FPU 
● Kein Cache 
● 50mW Stromver-brauch 
(CPU ohne 
Analogteil)
MP3 Hardware-Decoder 
Moderne Miniatur-Audioplayer 
– z.B. mit VS10XX von VLSI Solution Oy 
USB-Schnittstelle 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Bist du 
meine Mami? 
GPIO-Taster 
DSP-Chip 
Streichholz? 
Audio-Ausgang 
Serielles Flash 
Steckergehäuse! 
Directmedia DVD-ROM 10.000 Meisterwerke der Malerei
Audiocodec-Architektur 
Theorie... ...und Praxis 
ADC 
DSP 
DAC 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Wichtig! 2 Busse! 
Programmier-schnittstelle 
Analogsignal 
Analogsignal
VSDSP4 Register 
● Spezialregister 
– Programmzähler PC 
– 2 Page Register IPR0 und IPR1 
– IPR0 wird beim Interrupt nach 
IPR1 kopiert 
– 32-Bit Produktregister P 
– 3 16-Bit Loop Register LS, LC und 
LE 
– 2 16-Bit Link Register LR0 und 
LR1 
– LR0 für Unterprogramme 
– LR1 für Interrupts 
– Pseudoregister NULL (alle Bits 0) 
und ONES (alle Bits 1) 
– 16-Bit Mode Register MR0 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Pipeline 
* 
* 
AND A0,A0,A0 
NOP 
JZS OUT 
NOP 
* 
* 
Takt Laden Dekodieren Ausführen Ergebnis 
1 AND * * 
2 NOP AND * 
3 JZS NOP AND Z-Flag gesetzt 
4 NOP JZS NOP 
5 ? NOP JZS Sprung ausgeführt 
● Nach einer arithmetischen Operation können die Flags 
erst nach einem Delay als Sprungentscheidung 
verwendet werden. 
● Sprünge werden mit einem Delay ausgeführt. 
● Statt NOP können wir etwas sinnvolleres tun. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Pipeline Beispiel 
Auswirkungen der Pipeline sind verwirrend und 
erfordern Kreativität. 
ldx (i0),b0 
add c0,b0,b0 
and a0,a0,a0 
nop 
jzs out 
nop 
and a0,a0,a0 
ldx (i0),b0 
jzs out 
add c0,b0,b0 
Delay Slots ausnutzen 
Modifiziert die Flags. 
Darf keine Operation sein, die das 
Z-Flag wieder verändern könnte. 
Sprung kann jetzt entschieden 
werden. 
Da auch der Sprung einen Delay hat, 
wird dieser Befehl immer ausgeführt. 
Hier dürfen die Flags wieder 
modifiziert werden. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Das blanke Entsetzen 
Das war eine abschreckende Eigenschaft. 
Jetzt kommen die Bonbons 
...endlich! 
Charles Darwin's The Expression of the Emotions in Man and Animals 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
MAC 
● MAC ist eine Abkürzung für Multiply and Accumulate 
– Eigentliche Reihenfolge: Erst ADD, dann MUL 
● Mächtiges Kommando für Filter-Implementierung 
c += a[i] * b[n-i] 
DSP PC 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
c += p; 
p = a0*b0; 
mac a0,b0,c 1 Takt Viele Takte
Schleifen 
LOOP A1,LOOPEND-1 
NOP 
LOOPSTART: 
* 
LOOPEND: 
* 
● LOOP-Befehl 
Reg. Inhalt 
LS Startadresse der Schleife 
LC Schleifenzähler 
LE Endadresse der Schleife 
– Kopiere PC+1 nach LS 
– Kopiere Register in Parameter 1 nach LC 
– Kopiere Adresse in Parameter 2 nach LE 
● Bearbeite Befehle bis PC gleich LE, dann 
– Prüfe, ob LC gleich Null 
– Wenn ungleich Null, dekrementiere LC um 1 und kopiere 
LS nach PC 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Modulo Adressierung 
● Implementierung von Ringpuffern 
– 0x8000: I1 wird jeweils um 1 
inkrementiert und nach 47 wieder 
auf 0 gesetzt 
– 0xA000: I1 wird jeweils um 1 
dekrementiert und nach 0 wieder 
auf 47 gesetzt 
– Puffer muss auf Adresse liegen, die 
durch nächsthöhere Zweierpotenz 
der Pufferlänge teilbar ist. 
Bei einer Pufferlänge von 48 muss 
der Puffer also an einer Adresse 
liegen, die durch 64 teilbar ist. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
ldc 0x8000+(48-1),i0 
ldx (i1)*,a0 
ldc 0xA000+(48-1),i0 
ldx (i1)*,a0
Parallele Verarbeitung 
● Viele Operationen können parallel ausgeführt werden 
– Arithmetische Operation, z.B. macss a0,a1,d 
– Zugriff auf X-Memory, z.B. ldx (i0)*,a0 
– Zugriff auf Y-Memory, z.B. ldy (i2)*,a1 
– Loop 
and a0,null,a0 
mulss a0,a0 
loop a1,END-1 
and d,null,d; ldx (i1)*,a0; ldy (i2)*,a1 
mac a0,a1,d; ldx (i1)*,a0; ldy (i2)*,a1 
END: 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Initialisierung 
Schleife (1 Taktzyklus) 
Realisierung eines Filters: 
f 
a 
Tiefpass
Intentionally blank slide 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Tiefpass Assemblerroutine 
Reale Implementierung der FIR Assemblerroutine 
Finite Impulse Response 
Filter mit endlicher Impulsantwort 
//void FirAsm(register __i0 s_int16 *d, __y register __i2 s_int16 *s); 
.sect code, FirAsm 
.export _FirAsm 
_FirAsm: 
// Store register values 
stx i1, (i6)+1 
stx i3, (i6); sty ls, (i6)+1 
stx le, (i6); sty lc, (i6)+1 
stx a0, (i6); sty a1, (i6)+1 
stx b0, (i6); sty b1, (i6) 
Filterkoeffiziententabelle 
bestimmt die Filterfunktion 
ldc MAKEMOD64(-2,LINE_IN_BUF_LEN), i3 //-2 step 
mv i0, i5 
ldc _firCoeffs, i0 // coefficient vector 
ldc 1, i1 // linear forwards +1 (No modulo) 
ldc 0x0000, mr0 // fract mode 
and a,NULL,a; ldx (i0)*,b1; ldy (i2)*,b0 
// clear a-reg., load first coef./sample -pair 
ldc FIR_LEN-2, lc // loop count 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Tiefpass Assemblerroutine 
loop lc, firloop1end-1 // start looping 
// Delay slot, perform first multiply, load next coef./sample -pair 
mul b1, b0; ldx (i0)*,b1; ldy (i2)*,b0 
firloop1: 
mac b1, b0, a; ldx (i0)*,b1; ldy (i2)*,b0 // use pipelined MAC to implement FIR 
firloop1end: 
add a, p, a 
ldc FIR_SCALE, b0 
ashl a, b0, a 
rnd a, a1 
stx a1, (i5) 
// Restore registers 
ldx (i6), b0; ldy (i6)-1, b1 
ldx (i6), a0; ldy (i6)-1, a1 
ldx (i6), le; ldy (i6)-1, lc 
ldx (i6), i3; ldy (i6)-1, ls 
ldx (i6)-1, i1 
jr 
ldc 0x200, mr0 // Delay slot, restore integer mode 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Tiefpass C-Programmaufruf 
Aufruf der FIR Assemblerroutine 
__y s_int16 *delayLinePtr = lineInPtr; 
s_int16 *sp = audioOut; 
int i; 
for (i=0; i<BLOCKSIZE; i++) { 
// apply the filter 
FirAsm(sp++,delayLinePtr++); // left channel 
FirAsm(sp++,delayLinePtr++); // right channel 
} 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Filterkoeffizienten berechnen 
Filterkoeffizienten können bequem mit GNU Octave, MATLAB 
oder SciLab berechnet werden 
pkg load all 
Anweisungen für GNU Octave 
fs=48000; 
fsp2=fs/2; 
f1=3100; 
f2=4300; 
deg=62; 
b=firls(deg, [0 f1/fsp2 f2/fsp2 1], [1 1 0 0]); 
Filterkoeffizienten nach der Methode 
der kleinsten Quadrate berechnen 
Normalisierungsfaktor 
Übergangsbereich des Filters 
Ordnung des Filters 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Frequenzen und 
Amplituden sind 
normalisiert 
Samplerate 
Normalisierte Frequenzwerte: 
So umrechnen, dass der Wert 1 der halben 
Abtastrate entspricht (Nyquist-Grenze).
Frequenz- und Phasengang 
Anweisung für GNU Octave 
freqz(b); 
Durchlassbereich 
Übergangsbereich 
Sperrbereich 
Welligkeit 
f 
a 
Tiefpass 
Quizfrage: Frequenz von 0 bis 1? 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Filterkoeffizienten einbauen 
b2=round(b'*32768); 
save 'coeff.txt' b2 
16-Bit-Werte erzeugen 
Anweisungen für GNU Octave 
# Created by Octave 3.6.2, Thu Oct 17 18:27:38 2013 W. Europe Daylight Time 
# name: b2 
# type: matrix 
# rows: 1 
# columns: 63 
63 101 121 113 71 -2 -93 -181 -242 -252 -197 -77 89 268 416 487 446 278... 
_firCoeffs: 
.word 63, 101, 121, 113, 71, -2, -93, -181 
.word -242, -252, -197, -77, 89, 268, 416, 487 
.word 446, 278, -1, -347, -685, -930, -993, -807 
.word -338, 401, 1348, 2397, 3419, 4274, 4842, 5041 
.word 4842, 4274, 3419, 2397, 1348, 401, -338, -807 
.word -993, -930, -685, -347, -1, 278, 446, 487 
.word 416, 268, 89, -77, -197, -252, -242, -181 
.word -93, -2, 71, 113, 121, 101, 63 
Inhalt der Datei 
coeff.txt 
Umgeschrieben für 
Assemblerprogramm 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern
Frequenzweiche 
DSP 
Verstärker 
Verstärker Tieftöner 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Hochtöner 
Audiosignal 
Gestern 
Heute 
Morgen? 
Günther Nubert (Nubert Speaker Factory)
DSP-Board Schaltplan 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Wichtig! 
Tiefpass nicht 
vergessen! 
Serieller 
Speicher
VSDSP Toolchain 
● VSIDE 
– Vollständige Entwicklungs-umgebung 
für VSDSP Signal-prozessoren 
– Unterstützt Debugging auf 
realer Hardware über RS232 
(USB-Bridge) 
● Kommandozeile 
– ANSI-C Compiler, Assembler, 
Linker, Profiler etc. 
● Windows only! 
● Kostenlos 
lcc -g -hhw_desc -O6 -fsmall-code -DDEBUG -DVS1063 -IC:/VSIDE 
optimizing (452): 299 281 274 273.273.271.271.271 
C 271 CF 0 X 6 Y 8198 F 0 
Successfully compiled 2012 lines (244 in source) with 0 warni 
vsa -c hw_desc -D ASM -D VS1063 -I C:/VSIDE/libvs1063 -o Deb 
vslink -k -m user_vs1063-extra.mem C:/VSIDE/libvs1063/rom1063 
coff -L. -LC:/VSIDE/libvs1063 -lc 
vssym -Q Debug/effect.coff 
Debug/effect.coff: 
C 429 CF 0 X 6 Y 8198 F 0 
total code memory size 0x01ad 429 words 
total X memory size 0x0006 6 words 
total Y memory size 0x2006 8198 words 
const_x 0x0006 6 words 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
bss_y 0x2000 8192 words 
const_y 0x0006 6 words SORRY!
Hello World 
main() { 
// show text in console 
puts("Hello, world."); 
// setup button and led 
CONFIGURE_LED_1; 
CONFIGURE_OPTO_1; 
// 
// enter busy loop, detect button press 
// 
while (1) { 
if (OPTO_1_ACTIVE) { 
SET_LED_1_ON; 
} else { 
SET_LED_1_OFF; 
} 
} 
return 0; 
} 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
www.usda.gov/oc/photo/opclibra.htm
Zaubermaschine 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Evan P. Cordes: EP-2
Vielen Dank 
We're cool, right? 
You are allowed to 
applaude by clapping the 
hands or knocking on the 
tables. 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern 
Kibadunno: Mega_awesome_super_cool_amazing_sunglasses
Questions ? 
Thank you for 
your attention. 
Any questions? 
www.twitter.com/egniteEmbedded www.facebook.de/egniteDe 
www.youtube.com/user/egniteGmbH plus.google.com/+EgniteDe 
21.08.2014 HaSi-Talk: Ein DSP kann zaubern

More Related Content

Similar to “Eine CPU kann rechnen, aber ein DSP kann zaubern”

Similar to “Eine CPU kann rechnen, aber ein DSP kann zaubern” (20)

Nanoxx
NanoxxNanoxx
Nanoxx
 
Erste-Hilfekasten für Unicode mit Python
Erste-Hilfekasten für Unicode mit PythonErste-Hilfekasten für Unicode mit Python
Erste-Hilfekasten für Unicode mit Python
 
Grundlagen nmap
Grundlagen nmapGrundlagen nmap
Grundlagen nmap
 
Topfield
TopfieldTopfield
Topfield
 
Nanoxx
NanoxxNanoxx
Nanoxx
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
 
was ist eigentlich entropia?
was ist eigentlich entropia?was ist eigentlich entropia?
was ist eigentlich entropia?
 
CW Contest with N1MM by DK8EY R09 Neanderthal
CW Contest with N1MM by DK8EY R09 NeanderthalCW Contest with N1MM by DK8EY R09 Neanderthal
CW Contest with N1MM by DK8EY R09 Neanderthal
 
Barco NRC & ClickShare: Live Demo
Barco NRC & ClickShare: Live DemoBarco NRC & ClickShare: Live Demo
Barco NRC & ClickShare: Live Demo
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
 
Eycos
EycosEycos
Eycos
 
Pansat
PansatPansat
Pansat
 
Icecrypt
IcecryptIcecrypt
Icecrypt
 
Webinar Serial-over-IP
Webinar Serial-over-IPWebinar Serial-over-IP
Webinar Serial-over-IP
 
Shuttle Neuheiten 2011 (DE)
Shuttle Neuheiten 2011 (DE)Shuttle Neuheiten 2011 (DE)
Shuttle Neuheiten 2011 (DE)
 
Mktech
MktechMktech
Mktech
 
Dev + Ops = Go
Dev + Ops = GoDev + Ops = Go
Dev + Ops = Go
 
CPU Update Juni 2017
CPU Update Juni 2017CPU Update Juni 2017
CPU Update Juni 2017
 
http://kostenlos.metroblog.com/akku_toshiba_satellite_l600d_015s
http://kostenlos.metroblog.com/akku_toshiba_satellite_l600d_015shttp://kostenlos.metroblog.com/akku_toshiba_satellite_l600d_015s
http://kostenlos.metroblog.com/akku_toshiba_satellite_l600d_015s
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
 

More from hybr1s

Asyl und Flüchtlinge in Siegen-Wittgenstein
Asyl und Flüchtlinge in Siegen-WittgensteinAsyl und Flüchtlinge in Siegen-Wittgenstein
Asyl und Flüchtlinge in Siegen-Wittgensteinhybr1s
 
Minimalismus
MinimalismusMinimalismus
Minimalismushybr1s
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injectionhybr1s
 
Hasi-Talk: Blender
Hasi-Talk: BlenderHasi-Talk: Blender
Hasi-Talk: Blenderhybr1s
 
Spacehack
SpacehackSpacehack
Spacehackhybr1s
 
Religion in Computerspielen
Religion in ComputerspielenReligion in Computerspielen
Religion in Computerspielenhybr1s
 
Webvideo Culturers
Webvideo CulturersWebvideo Culturers
Webvideo Culturershybr1s
 
Social Engineering
Social EngineeringSocial Engineering
Social Engineeringhybr1s
 
Batman
BatmanBatman
Batmanhybr1s
 
LilyPond
LilyPondLilyPond
LilyPondhybr1s
 
Disney Prinzessinnen
Disney PrinzessinnenDisney Prinzessinnen
Disney Prinzessinnenhybr1s
 
Isee3 Reboot
Isee3 RebootIsee3 Reboot
Isee3 Reboothybr1s
 
Katastrophenmanagement
KatastrophenmanagementKatastrophenmanagement
Katastrophenmanagementhybr1s
 
Wlan-Sicherheit für Fortgeschrittene
Wlan-Sicherheit für FortgeschritteneWlan-Sicherheit für Fortgeschrittene
Wlan-Sicherheit für Fortgeschrittenehybr1s
 
Lovecraft & Cthulhu
Lovecraft & CthulhuLovecraft & Cthulhu
Lovecraft & Cthulhuhybr1s
 
Hybr1s über "Was ist Wissenschaft?"
Hybr1s über "Was ist Wissenschaft?"Hybr1s über "Was ist Wissenschaft?"
Hybr1s über "Was ist Wissenschaft?"hybr1s
 
Phil Krämer: WLAN #HACKING
Phil Krämer: WLAN #HACKINGPhil Krämer: WLAN #HACKING
Phil Krämer: WLAN #HACKINGhybr1s
 
Gutmensch oder Weltenretter
Gutmensch oder WeltenretterGutmensch oder Weltenretter
Gutmensch oder Weltenretterhybr1s
 
Return oriented programming
Return oriented programmingReturn oriented programming
Return oriented programminghybr1s
 
earthship biotecture
earthship biotectureearthship biotecture
earthship biotecturehybr1s
 

More from hybr1s (20)

Asyl und Flüchtlinge in Siegen-Wittgenstein
Asyl und Flüchtlinge in Siegen-WittgensteinAsyl und Flüchtlinge in Siegen-Wittgenstein
Asyl und Flüchtlinge in Siegen-Wittgenstein
 
Minimalismus
MinimalismusMinimalismus
Minimalismus
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Hasi-Talk: Blender
Hasi-Talk: BlenderHasi-Talk: Blender
Hasi-Talk: Blender
 
Spacehack
SpacehackSpacehack
Spacehack
 
Religion in Computerspielen
Religion in ComputerspielenReligion in Computerspielen
Religion in Computerspielen
 
Webvideo Culturers
Webvideo CulturersWebvideo Culturers
Webvideo Culturers
 
Social Engineering
Social EngineeringSocial Engineering
Social Engineering
 
Batman
BatmanBatman
Batman
 
LilyPond
LilyPondLilyPond
LilyPond
 
Disney Prinzessinnen
Disney PrinzessinnenDisney Prinzessinnen
Disney Prinzessinnen
 
Isee3 Reboot
Isee3 RebootIsee3 Reboot
Isee3 Reboot
 
Katastrophenmanagement
KatastrophenmanagementKatastrophenmanagement
Katastrophenmanagement
 
Wlan-Sicherheit für Fortgeschrittene
Wlan-Sicherheit für FortgeschritteneWlan-Sicherheit für Fortgeschrittene
Wlan-Sicherheit für Fortgeschrittene
 
Lovecraft & Cthulhu
Lovecraft & CthulhuLovecraft & Cthulhu
Lovecraft & Cthulhu
 
Hybr1s über "Was ist Wissenschaft?"
Hybr1s über "Was ist Wissenschaft?"Hybr1s über "Was ist Wissenschaft?"
Hybr1s über "Was ist Wissenschaft?"
 
Phil Krämer: WLAN #HACKING
Phil Krämer: WLAN #HACKINGPhil Krämer: WLAN #HACKING
Phil Krämer: WLAN #HACKING
 
Gutmensch oder Weltenretter
Gutmensch oder WeltenretterGutmensch oder Weltenretter
Gutmensch oder Weltenretter
 
Return oriented programming
Return oriented programmingReturn oriented programming
Return oriented programming
 
earthship biotecture
earthship biotectureearthship biotecture
earthship biotecture
 

“Eine CPU kann rechnen, aber ein DSP kann zaubern”

  • 1. Eine CPU kann rechnen, aber ein DSP kann zaubern Harald Kipp HaSi-Talk am 21.08.2014 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 2. Wer ist der Typ da vorne? Harald Kipp Geschäftsführer der egnite GmbH ● Entwicklung, Produktion und Vertrieb von Mikrocontroller Boards ● Distribution von Ethernet-Sensoren, Audio-Codecs etc. ● www.egnite.de Gründer und Admin des Ethernut Projekts ● Open Source Hardware und Software ● www.ethernut.de 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 3. Wer sitzt im Publikum? ● Hardwarekenntnisse – Erfahrung mit Spannung und Strom – Allgemeine Struktur einer CPU ist bekannt (Register, Bus) ● Softwarekenntnisse – Erste Erfahrungen mit C-Programmierung – Erste Erfahrungen mit Assemblerprogrammierung ● Mathematikkenntnisse – Grundrechenarten – Lesen von Diagrammen 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 4. Worum es geht hier eigentlich? 21.08.2014 HaSi-Talk: Ein DSP kann zaubern D igitaler S ignal- P rozessor Eine CPU kann rechnen, aber ein DSP kann zaubern – Signalverarbeitung im Schnelldurchgang (0:10) – Nachteile von universellen Prozessoren (0:05) – Hacking eines MP3-Decoders (0:15) – Kurze Pause (0:05) – Anleitung zum Bau eines Filters (0:15) – Demonstration eines Audioeffekts (0:10)
  • 5. Signal Ein Signal ist eine sich kontinuierlich ändernde physikalische Größe, die Information enthält. Gesäusel (Luftdruck ändert sich kontinuierlich) Telefondraht (Elektrische Spannung ändert sich Bundesarchiv, Bild 183-57339-0018 Mr. Dagger Complex kontinuierlich) „prüft“ kontinuierlich 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 6. Verstärken ● Ein elektrisches Signal wird verstärkt, um es über eine große Entfernung übertragen zu können. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Graphics made by SciLab
  • 7. Modulieren ● Das Signal wird auf einen Träger aufmoduliert. Signal Träger Modulierter Träger 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 8. Mischen und Filtern ● Modulierte Trägerwel-len zusammenfassen um mehrere Signale über eine Leitung zu transportieren. ● Am Leitungsende ein-zelne Träger durch Filter trennen und das Ursprungssignal mit Demodulator zurück-gewinnen. ● Das ist Signalverarbei-tung. Signal 1 Träger 1 AM 1 Signal 2 Träger 2 21.08.2014 HaSi-Talk: Ein DSP kann zaubern AM 2 Summe
  • 9. Analog und digital ● Analog – Kontinuierliche Funktionen – Realisierung mit Hardware ● Digital – Diskrete Werte – Realisierung überwiegend in Software 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Roger McLassus Creative Commons Attribution-Share Alike 3.0 Unported
  • 10. Digitalisierung Durch Digitalisierung erhält man zu konkreten Zeiten konkrete Werte 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 11. Mathematische Methoden Hardware Mathematik Verstärken UOUT = 2 * UIN Modulieren UOUT = US * UT Summieren UOUT = U1IN + U2IN + ... Filtern UOUT = Σ coeff[i] * UIN[n-i] 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 12. Anforderungen an digitale Signalverarbeitung ● Kontinuierliche Verarbeitung von Datenströmen... – Hauptsächlich Multiplikation und Addition von Vektoren – Behandlung von Überläufen ● ...in Echtzeit – Effektive Speicherzugriffe – Effektive Schleifen 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 13. Programmschleifen Compiler C-Programm Assemblerprogramm /* Verstärker */ for (i = 0; i < 100; i++) { u_out[i] = u_in[i] * amp; } ● Universeller Prozessor – Die meisten Befehle werden für die Schleifensteuerung benötigt – Daher hohe Taktrate für Echtzeitverarbeitung erforderlich – Viele MIPS, wenig GRIPS LDI R1, 0 LDI R2, 100 LD R3, AMP LOOP: CMP R1, R2 JGE END LDX R4, U_IN, [R1] MUL R4, R3 STX R4, U_OUT, [R1] INC R1 JMP LOOP END: 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 14. Kontinuierliche Multiplikation und Addition ● Filter sind die typische Anwendung bei der digitalen Signalverarbeitung z.B. C-Programm /* Filter */ for (k = 0; k <= bufsiz; k++) { for (i = 0; i <= m; i++) { y[k] = y[k] + h[i] * u[k - i]; } } Schleifen sind nicht gut für universelle CPUs. Viel Rechnerei, aber es kommt noch dicker. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 15. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Überlauf Alarm Sättigungsarithmetik Beispiel: Zweifache Verstärkung von 128V am Eingang und maximal 255V Ausgangsspannung (Wertebereich) Hardware: 128V * 2 = 255V 8-Bit Software: 128V * 2 = 0V /* Handle overflow using 16-bit math */ u_out[i] = u_in[i] * 2; if (u_out[i] > 255) u_out[i] = 255; Einfache Lösung funktioniert mit Einschränkungen. Vorzeichen? Nachkommastellen?
  • 16. Überlauf anschaulich gemacht A + B = Sättigungsarithmetik 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Standardarithmetik ● Bildhelligkeit erhöhen Original + Offset Screenshot of Blender 2.41
  • 17. Aktueller Leistungsvergleich ● High-End DSPs ● High-End PC Texas Instruments C6000 32-Bit CPU 1,2Ghz Taktfrequenz 8MB 2nd-Level Cache Optionale Fließkomma-Einheit Analog Devices SHARC / (Blackfin) 400MHz Taktfrequenz Offizielle GNU Toolchain (für Blackfin) Intel Haswell 64-Bit CPU mit FPU 3,9Ghz Taktfrequenz (Turbo) 84 Watt Und was ist mit Cortex-M4? Freescale StarCore Multi-Core 1Ghz Taktfrequenz Theodor Fontane schreibt: Ein fester Kessel, ein doppelter Dampf, die bleiben Sieger in solchem Kampf. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 18. Historischer Leistungsvergleich 1995 ● WinPlay3, der erste real-time MP3-Decoder für PCs, benötigte ● 32-Bit 468DX2 66MHz ● FPU ● 8kB Cache ● 6W Stromverbrauch (nur CPU) 1999 ● Single-Chip MP3 De-coder 21.08.2014 HaSi-Talk: Ein DSP kann zaubern auf DSP-Basis benötigte ● 16-Bit mit 25MHz ● Keine FPU ● Kein Cache ● 50mW Stromver-brauch (CPU ohne Analogteil)
  • 19. MP3 Hardware-Decoder Moderne Miniatur-Audioplayer – z.B. mit VS10XX von VLSI Solution Oy USB-Schnittstelle 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Bist du meine Mami? GPIO-Taster DSP-Chip Streichholz? Audio-Ausgang Serielles Flash Steckergehäuse! Directmedia DVD-ROM 10.000 Meisterwerke der Malerei
  • 20. Audiocodec-Architektur Theorie... ...und Praxis ADC DSP DAC 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Wichtig! 2 Busse! Programmier-schnittstelle Analogsignal Analogsignal
  • 21. VSDSP4 Register ● Spezialregister – Programmzähler PC – 2 Page Register IPR0 und IPR1 – IPR0 wird beim Interrupt nach IPR1 kopiert – 32-Bit Produktregister P – 3 16-Bit Loop Register LS, LC und LE – 2 16-Bit Link Register LR0 und LR1 – LR0 für Unterprogramme – LR1 für Interrupts – Pseudoregister NULL (alle Bits 0) und ONES (alle Bits 1) – 16-Bit Mode Register MR0 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 22. Pipeline * * AND A0,A0,A0 NOP JZS OUT NOP * * Takt Laden Dekodieren Ausführen Ergebnis 1 AND * * 2 NOP AND * 3 JZS NOP AND Z-Flag gesetzt 4 NOP JZS NOP 5 ? NOP JZS Sprung ausgeführt ● Nach einer arithmetischen Operation können die Flags erst nach einem Delay als Sprungentscheidung verwendet werden. ● Sprünge werden mit einem Delay ausgeführt. ● Statt NOP können wir etwas sinnvolleres tun. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 23. Pipeline Beispiel Auswirkungen der Pipeline sind verwirrend und erfordern Kreativität. ldx (i0),b0 add c0,b0,b0 and a0,a0,a0 nop jzs out nop and a0,a0,a0 ldx (i0),b0 jzs out add c0,b0,b0 Delay Slots ausnutzen Modifiziert die Flags. Darf keine Operation sein, die das Z-Flag wieder verändern könnte. Sprung kann jetzt entschieden werden. Da auch der Sprung einen Delay hat, wird dieser Befehl immer ausgeführt. Hier dürfen die Flags wieder modifiziert werden. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 24. Das blanke Entsetzen Das war eine abschreckende Eigenschaft. Jetzt kommen die Bonbons ...endlich! Charles Darwin's The Expression of the Emotions in Man and Animals 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 25. MAC ● MAC ist eine Abkürzung für Multiply and Accumulate – Eigentliche Reihenfolge: Erst ADD, dann MUL ● Mächtiges Kommando für Filter-Implementierung c += a[i] * b[n-i] DSP PC 21.08.2014 HaSi-Talk: Ein DSP kann zaubern c += p; p = a0*b0; mac a0,b0,c 1 Takt Viele Takte
  • 26. Schleifen LOOP A1,LOOPEND-1 NOP LOOPSTART: * LOOPEND: * ● LOOP-Befehl Reg. Inhalt LS Startadresse der Schleife LC Schleifenzähler LE Endadresse der Schleife – Kopiere PC+1 nach LS – Kopiere Register in Parameter 1 nach LC – Kopiere Adresse in Parameter 2 nach LE ● Bearbeite Befehle bis PC gleich LE, dann – Prüfe, ob LC gleich Null – Wenn ungleich Null, dekrementiere LC um 1 und kopiere LS nach PC 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 27. Modulo Adressierung ● Implementierung von Ringpuffern – 0x8000: I1 wird jeweils um 1 inkrementiert und nach 47 wieder auf 0 gesetzt – 0xA000: I1 wird jeweils um 1 dekrementiert und nach 0 wieder auf 47 gesetzt – Puffer muss auf Adresse liegen, die durch nächsthöhere Zweierpotenz der Pufferlänge teilbar ist. Bei einer Pufferlänge von 48 muss der Puffer also an einer Adresse liegen, die durch 64 teilbar ist. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern ldc 0x8000+(48-1),i0 ldx (i1)*,a0 ldc 0xA000+(48-1),i0 ldx (i1)*,a0
  • 28. Parallele Verarbeitung ● Viele Operationen können parallel ausgeführt werden – Arithmetische Operation, z.B. macss a0,a1,d – Zugriff auf X-Memory, z.B. ldx (i0)*,a0 – Zugriff auf Y-Memory, z.B. ldy (i2)*,a1 – Loop and a0,null,a0 mulss a0,a0 loop a1,END-1 and d,null,d; ldx (i1)*,a0; ldy (i2)*,a1 mac a0,a1,d; ldx (i1)*,a0; ldy (i2)*,a1 END: 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Initialisierung Schleife (1 Taktzyklus) Realisierung eines Filters: f a Tiefpass
  • 29. Intentionally blank slide 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 30. Tiefpass Assemblerroutine Reale Implementierung der FIR Assemblerroutine Finite Impulse Response Filter mit endlicher Impulsantwort //void FirAsm(register __i0 s_int16 *d, __y register __i2 s_int16 *s); .sect code, FirAsm .export _FirAsm _FirAsm: // Store register values stx i1, (i6)+1 stx i3, (i6); sty ls, (i6)+1 stx le, (i6); sty lc, (i6)+1 stx a0, (i6); sty a1, (i6)+1 stx b0, (i6); sty b1, (i6) Filterkoeffiziententabelle bestimmt die Filterfunktion ldc MAKEMOD64(-2,LINE_IN_BUF_LEN), i3 //-2 step mv i0, i5 ldc _firCoeffs, i0 // coefficient vector ldc 1, i1 // linear forwards +1 (No modulo) ldc 0x0000, mr0 // fract mode and a,NULL,a; ldx (i0)*,b1; ldy (i2)*,b0 // clear a-reg., load first coef./sample -pair ldc FIR_LEN-2, lc // loop count 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 31. Tiefpass Assemblerroutine loop lc, firloop1end-1 // start looping // Delay slot, perform first multiply, load next coef./sample -pair mul b1, b0; ldx (i0)*,b1; ldy (i2)*,b0 firloop1: mac b1, b0, a; ldx (i0)*,b1; ldy (i2)*,b0 // use pipelined MAC to implement FIR firloop1end: add a, p, a ldc FIR_SCALE, b0 ashl a, b0, a rnd a, a1 stx a1, (i5) // Restore registers ldx (i6), b0; ldy (i6)-1, b1 ldx (i6), a0; ldy (i6)-1, a1 ldx (i6), le; ldy (i6)-1, lc ldx (i6), i3; ldy (i6)-1, ls ldx (i6)-1, i1 jr ldc 0x200, mr0 // Delay slot, restore integer mode 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 32. Tiefpass C-Programmaufruf Aufruf der FIR Assemblerroutine __y s_int16 *delayLinePtr = lineInPtr; s_int16 *sp = audioOut; int i; for (i=0; i<BLOCKSIZE; i++) { // apply the filter FirAsm(sp++,delayLinePtr++); // left channel FirAsm(sp++,delayLinePtr++); // right channel } 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 33. Filterkoeffizienten berechnen Filterkoeffizienten können bequem mit GNU Octave, MATLAB oder SciLab berechnet werden pkg load all Anweisungen für GNU Octave fs=48000; fsp2=fs/2; f1=3100; f2=4300; deg=62; b=firls(deg, [0 f1/fsp2 f2/fsp2 1], [1 1 0 0]); Filterkoeffizienten nach der Methode der kleinsten Quadrate berechnen Normalisierungsfaktor Übergangsbereich des Filters Ordnung des Filters 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Frequenzen und Amplituden sind normalisiert Samplerate Normalisierte Frequenzwerte: So umrechnen, dass der Wert 1 der halben Abtastrate entspricht (Nyquist-Grenze).
  • 34. Frequenz- und Phasengang Anweisung für GNU Octave freqz(b); Durchlassbereich Übergangsbereich Sperrbereich Welligkeit f a Tiefpass Quizfrage: Frequenz von 0 bis 1? 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 35. Filterkoeffizienten einbauen b2=round(b'*32768); save 'coeff.txt' b2 16-Bit-Werte erzeugen Anweisungen für GNU Octave # Created by Octave 3.6.2, Thu Oct 17 18:27:38 2013 W. Europe Daylight Time # name: b2 # type: matrix # rows: 1 # columns: 63 63 101 121 113 71 -2 -93 -181 -242 -252 -197 -77 89 268 416 487 446 278... _firCoeffs: .word 63, 101, 121, 113, 71, -2, -93, -181 .word -242, -252, -197, -77, 89, 268, 416, 487 .word 446, 278, -1, -347, -685, -930, -993, -807 .word -338, 401, 1348, 2397, 3419, 4274, 4842, 5041 .word 4842, 4274, 3419, 2397, 1348, 401, -338, -807 .word -993, -930, -685, -347, -1, 278, 446, 487 .word 416, 268, 89, -77, -197, -252, -242, -181 .word -93, -2, 71, 113, 121, 101, 63 Inhalt der Datei coeff.txt Umgeschrieben für Assemblerprogramm 21.08.2014 HaSi-Talk: Ein DSP kann zaubern
  • 36. Frequenzweiche DSP Verstärker Verstärker Tieftöner 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Hochtöner Audiosignal Gestern Heute Morgen? Günther Nubert (Nubert Speaker Factory)
  • 37. DSP-Board Schaltplan 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Wichtig! Tiefpass nicht vergessen! Serieller Speicher
  • 38. VSDSP Toolchain ● VSIDE – Vollständige Entwicklungs-umgebung für VSDSP Signal-prozessoren – Unterstützt Debugging auf realer Hardware über RS232 (USB-Bridge) ● Kommandozeile – ANSI-C Compiler, Assembler, Linker, Profiler etc. ● Windows only! ● Kostenlos lcc -g -hhw_desc -O6 -fsmall-code -DDEBUG -DVS1063 -IC:/VSIDE optimizing (452): 299 281 274 273.273.271.271.271 C 271 CF 0 X 6 Y 8198 F 0 Successfully compiled 2012 lines (244 in source) with 0 warni vsa -c hw_desc -D ASM -D VS1063 -I C:/VSIDE/libvs1063 -o Deb vslink -k -m user_vs1063-extra.mem C:/VSIDE/libvs1063/rom1063 coff -L. -LC:/VSIDE/libvs1063 -lc vssym -Q Debug/effect.coff Debug/effect.coff: C 429 CF 0 X 6 Y 8198 F 0 total code memory size 0x01ad 429 words total X memory size 0x0006 6 words total Y memory size 0x2006 8198 words const_x 0x0006 6 words 21.08.2014 HaSi-Talk: Ein DSP kann zaubern bss_y 0x2000 8192 words const_y 0x0006 6 words SORRY!
  • 39. Hello World main() { // show text in console puts("Hello, world."); // setup button and led CONFIGURE_LED_1; CONFIGURE_OPTO_1; // // enter busy loop, detect button press // while (1) { if (OPTO_1_ACTIVE) { SET_LED_1_ON; } else { SET_LED_1_OFF; } } return 0; } 21.08.2014 HaSi-Talk: Ein DSP kann zaubern www.usda.gov/oc/photo/opclibra.htm
  • 40. Zaubermaschine 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Evan P. Cordes: EP-2
  • 41. Vielen Dank We're cool, right? You are allowed to applaude by clapping the hands or knocking on the tables. 21.08.2014 HaSi-Talk: Ein DSP kann zaubern Kibadunno: Mega_awesome_super_cool_amazing_sunglasses
  • 42. Questions ? Thank you for your attention. Any questions? www.twitter.com/egniteEmbedded www.facebook.de/egniteDe www.youtube.com/user/egniteGmbH plus.google.com/+EgniteDe 21.08.2014 HaSi-Talk: Ein DSP kann zaubern