v11.07.12_cbs/kf / folie 1 embedded systems hardware unter linux mit dem foxboardg20 steuern -...
TRANSCRIPT
V11.07.12_cbs/kf / Folie 1
Embedded SystemsHardware unter Linux mit dem FoxboardG20steuern
- Digitale Signale- Analoge Signale
Autor: StD Michael Kaufmann
V11.07.12_cbs/kf / Folie 2
Foxboard G20 im Internet
• Wichtige Web-Seiten:foxg20.acmesystems.iteshop.acmesystems.it/?id=FOXG20elmicro.com/de/foxboard.html (Zur Zeit nicht)
• Zugriff auf das Foxboard zum Üben cbs.selfhost.me im Raum R411 (CBS)k49.selfhost.me nur nach Absprache
Herrn Jan Arnold hat mich bei der Erstellung des Scripts enorm unterstützt. Dafür möchte ich
mich sehr herzlich bedanken.
V11.07.12_cbs/kf / Folie 3
Erste Techniker Arbeit (2006): WBOT mit dem FoxboardLX16
• Kettenfahrzeugmit Schrittmotoren
• Router mit 4 Ports und WLAN
• Foxboard LX16
• IP-WebCAM
• 12 Volt Akku
• 2 LED-Leuchten
V11.07.12_cbs/kf / Folie 4
Zweite Techniker-Arbeit: EIB-Haus
Client-Rechnermit Browser
Internet
oder
LAN Router mit Switch
http://miniweb.cbs-heidelberg.de
V11.07.12_cbs/kf / Folie 5
Software-Feature des Foxboard G20
• Einfache Installation von Applikationen durch die Verwendung des Atmel-Controllers aus der ARM9-Serie und einem frei wählbaren Linux-Betriebssystem Linux Distributionen: Debian, Gentoo, OpenWRT, OpenEmbedded
• Internetdienste: Web-Server, FTP-Server, Gateways, etc.
• Volle Unterstützung von vielen Programmiersprachen: C, C++, Python, Perl, Java, PHP, Basic, Fortran, etc
V11.07.12_cbs/kf / Folie 6
Hardware-Features FoxboardG20• Netus G20 mit 400MHz Atmel Mikrocontroller AT91SAM9G20• 2 USB 2.0 host ports (12 MBits per second)• One Ethernet 10/100 MBit/s port • One USB device port (12 MBits per second)• One debug serial port (3.3V); (RS232, V24, COM1, S0)• 2 serial ports (3.3V); (RS232, V24, COM1, S0)• On-board microSD socket (up to 16GB)• Real Time Clock (RTC) with on-board lithium backup battery• GPIO lines (3.3V oder 1.8V)• 4 A/D converter lines (10-Bit Auflösung)• I2C-Bus und SPI-Bus• 5V DC power supply; stabilisiert ist wichtig• durchschnittliche Leistungsaufnahme: 0,4 Watt (80 mA bei 5V) ohne microSD, ethernet link, USB devices oder andere Peripherie. • Temperatur-Bereich: von -15°C bis +70°C
V11.07.12_cbs/kf / Folie 7
Die Platine
V11.07.12_cbs/kf / Folie 8
RS232-Adapter für den S0-Debug-Port
Über die serielle Schnittstelledes Foxboard (Debug-Port)und des PC (COMx) und einem Terminalprogramm (Hyperterminal oder Putty) wird der PC zum Terminal
für das Foxboard. Der gesamte Bootvorgang kann verfolgt werden.
V11.07.12_cbs/kf / Folie 9
Vorbereitungen am PC• Das Programm Putty ist notwendig, um auf das Linux-
Betriebssystem des Foxboard zuzugreifen.– Download : http://www.putty.nl/download.html– Putty ist im NAL unter Betriebssysteme vorhanden.
• Putty starten und konfigurieren (siehe nächste Folie).• An den RS232-Adapter des Foxboards ein 9 poligen 1:1
Sub-D-Kabel sehr vorsichtig anschließen und mit der COM-Schnittstelle des PCs oder einem RS232-USB-Adapter verbinden.
• Foxboard an eine stabilisierte 5V-Spannungsversorgung anschließen. – Wenn an den USB-Schnittstellen des Foxboards keine zusätzlichen USB-
Geräte angeschlossen sind, kann das Foxboard auch über die 5V einer USB-Schnittstelle des PCs versorgt werden.
V11.07.12_cbs/kf / Folie 10
RS232-Einstellungen bei PuttyPutty für serielle COM-Schnittstelle konfigurieren:• COMx-Schnittstelle im Gerätemanager feststellen, wichtig bei USB-RS232-Adapter
• Einstellungen vornehmen:Serial line: COMxSpeed: 115200
• Bei Category - Serial kontrollieren:
V11.07.12_cbs/kf / Folie 11
Foxboard starten und beenden
• Warten bis login: erscheint.• Eingabe bei login: root • Eingabe bei Password: cbsg20• reboot fährt das Linuxbetriebssystem herunter
und startet es neu.• init 0 oder halt fährt das Linuxsystem herunter.
Kann nur durch Trennung der Spannung neu gestartet werden.
Sobald das Foxboard mit 5V versorgt wird, startet Linux.
Bevor das Foxboard G20 von der Spannungsversorgung getrennt wird, muss das Linuxbetriebssystem unbedingt
heruntergefahren werden bis zur Meldung: Power down
V11.07.12_cbs/kf / Folie 12
Übung 1• Foxboard über RS232-Schnittstelle mit einem 9 poligen 1:1 Sub-
D Kabel vorsichtig mit der COMx-PC-Schnittstelle verbinden.• Wenn ein USB-RS232-Adapter notwendig ist, im Gerätemanager
die COMx-Nummer nachschauen. • Putty konfigurieren.• Foxboard an 5V anschließen und Startvorgang beobachten.• In das Linux-Betriebssystem einloggen.
– User: root / Passwort: cbsg20
• Mit dem Linuxbefehl reboot das Betriebssystem neu starten. Startvorgang beobachten.
• Wieder einloggen und die Zeit zwischen Befehl halt und der Meldung Power down stoppen und aufschreiben.– Mit init 0 oder halt das Betriebssystem herunterfahren.– Warten bis die Meldung Power down erscheint.– Jetzt erst die Stromversorgung trennen.
V11.07.12_cbs/kf / Folie 13
Netzwerkzugriff auf das Foxboard mit TCP/IP• Beim TCP/IP-Protokoll kann eine IP-Adresse fest
vorgegeben oder durch einen DHCP-Dienst dynamisch zugewiesen werden.
• Fragen bei der Vergabe der IP-Adresse:– Dynamische IP
• Ist ein DHCP-Server aktiv.• Welche IP-Adresse ist vergeben worden.
– Feste (statische) IP• Ist die fest vergebene IP im bestehenden Netzwerk ansprechbar.• Wie kann man die feste IP herausfinden, ändern.
• IP-Begriffe: Netzwerk-Adresse, Subnetmask, Gateway• Für das R411-Intranet gilt für die IP-Vergabe :
Netzwerk-Adresse (IP): 10.1.0.0 Subnetmask: 255.255.0.0Gateway-IP: 10.1.1.32 (Server mit Routerfunktion)
V11.07.12_cbs/kf / Folie 14
IP-Konfiguration bei eth0 (Patchkabel)• eth0 steht für den Ethernet-Netzwerkadapter mit der
Rj45-Buchse und dem Patchkabel.• Im Verzeichnis /etc/network ist die Datei interfaces.
In dieser Datei wird die IP-Konfiguration festgelegt.• Eintrag für statische Zuweisung der IP-Adresse für das
Foxboard x (x steht für 1 bis 9): auto eth0# dynamic IP#iface eth0 inet dhcp
# static IPiface eth0 inet staticaddress 10.1.9.xnetmask 255.255.0.0gateway 10.1.1.32
# (Rauten) sind Kommentare.
Wichtig: Auf die Rauten unter der Zeile dynamic IP achten.
Die Rauten unter der Zeile static IP müssen entfernt werden.
V11.07.12_cbs/kf / Folie 15
IP-Konfiguration bei WLAN-Dongel• Wegen der WLAN-Verschlüsselung müssen noch die Accesspoint-
Daten angegeben werden.
Inhalt von wpa_supplicant:ctrl_interface=/var/run/wpa_supplicantnetwork={ ssid=”meine SSID“ psk=”mein Schluessel“}
Inhalt von /etc/network/interfaces: auto wlan0# dynamic IP#iface wlan0 inet dhcp# static IPiface wlan0 inet static address 10.1.9.x netmask 255.255.0.0 gateway 10.1.1.32
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
V11.07.12_cbs/kf / Folie 16
Übung 2a• In das Linuxsystem über die serielle Schnittstelle einloggen.
• IP-Adresse mit dem Linuxbefehl ifconfig feststellen.
• Mit dem Befehl cat /etc/network/interfaces die IP-Konfiguration anschauen.– cat der cat-Aufruf ist für die Ausgabe einer Textdatei
(mit Strg C kann cat bei Fehleingabe abgebrochen werden)
– /etc/network/ Pfad (Ordner), in der sich die Datei interfaces befindet
• Wie ist die IP-Konfiguration eingestellt?
– dynamisch
– statisch
• Was müssten Sie tun, um auf die andere IP-Vergabe umzustellen:________________________________________________________________________________________
V11.07.12_cbs/kf / Folie 17
Übung 2b: Foxboard mit dem Netzwerk verbinden
• Gesamte IP-Konfiguration unter Linux anschauen:– ifconfig eingeben, um aktuelle IP-Konfiguration zu erfahren. – Browsertest: Im Browser 10.1.9.x eingeben.
• IP-Adresse für die Sitzung ändern, zum Beispiel:ifconfig wlan0 10.1.9.1x (x ist Nummer des Foxboards)– Die Änderung wird nicht gespeichert.– Die Änderung ist nur während der Sitzung aktiv. – Browsertest: Im Browser 10.1.9.1x eingeben.– Kontrollieren Sie dies durch Eingabe reboot.
• In einem Netzwerk darf eine IP-Adresse nie doppelt vergeben werden.
V11.07.12_cbs/kf / Folie 18
SSH-Verbindung mit Putty einrichten• Zugriff auf das Foxboard:
– Putty mit SSH starten.SSH: Secure Shell (verschlüsselte Verbindung).
– IP eingeben und mitReturn bestätigen.
– Login-Name: root– Password: cbsg20– Linux beenden: halt– Nur Putty beenden: exit
• Alle Linux-Zugriffe werden unter Putty_SSH durchgeführt. Der Zugriff über die COM-Schnittstelle wird nur noch bei Fehlern während des Bootens benötigt.
• Das Standard-Programm Telnet ist unverschlüsselt.
V11.07.12_cbs/kf / Folie 19
Übung 3• Serielles Kabel und Patchkabel anschließen. • Mit Putty_Serial in das Linux-Betriebssystem einloggen. • IP-Adresse mit dem Linuxbefehl ifconfig feststellen.• Putty für SSH starten, IP eingeben und ins Foxboard einloggen.• IP-Adresse für die Sitzung mit Putty ändern, zum Beispiel:
ifconfig wlan0 10.1.9.1x (x ist Nummer des Foxboards)– Bei Putty_SSH den Befehl ifconfig eingeben. Was passiert?– Mit Putty_SSH mit der neuen IP einloggen.– ifconfig eingeben und IP merken, danach reboot eingeben und
nach dem Neustart IP-Adresse kontrollieren. Welche IP ist aktiv: _______________________
• Putty_SSH starten, IP eingeben und ins Foxboard einloggen.• Linux mit reboot neu booten und Ausgabe bei Putty_Serial und
Putty_SSH beobachten. • Danach den Ablauf mit dem Befehl halt beobachten.
V11.07.12_cbs/kf / Folie 20
Übung 4• Loggen Sie sich mit Putty in andere Foxboards im Intranet des
R411 ein. Öffnen sie gleichzeitig mehrere Sitzungen.
• Mit Putty über das Internet einloggen:
– Pinguin-Foxboard mit cbs.selfhost.me – Siedelsbrunn-Foxboard mit k49.selfhost.me
• Mit ifconfig die IP-Adressen der Foxboards im Internet bestimmen:cbs.selfhost.me ________________k49.selfhost.me _________________
• Können das die Internet-IP-Adressen sein?
• Wie können Sie die Internet-IP-Adresse von k49 bestimmen?____________________________________________________
• Schauen Sie sich auch die Webseiten der Foxboards im Intranet mit der IP-Adresse, im Internet mit dem Domainnamen und danach mit der IP-Adresse an.
V11.07.12_cbs/kf / Folie 21
Einige Linux-BefehleNavigation im Dateisystem
pwdgibt das aktuelle Verzeichnis aus(print working directory)
cd /wechselt ins Hauptverzeichnis (Root)(change directory)
cd .. wechselt in das übergeordnete Verzeichnis
cd <name>wechselt ins Verzeichnis <name> Beispiel: relativ zum Verzeichnis home: cd kf oder absolut von jedem beliebigen Verzeichnis: cd /home/kf
cd - wechselt in das vorherige Verzeichnis
cd wechselt ins Home-Verzeichnis des Benutzers
V11.07.12_cbs/kf / Folie 22
Verzeichnisse und Benutzer
ls kurze Liste des Verzeichnisinhaltes (list)
ls -l ausführliche Liste des Verzeichnisinhaltes mit Dateirechten
rm <name> Löscht die Datei <name> im Verzeichnis (remake)
mkdir <name> neues Verzeichnis erstellen ( z. B. mkdir test )
rmdir <name> leeres Verzeichnis löschen ( z. B. rmdir test )
cat gibt den Inhalt einer Datei aus, z. B. cat /etc/network/interfacesDer Inhalt der Datei interfaces im Ordner /etc/network wird angezeigt.
passwdPasswort für Benutzer root ändern: passwd root !!!!Bitte kein Passwort ändern!!!!!!
whoWer ist alles eingeloggt? Ausgabe der Benutzernamen, des Terminals und der Login-Zeit.
V11.07.12_cbs/kf / Folie 23
Systeminformationen
mount Ausgabe aller gemounteter Partitionen/Geräte
dfdf -h
Ausgabe der Speicherkapazität der gemounteten Geräte
datedate MMTThhmmYYYY
Anzeigen und Setzen von Datum und Uhrzeit
free gibt die Nutzung des Arbeitsspeichers aus
uptime zeigt die Prozessorauslastung und -laufzeit an
top zeigt die höchsten Ressourcenverbraucher an (mit q beenden)
ps zeigt Informationen über laufende Prozesse an
uname -a gibt Kernel-Informationen und die Kernel-Version aus
V11.07.12_cbs/kf / Folie 24
Übung 5: Home-Ordner (mit Putty)• Mit cd / in das Hauptverzeichnis (Wurzel, root) wechseln.• Mit ls die Dateien und Ordner im Hauptordner (Wurzel) anschauen.• Mit cd /home in den Ordner /home wechseln.• Mit mkdir xx Ordner xx (xx: Kürzel des Nachnamen: z. B. kf) in
/home erstellen. Dieser neue Ordner ist Ihr Ordner für Ihre Dateien.• Wie groß ist die Speicherkapazität der Partitionen.• Stimmt das Datum und Uhrzeit?• Das Foxboard mit reboot neu starten und in den Ordner xx
wechseln ( cd /home/xx).• Geben Sie cd, danach pwd ein. In welchem Ordner sind Sie?• Erläutern Sie den Unterschied der Befehle: cd / und nur cd • Erläutern Sie die unterschiedlichen Bedeutungen für root.• Erläutern Sie die Ausgabe auf dem Bildschirm nach einem Return.• Mit den Pfeiltasten hoch / runter können Sie die letzten Befehle
aufrufen, mit links / rechts editieren.
V11.07.12_cbs/kf / Folie 25
GPI/O-Ports vom Foxboard direktunter Linux ansprechen
• Die drei 32 Bit-I/O-Port-Register– Port A hat die Adresse 32
– Port B hat die Adresse 64
– Port C hat die Adresse 96
• Einige Pins der I/O-Ports können über den Port und die Pinnummer angesprochen werden.PAx bedeutet: Port A Pin x (x steht für 0 bis 31)
• Linux benötigt die KernelID: die Adresse des Ports + die PinnummerPB12 KernelID: 64 + 12 = 76
V11.07.12_cbs/kf / Folie 26
Beschaltung von SW1 und LD2
U bei „1“ am PC7 (LD2) = 1,8V
Spannung an PC4 durch Taster SW1 berechnen:
Bei offenen Taster U = _____V
Bei gedrückten Taster U = _____V
IF bei leuchtender LD2 berechnen (UF = 1,7V):
IF = _______mA
Berechnung der KernelID:
KernelID = Port-Adresse + Pin-Nummer
KernelID SW1: ____________________
KernelID LD2: ____________________
V11.07.12_cbs/kf / Folie 27
Fest vereinbarte GPIO-Pins unter Linux Die rote LED LD2 ist am Pin 7 des Ports C (PC7, KernelID = 103) angeschlossen und unter Linux fest vereinbart. Nach dem Linuxstart blinkt die LD2. Um das Blinken zu beenden, muss in die Datei brightness der Wert 0 eingetragen werden. Dadurch wird der Pin, an dem die LD2 angeschlossen ist, auf 0V (auf logisch 0) gesetzt. Linux überträgt stetig den Wert in der Datei brightness an den Pin PC7. Der Linux-Befehl echo x > Pfad/Datei überträgt den Wert x in die angegebene Datei. Ist der Ordner, in der die Datei liegt, der aktive Ordner, muss der Pfad nicht angegeben werden.
Das Blinken beenden: echo 0 > /sys/class/leds/user_led/brightness
LD2 mit Linux-Befehl ein- und ausschalten:ein: echo 1 > /sys/class/leds/user_led/brightness aus: echo 0 > /sys/class/leds/user_led/brightness
Aufgabe: Geben Sie in Putty die Anweisungen nach einander ein. Schalten Sie öfters die LED ein und aus. Schauen Sie sich nach jedem Befehl den Inhalt der Datei brightness mit dem cat-Befehl an.
V11.07.12_cbs/kf / Folie 28
GPIO-Pin unter Linux ansprechen Mit dem Programm export kann ein GPIO-Pin unter Linux vereinbart werden, um auf diesen Pin zugreifen zu können. Beispiel des Pins mit der KernelID 58 : echo 58 > /sys/class/gpio/export
Richtung (Ein- oder Ausgabe) des Pins festlegen als:Ausgang: echo out > /sys/class/gpio/gpio58/direction
Eingang: echo in > /sys/class/gpio/gpio58/direction
Einen vereinbarten Ausgang auf logisch 1: echo 1 > /sys/class/gpio/gpio58/value
0: echo 0 > /sys/class/gpio/gpio58/value
setzen. Diese Vereinbarung ist nur temporär, das heißt: Die Vereinbarungen ist nur während einer Linux-Sitzung gültig.
V11.07.12_cbs/kf / Folie 29
Übung 6: Pin mit ID 58 (59) vereinbaren
• Putty: Versuchen Sie den Pin mit der KernelID 103 (LD2) zu vereinbaren.
• ls: Inhalt con Ordner /sys/class/gpio anschauen. Merken Sie sich die Unterordner.
• Putty: Vereinbaren Sie den Pin mit der KernelID 58 als I/O-Pin:
echo 58 > /sys/class/gpio/export.• cd, ls: Inhalte von Ordner /sys/class/gpio und Unterordner anschauen.
• cat: Was steht in der Datei direction im Ordner /sys/class/gpio/gpio58 ?
• Putty: Vereinbaren Sie die Richtung als Ausgang:
echo out > /sys/class/gpio/gpio58/direction • Schalten Sie die KernelID 58 auf logisch „1“, dann auf logisch „0“ .
Schauen Sie sich den Inhalt der Datei value im Ordner /sys/class/gpio/gpio58 an.
• Warum verändert sich die LED LD2 nicht.
• Zu welchen Port und zu welchen Pin gehört die KernelID 58.
• An welchen Pin vom Foxboard müssten Sie eine LED anschließen, damit diese von der KernelID 58 gesteuert wird.
V11.07.12_cbs/kf / Folie 30
Infos für die C-Programmierung• C-Einsteigerkurse
de.wikibooks.org/wiki/C-Programmierungwww2.hs-fulda.de/~klingebiel/c-vorlesungwww.imb-jena.de/~gmueller/kurse/c_c++www.galileocomputing.de/openbook/c_von_a_bis_z/Im public-html-Ordner von Kaufmann ist das C-Script Ansi-C_ES.doc
Kapitel-Angaben ( z.B. K5.3) beziehen sich auf Ansi-C_ES.doc
• Einfach zu bedienende Windows-C-Kompilerwww.codeblocks.org oder dev-c.softonic.de/download
• Programme für die C-Entwicklungsumgebung (SDK)– Putty: www.putty.org (putty.exe herunterladen)
– Notepad++: notepad-plus-plus.org
– WinSCP: winscp.net/eng/download.php
V11.07.12_cbs/kf / Folie 31
FTP-Client-Programm WinSCP• Für die Datenübertragung zwischen PC und Foxboard
wird das FTP-Client-Programm WinSCP benötigt. • Geben Sie die IP-Adresse und die Benutzerkennung an.
V11.07.12_cbs/kf / Folie 32
Vorbereitungen für die C-Programmierung• Entwicklungsumgebung (SDK):
– Notepad++ ist ein Textverarbeitungsprogramm zum Erstellen des c-Programms
– WinSCP ist ein FTP-Client (File-Transfer-Protokoll)
– Putty ist ein textorientierte Oberfläche zum Ausführen von Betriebssystembefehle
• Installieren Sie Notepad++ für die Bearbeitung des C-Sourcecodes.
• Starten Sie WinSCP für die Datei-Übertragung zwischen PC und Foxboard.
• Kontrollieren Sie mit WinSCP unter /home, ob ein Ordner mit ihrem Kürzel (zum Beispiel: kf für Kaufmann) vorhanden ist.Wenn der Ordner fehlt, erstellen Sie den Ordner mit WinSCP.
• Erstellen Sie den gleichen Ordner auf ihrem PC in ihrem Homeverzeichnis H:.
• Sicherheitshinweis:Auf den Foxboard können nach dem Unterricht alle Daten gelöscht werden. Deswegen sichern Sie alle C-Dateien für das Foxboard in Ihrem Homeverzeichnis auf dem PC.
V11.07.12_cbs/kf / Folie 33
Erstellen von C-Programme fürs Foxboard
Vorgehensweise:1. Mit notepad++ wird der C-Quellcode (Source-Code, für
den Menschen verständlicher Code) auf dem PC erstellt. Diese Datei hat die Dateierweiterung c (<Name>.c).
2. Mit WinSCP wird die C-Datei auf das FoxboardG20 ins /home/xx-Verzeichnis kopiert.
3. Mit Putty wird im Ordner /home/xx mit dem Aufruf: gcc <Name>.c –o <Name> die Datei <Name>.c kompiliert und die ausführbare Datei <Name> erstellt, wenn keine Fehler erkannt wurden.
4. Die ausführbare Datei <Name> starten: ./<Name>
V11.07.12_cbs/kf / Folie 34
Das erste C-Programm: hw.c
• Um Ausgaben auf dem Bildschirm mit printf zu ermöglichen, muss die Standard-IO-Bibliothek stdio.h (Header-Datei) eingebunden werden: #include <stdio.h>
• Ein C-Programm benötigt immer ein Hauptprogramm int main(void).• Der Anweisungsblock {...} für das Hauptprogramm oder für andere
Programmteile wird immer in geschleiften Klammern eingebunden.• Der bei der Anweisung printf in Anführungszeichen eingebundene Text wird auf
den Bildschirm ausgegeben. \n ist ein Steuerzeichen (Befehl an Ausgabeeinheit) und wird nicht ausgegeben. Befehl für den Bildschirm: Ausgabe des Textes und in neue Zeile springen.
• Jede Anweisung wird mit einem Semikolon ; beendet.• Mit // beginnt der einzeilige Kommentar, keine Bedeutung für den Compiler.
#include <stdio.h> int main(void) { printf("Hallo Welt von XXXXX!\n"); return(0); // Rücksprung ins Betriebssystem}
V11.07.12_cbs/kf / Folie 35
Verändern, Kompilieren, Ausführen von hw
• Schreiben Sie hw.c mit Notepad++ : Ausgabe auf dem Bildschirm: Hallo Welt von XXXXX! Schreiben Sie für xxxxx ihren Namen in die printf-Anweisung.
• Speichern Sie hw.c in ihrem PC-Ordner.• Übertragen Sie die Datei hw.c mit WinSCP in den
/home/xx-Ordner auf dem Foxboard.• Aktionen auf dem Foxboard mit dem Programm Putty:
– Compilieren Sie hw.c in /home/xx mit dem Befehl: gcc hw.c –o hw
– Starten Sie die ausführbare Datei hw mit ./hw
V11.07.12_cbs/kf / Folie 36
Zugriff auf die Hardware unter C• Um auf die Ports des FoxG20 zugreifen zu können, muss die
Header-Datei cbsg20.h, die nicht zum Linux-Betriebssystem gehört, in den Ordner /usr/include kopiert werden.
• Im c-Programm muss die Anweisung #include <cbsg20.h> am Ende der include-Anweisungen hinzugefügt werden.
• In der Header-Datei werden die Zustände der einzelnen Pins in Dateien eingetragen, von Linux und dem c-Programm ausgewertet.
• Folgende Anweisungen sind in cbsg20.h vereinbart :
– Pin vereinbaren als Eingang: gpioinit (kernelid, “in“) Ausgang: gpioinit (kernelid, “out“)
– Setzt den Pin auf 0 : gpioset (kernelid, 0)
1 : gpioset (kernelid, 1)
– Liest den Zustand des Pins: gpioget (kernelid)
V11.07.12_cbs/kf / Folie 37
LD2 blinkt: C-Programm ld2.c// ld2.c 26.01.2010 Kaufmann #include <stdio.h> // für printf#include <unistd.h> // für sleep#include <cbsg20.h> // für gpio
#define LD2 103 // kernelid 103 als Label LD2 definieren
int main(void){ gpioinit(LD2,"out"); // LD2 als Ausgang festlegen printf("LD2-Programm von xxxxxx V3.1\n"); while(1) { gpioset(LD2,0); printf("LD2 aus Abbruch <STRG>+<C>\n"); sleep(1); gpioset(LD2,1); printf("LD2 an Abbruch <STRG>+<C>\n"); sleep(1); } return(0);}
K4.2.1: printfK5.2: while
V11.07.12_cbs/kf / Folie 38
Fragen zu ld2.c• Kompilieren und starten Sie das Programm ld2 .• Erläutern Sie die Anweisung: gpioinit(LD2,"out");• Erläutern Sie die Anweisung: gpioset(LD2,0); • Bei welcher C-Anweisung wird die Diode LD2 eingeschaltet?• Durch welche Zahl wird LD2 beim Kompilieren ersetzt?• Erläutern Sie die Funktionsweise der Schleife while (1) {...}.
– Was passiert, wenn Sie anstelle der 1 eine 2 , eine 0 , eine –1 einsetzen.Verändern Sie die Werte, kompilieren und starten Sie das Programm.
– Warum bezeichnet man while (1) {...} als Endlosschleife?
• Schauen Sie sich die printf-Anweisung an. Was bedeutet \n ?• Welche Aufgabe hat die Anweisung sleep(1).
Beachten: Bei sleep(zahl) ist zahl immer ganzzahlig.• Welche Aufgabe hat die Anweisung return(0);
V11.07.12_cbs/kf / Folie 39
Aufgabe: ld2.c erweitern1. ld2_1.c: Programmänderung: Die Periodendauer des Blinkens
soll 0,5 Sekunden betragen (P = 0,5s oder f = 2Hz).Verwenden Sie die Anweisung: usleep(usekunden);Die Variable usekunden ist ganzzahlig (int) und bedeutet Mikrosekunden.
2. ld2_2.c: Programmieren Sie einen Zähler hinzu. Integer-Variable int zaehler = 0; und C-Anweisung zaehler ++; hinzufügen.Verändern Sie die Ausgabe so, dass folgendes Bild erscheint:Veränderte Print-Anweisung: printf("LD2 aus Anzahl Blinken: %d \n", zaehler);
3. ld2_3.c: Nach dem 10. mal Blinken soll das Programm mit der Ausgabe Ende des Blinkens beendet werden.Bedingung: while (zaehler < 10) { ... } K4.3: %d
V11.07.12_cbs/kf / Folie 40
for-Schleife und scanf-Anweisunghttp://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturenhttp://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe
• Compilieren Sie das Programm sf.c und starten Sie sf.
• Beachten Sie: Bei scanf muss bei der Variablen das &-Zeichen (Pointer) sein.
Speichern Sie die Source-Datei ld2_3.c unter sf.c ab.Ersetzen Sie while (zaehler < 10) durch den fett angegeben C-Code und entfernen Sie die Anweisung zaehler ++; im while-Anweisungsblock.Beachten Sie: blinkenmax muss noch als int-Variable vereinbart werden.
printf("Wie oft soll geblinkt werden: "); scanf("%i",&blinkenmax); for (blinken = 1; blinken <= blinkenmax; blinken++) { gpioset(LD2,0); printf("LD2 aus Anzahl Blinken = %d\n", blinken); usleep(250000); gpioset(LD2,1); printf("LD2 an \n\n"); usleep(250000); }
K2.2: VariablenK4.2.2: scanfK5.1: for
V11.07.12_cbs/kf / Folie 41
Aufgabe: sf.c verändern Verändern Sie das Programm (sf_x.c):
1. Geben Sie blinkenmax in der for-Schleife aus. 2. Die Periodendauer des Blinkens soll 0,3 Sekunden betragen.
Vereinbaren Sie Taktdauer in einer define-Anweisung.3. Nach der For-Schleife soll wieder zur Eingabe
zurückgesprungen werden (zusätzliche while-Schleife).4. Wenn bei der Eingabe die Zahl für blinkenmax kleiner 1 ist, soll
das Programm beendet werden (printf-Anweisung anpassen). Durch den Aufruf return(0) wird eine Prozedur beendet.
Im main-Block wird das main-Programm beendet und somit ins Betriebssystem zurückgesprungen.Oder:Durch den Aufruf exit(0) wird das gesamte Programm sofort beendet und ins Betriebssystem zurückgesprungen (stdlib.h notwendig).
5. Geben Sie vor der Rückkehr ins Betriebssystem noch die Meldung aus: Ende durch Eingabe einer Zahl kleiner 1.
K5.3: if
V11.07.12_cbs/kf / Folie 42
Aufgaben: Mathe-C-Programme (1) • Addition (add.c)
– Funktion: Die Summe von Zahl1 und Zahl2 soll berechnet werden. z. B: 3 + 7 = 10
– Eingabe: Zahl1 und Zahl2– Ende: Ausgabe: Ergebnis = 10
• Erweiterung Addition mit while Schleife: (add_2.c)– Wiederholung durch Rücksprung zur Eingabe Zahl1 (while-Schleife)– Ende des Programms: Eingabe 0 bei Zahl1– Ausgabe: die 2 eingegebenen Zahlen und das Ergebnis: 3 + 7 = 10
• Summe mit for-Schleife (sum.c)– Funktion: Die Summe von Zahl1 bis Zahl2 soll berechnet werden.
z. B: 3 + 4 + 5 + 6 + 7 = 25– Eingabe: erste und letzte Zahl– Ende: Ausgabe: Summe = 25
• Erweiterung Summe: (sum_2.c)– Ende des Programms: Eingabe 0 bei der ersten Zahl (while-Schleife)– Zusätzlich Ausgabe des Produkts zwischen den beiden Zahlen
z. B: 3 * 4 * 5 * 6 * 7 = 2520
V11.07.12_cbs/kf / Folie 43
Aufgaben: Mathe-C-Programme (2) http://de.wikibooks.org/wiki/C-Programmierung:_math.h
• Potenz zur Basis 3 (p3.c)– Funktion: Die Potenz zur Basis 3 soll durch Eingabe des Exponenten berechnet
werden. z. B: Exponent = 4 3 * 3 * 3 * 3 = 81– Eingabe: Exponent (beachte: bei Eingabe 0 ist das Ergebnis 1)– Ende des Programms: Eingabe einer negativen Zahl.
• Potenz einer beliebigen Basis (p.c)– Eingabe: Basis, Exponent – Danach soll bis zur Eingabe eines negativen Exponenten die Potenz errechnet werden.– Wird bei der Basis der Wert 0 eingegeben, soll das Programm beendet werden.
• Potenzberechnung mit math.h (pow.c) (nur für Interessierte)– hinzufügen: #include <math.h>– Alle Variable als Datentyp: double (Dezimalzahlen, z. B. 3.5)– Formatierung bei scanf und printf: %lf– Anweisung zur Potenzberechnung (in math.h): pow(basis, exponent);– Ende: Basis = 0. Abbruch der while-Schleife: Exponent = 0– Für Basis und Exponent sind jetzt auch Dezimalzahlen möglich. – Kompilieren mit: gcc pow.c –lm –o pow (Reihenfolge der Parameter beachten)
V11.07.12_cbs/kf / Folie 44
Aufgaben: Mathe-C-Programme (3) (nur für Interessierte, mit der math.h-Library)
• Satz des Pythagoras (py.c)– Eingabe: Die beiden Katheten.
– Verarbeitung: Die Hypotenuse berechnen.
– Ausgabe: Hypotenuse.
– Hinweise: • hinzufügen: #include <math.h>
• Datentyp: double , Formatierung bei scanf und printf: %lf
• Wurzel ziehen: sqrt(wert); oder pow(wert, 0.5);
• kompilieren mit: gcc py.c –lm –o py
• Erweiterung (py_2.c)– Auswahl durch Eingabe eines Buchstabens
E oder e => Ende des Programms H oder h => Hypotenuse berechnen K oder k => Kathete berechnen
V11.07.12_cbs/kf / Folie 45
Datum und Uhrzeithttp://www.imb-jena.de/~gmueller/kurse/c_c++/c_time.html
• Unter Linux:– date gibt das aktuelle Datum aus– date MMTThhmmYYYY setzt das Datum für Linux (nur für die Session)
• RTC-IC für Hardware-Uhr (RealTimeClock, RTC)– hwclock –w Hardwareclock mit System-Datum (Linux) setzen– hwclock –r Hardwareclock auslesen
• Unter C– #include "time.h" fügt die Time-Funktionen hinzu.– time_t Sec1970; vereinbart einen Datentyp (z. B. Sec1970), der die Sekunden
seit 01.01.1970 enthält.– time(&Sec1970); oder Sec1970 = time(NULL); aktualisiert die Variable
Sec1970 mit der Sekundenanzahl.– ctime(&Sec1970) gibt ein vordefiniertes Datumsformat aus.– localtime(&Sec1970) berechnet Datum und Uhrzeit für eigene Datumsformate
aus dem Datentyp Sec1970 und erzeugt %-Formatierungen für das Datum.– strftime( ) kopiert in einen String die gewünschte Ausgabe eines Datumsformats
mit den festgelegten %-Datumsformatierungen.
• Analysieren Sie die Programme: datum.c, dauer.c
V11.07.12_cbs/kf / Folie 46
Dateioperationenhttp://de.wikibooks.org/wiki/C-Programmierung:_Dateien#Streams
• Unter C können Dateien erstellt, beschrieben und ausgelesen werden. Dateien können in unterschiedlichen Moden geöffnet werden (Schreib-, Lese-Modus usw).– FILE vereinbart ein Name (als Pointer *) unter C.
– fopen( ) vereinbart den Pfad, den Dateinamen und den Modus.
– fprintf( ) schreibt Daten formatiert in eine Datei.
– fgets( ) liest Daten formatiert aus einer Datei ein.
– fclose( ) schließt eine Datei und gibt sie für andere Benutzer frei.
• Lesen Sie den Abschnitt Dateien und Streams im oben angegebenen Link durch und analysieren Sie die Programme: fw.c, fr.c, fr2.c, frt.c, frt2.c
V11.07.12_cbs/kf / Folie 47
HTML-Programmierunghttp://de.selfhtml.org
• Das Foxboard G20 wird mit dem Webserver Lighttpd ausgeliefert. Der Standardwebserver in der Carl-Bosch-Schule ist der Apache2. Deswegen wurde auf dem Foxboard der Apache2 installiert und konfiguriert.
• Die Installation und Konfiguration ist in dem Dokument FoxG20Installation.doc beschrieben.
• Die im Ordner /var/www hinterlegten html-Dateien können im Webbrowser durch IP/<Dateiname> aufgerufen werden.
• Erstellen Sie die Datei hw.html im Ordner /var/www und rufen Sie die Datei im Browser mit 10.1.9.x/hw.html auf.– Inhalt der hw.html-Datei:
<meta Content-Type: text/html; charset=iso-8859-1><br><h2>Hallo Welt von xxxxx V3.1!</h2>
V11.07.12_cbs/kf / Folie 48
CGI-Programmierung (Common Gateway Interface)
• Um den aktuellen Zustand der Hardware anzuzeigen, können mit CGI dynamische Webseiten in C erstellt werden.
• Die im Ordner cgi-bin in C-geschriebenen Programme verwenden als Standardausgabe den WEBServer.
• Deswegen steht der html-Code in printf-Anweisungen. • Da der html-Code oft Anführungszeichen " benötigt, müssen diese
in printf-Anweisungen durch ein Backslash \" gekennzeichnet werden, um der printf-Anweisung mitzuteilen, dass dieses Anführungszeichen nicht das Ende des printf-Strings bedeutet.
• Vereinbarungen in der Apache2-Konfigurationsdatei:– der /var/www-Ordner als DocumentRoot– cgi als Alias für den Ordner cgi-bin– die Endung .cgi als Kennzeichnung eines CGI-Programms
• Deswegen sollten die ausführbaren CGI-Dateien (kompilierten C-Dateien) mit .cgi enden und im /var/www/cgi-bin Ordner liegen.
V11.07.12_cbs/kf / Folie 49
Hallo Welt als cgi-Programm
• Das CGI-Programm in Notepad++ schreiben und die hwcgi.c-Datei in den cgi-Ordner kopieren (/var/www/cgi-bin/).
• Die Datei hwcgi.c im cgi-bin Ordner mit gcc hwcgi.c –o hw.cgi kompilieren und die Rechte mit chmod 4755 hw.cgi setzen.
• Im Browser http://10.1.9.x/cgi/hw.cgi aufrufen.• Hinweis: Durch den Eintrag ScriptAlias /cgi/ /var/www/cgi-bin/
in der Apache2-Konfigurationsdatei wird der richtige Pfad für cgi ersetzt.
• Die grüne Anweisung ist für den Firefox wichtig!!!
//hwcgi.c#include <stdio.h>int main(void){ printf("Content-Type: text/html; charset=iso-8859-1\n\n"); printf("<br><h2>Hallo Welt von xxxxx V_CGI_3.1</h2>");}
V11.07.12_cbs/kf / Folie 50
int main(void) { char *query_string = getenv("QUERY_STRING"); gpioint(DL2, "out"); if (query_string) // 0, keine Übergabe, wichtig beim ersten Aufruf { // LD2-LED setzen durch Browser-Eingabe if (strstr("LD2on",query_string)) gpioset(LD2,1); if (strstr(„LD2off",query_string)) gpioset(LD2,0); } printf("Content-Type: text/html; charset=iso-8859-1\n\n"); printf("<h2>Fernschalten der LD2 (KID:103,PC7)</h2>"); printf("<h3><a href=\"?LD2on\">LD2 an</a></h3>"); printf("<h3><a href=\"?LD2off\">LD2 aus</a></h3>"); printf("<h2>Version G20.3/kf (CBS-HD)</h2>"); }
LD2 übers Internet schalten (1)
?LD2off ist als Teilstring im query_string.
Putty: gcc ld2cgi.c –o ld2.cgiPutty: chmod 4755 ld2.cgi (Recht für ausführbar setzen)Browser: http://10.1.9.x/cgi/ld2.cgi
V11.07.12_cbs/kf / Folie 51
LD2 übers Internet schalten (2)• Erstellen Sie auf den Foxboard im
Ordner /var/www den Ordner pics und speichern Sie die Bilder hell.jpg und dunkel.jpg im Ordner pics.– In der Apache2-Konfigurationdatei ist der
Pfad für den DocumentRoot auf /var/www/ gesetzt. Deswegen muss als Pfad beim html-Aufruf img src= für den Ort der Bilder /pics/ angegeben werden.
• Speichern Sie die Datei ld2cgi.c unter ld2imgcgi.c und ersetzen Sie die beiden Zeilen mit printf("<h3><a href= .......); durch die Zeilen:
if (gpioget(LD2)) printf("<a href=\"?LD2off\"><img src=\"/pics/hell.jpg\"></a>\n");else printf("<a href=\"?LD2on\"><img src=\"/pics/dunkel.jpg\"></a>\n");
V11.07.12_cbs/kf / Folie 52
CGI-Programm als WEB-Startseite des FoxG20• Kopieren Sie die index.html-Datei mit dem Inhalt
<html><head> <meta http-equiv="refresh" content="0; URL=/cgi/index.cgi"></head></html>
in den /var/www-Ordner. • Die index.html-Datei startet beim Aufruf die Datei index,cgi,
die im /var/www/cgi-bin Ordner sein muss.• Nennen Sie deswegen die Datei im Ordner cgi-bin in index.cgi
um, die bei der Eintragung der IP-Adresse des FoxG20 im Browser sofort gestartet werden soll.
• Aufgabe: – Nennen Sie die Datei ld2img.cgi um in index.cgi.– Starten Sie den Browser und geben Sie nur die IP-Adresse
ihres FoxG20 ein.
• Warum ist eine dynamische DNS-Adresse sinnvoll.
V11.07.12_cbs/kf / Folie 53
CGI auf html-Seite umleiten (1)
int main(void) {
char *query_string = getenv("QUERY_STRING");
gpioinit(LD2,"out");
if (query_string) {
if (strstr("LD2on", query_string)) gpioset(LD2,1);
if (strstr("LD2off",query_string)) gpioset(LD2,0);
}
printf("Content-Type: text/html; charset=iso-8859-1\n\n");
printf("<meta http-equiv=\"refresh\" content=\"0; URL=/ld2w.html\">");
}
Werden auf der Webseite keine aktuellen Einstellungen angezeigt (Webseite ist statisch, nicht dynamisch), kann nach der Hardwareauswertung und -Einstellung im CGI-Teil auf eine html-Webseite verzweigt werden. Die html-Datei sollte dann im Dokumentenroot vom Apache2-Server liegen, auf keinen Fall im cgi-bin_Ordner.
Inhalt der ld2w.cgi-Datei:
V11.07.12_cbs/kf / Folie 54
CGI auf html-Seite umleiten (2)
Ich hoffe, es hat Ihnen Spaß bereitet, sich mit dem Foxboard, mit Linux und der Sprache C
zu beschäftigen.
Der Autor: Michael Kaufmann
<html><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<h2>Fernschalten der LD2 (KID:103,PC7)</h2>
<h3><a href="/cgi/ld2w.cgi?LD2on">LD2 an</a></h3>
<h3><a href="/cgi/ld2w.cgi?LD2off">LD2 aus</a></h3>
<h2>Version G20.3/kf (cgi -> html) (CBS-HD)</h2></html>
Wichtig ist die Umleitung in der ld2w.html-Datei zurück auf die ld2w.cgi-Datei im Ordner /cgi/.
Der Inhalt der ld2w.html-Datei: