Autor: katrin
Flash Speicherung
Funktionsweise
Jedes Bit wird in eine Speicherzelle (FET) gespeichert. Im Gegensatz zum FPGA ist diese Speicherzelle nicht flüchtig.
Ansteuerung
Wie bei RAMs: über eine Matrixordnung. Es wird Zeilenweise oder in ganzen Sektoren gespeichert. Jede Zeile entspricht einem Word einer bestimmten Bit-Länge.
Man spricht FLASH Speicher selten direkt an, sondern nutzt Schnittstellen.
Im Embedded Bereich
Brauchen einen externen Speicherplatz zum Speichern von Daten oder zum Booten des Betriebssystems und der Applikationen. Flash-Speicher werden ROMs vorgezogen, da man diese auswechseln kann. Dadurch ist ein Update der Firmware möglich, was beim ROM nicht der Fall ist. Eine SD-Karte (ebd. ein Flash Speicher) ist eine Alternative zu Flash-ICs.
Spezialitäten
– sind langsam
– können auch als HD-Ersatz genommen werde
– EEPROMs sind die bekanntesten Flash Speicher
– Jeder USB-Stick hat einen Flash-Speicher und einen Microkontroller
SD Karten
Als externer Speicherplatz kann eine SD (Secure Digital Memory) Karte genommen werden. Es gibt die Mini- und Micro-Ausführung.
Spezialitäten
– Ihr Speicherprinzip ist die Flash-Speicherung.
– Speicherbereich kann partitioniert werden:
In einem Teil liegt ein System-Image, im anderen Teil das File Sytem
– besitzt einen internen Controller
– 9 Kommunikationspins
– SD-Karten mit integriertem WLAN oder GPS
– SD-Karte mit USB-Stecker Typ A (normaler Stecker) zum Anschliessen
In Enbedded Systemen
Das Betriebssystem und die Applikatins Software wird meist in Flash Speichern abgelegt und von dort gebootet. Man kann aber auch eine genug grosse SD-Karte zum Booten des Systems nehmen.
Kommunikation
Die Kommunikation basiert auf dem SPI-Prinzip.
– Initialisierungssequenz:
Schützt vor unberechtigtem Zugriff auf die Daten
– Pin 1: Kartenerkennung (Dateinleitung 3)
– Pin 2: Kommandos (Befehl/Antwort)
– Pin 3/6: GND
– Pin 4: VCC
– Pin 5: CLK
– Pin 7/8/9: Data (Datenleitung 0, 1, 2)
wx Hex Editor
Dieser Hex-Editor zeichnet sich über mächtige Speicheroptionen aus:
- Die Hexwerte können mit Speicheroffset gespeichert werden
- Hexwerte können mit ASCII-Interpretation gespeichert werden
- Hexwerte können als C-Array mit einer wählbaren Datengrösse (int8_t, int16_t, int32_t, ..) gespeichert werden
Dies erleichtert die Weiterverarbeitung der eingelesenen Daten.
Debuggen von Speicher
Der Inhalt des Speichers (z.B.) eines Arrays muss in ein File kopiert werden. Das File wird eingelesen.
Im Menu können unter VIEW unterschiedliche Fenster (Pannel genannt) aktiviert werden.
Linke Fenster
Zeigt die selektierten Daten in unterschiedlichen Formaten an (Pannel Dateninterpreter) und in der Mitte das Infopannel.
Hauptfenster oben
Mehrere Files können parallel angezeigt werden.
Hauptfenster unten
Ist die Ascii Interpretation des Inhalts. Das Pannel wird TextControl genannt.
DDD Data Debugging (GNU)
swift introduction
Implizite Typzuweisung
Der Datentyp muss nicht angegeben werden. Vor dem Variablenname definiert man nur, ob es sich um eine Konstante let oder eine Variable var handelt.
let length_box = 5 // wird zu int let hight_box = 3.5 // wird zu float let projectname = "ImageRecover" // wird zu string var number = 2 var isPressed = true // bool
Konstanten sind Variablen vorzuziehen. let area = Squar(length:5)
Explizite Typzuweisung
Nach dem Variablenname kann über : den Datentyp definiert werden.
var number: Int16 = 2 // Integer definieren let matrix:[Int16]
Nullpointer
var device: MTLDevice!; //Typ ist MTLDevice mit Nullpointer
Ausführen nur bei Objekten mit Inhalt
Sind Variablen, Funktionen oder Klassen mit ? definiert, wird der Code nur ausgeführt (bzw. ein Wert zugewiesen), wenn das Objekt einen Wert enthält.
var answer: String? // answer erhält Wert nur, wenn String Inhalt hat var error: NSError? var age: Int? // variable hat initalwert.
if answer { //answer ! nil
. // do
}
if age { // nur wenn age einen Wert hat
. // do
}
swift Vererbung über Delegierte
Zwei Dateien
Proj_Bauteil_Funktion.swift
Proj_Bauteil_FunktionDelegate.swift
Inhalt DateiDelegate.swift
import Bibliothek
protocol Proj_Bauteil_FunktionDelegate {
. func name(<var>:<Type>!)
}
Ähnlich zum Header gibt sie das an, was importiert wird.
Bezug auf Vererbung in der Hauptdatei
class xy {
. // Deklarationen
. var delegate: Proj_Bauteil_FunktionDelegate?
.
. // Funktionen
. func tcpSocket( <argument>) {
. // Code
. delegate?.receiveAck(data)
}
Die vererbte Variable wird mit einem ? definiert und immer mit einem ? aufgerufen.
Was bedeutet das ! ?
Vermutung: Die Eltern erhalten dieses Zeichen.
Steuerung Audio Codec
Überblick der Funkionen
Der Audio Codec gibt die Audiodaten aus. Zudem verwaltet er alle Audio-Pfäde auf dem Board. Er definiert, ob der Analoge Input aktiv oder der Digitale Input übergangen wird. Alle Einstellungen stehen in seinen Registern.
Bidirektionale Konfiguration des Audio Codec IO-Bauteilen
Die Einstellungen des Audio Codecs erfolgen über Register. Damit die Register gesetzt werden können, wird mit I2C auf die Codecregister zugegriffen.Insgesamt bestehen 11 Register mit je 16 Bits.
Einerseits werden über den Codec Kontroller die Konfigurationen gesetzt, anderseits setzt der Audio Codec die Pfade aktiv oder nicht. Die Kommunikation ist bidirektional: in beide Richtungen.
Audio Codec mit Audio-Daten speisen
Die konkrete Musikdatei wird über I2S dem Codec übermittelt und dann an den entsprechenden Ausgang geleitet.
Makefile
# the compiler: gcc for C program, define as g++ for C++
CC = gcc
# compiler flags:
# -g adds debugging information to the executable file
# -Wall turns on most, but not all, compiler warnings
CFLAGS = -g -Wall
# the build target executable:
TARGET = myprog
all: $(TARGET)
$(TARGET): $(TARGET).c
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
clean:
$(RM) $(TARGET)
Makefiles kann man mit Cmake automatisch generieren lassen.
self in Klassen [aus: swift]
Die Variable self wird nur gebraucht, wenn das Argument einer Funktion denselben Namen hat wie eine Klassenvariable.
Mit self.variable wird die Klassenvariable bezeichnet bzw. unterschieden von dem Argument.
class TipCalculator {
let total: Double
let taxPct: Double
let subtotal: Double
init(total: Double; taxPct: Double) {
self.total = total // Argumente erhalten
self.taxPct = taxPct
subtotal = total /(taxPct+1) // keine Argumente
// nur Klassenvariable
}
}
aus: Swift 2 Tutorial



