540 likes | 662 Views
Embedded Systems Hardware unter Linux mit dem FoxboardG20 steuern - Digitale Signale - Analoge Signale Autor: StD Michael Kaufmann. Foxboard G20 im Internet. Wichtige Web-Seiten: foxg20.acmesystems.it eshop.acmesystems.it/?id=FOXG20 elmicro.com/de/foxboard.html (Zur Zeit nicht)
E N D
Embedded SystemsHardware unter Linux mit dem FoxboardG20steuern - Digitale Signale- Analoge SignaleAutor: StD Michael Kaufmann
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.
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
Internet oder LAN Router mit Switch Client-Rechnermit Browser http://miniweb.cbs-heidelberg.de Zweite Techniker-Arbeit: EIB-Haus
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
Hardware-Features FoxboardG20 • Netus G20 mit 400MHz AtmelMikrocontroller 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) • 4A/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
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.
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.
RS232-Einstellungen bei Putty • Putty für serielle COM-Schnittstelle konfigurieren: • COMx-Schnittstelle im Gerätemanager feststellen, wichtig bei USB-RS232-Adapter • Einstellungen vornehmen: Serial line: COMx Speed: 115200 • Bei Category - Serial kontrollieren:
Foxboard starten und beenden Sobald das Foxboard mit 5V versorgt wird, startet Linux. • 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. Bevor das Foxboard G20 von der Spannungsversorgung getrennt wird, muss das Linuxbetriebssystem unbedingt heruntergefahren werden bis zur Meldung:Power down
Ü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.
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.0Subnetmask: 255.255.0.0Gateway-IP: 10.1.1.32 (Server mit Routerfunktion)
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.
IP-Konfiguration bei WLAN-Dongel 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.0gateway 10.1.1.32 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf • 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“}
Übung 2a • In das Linuxsystem über die serielle Schnittstelle einloggen. • IP-Adresse mit dem Linuxbefehl ifconfig feststellen. • Mit dem Befehl cat /etc/network/interfacesdie 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:________________________________________________________________________________________
Ü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.
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.
Ü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.
Ü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.
Navigation im Dateisystem pwd gibt 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 Einige Linux-Befehle
Verzeichnisse und Benutzer cat gibt den Inhalt einer Datei aus, z. B. cat /etc/network/interfaces Der Inhalt der Datei interfaces im Ordner /etc/network wird angezeigt. ls passwd Passwort für Benutzer root ändern: passwd root !!!!Bitte kein Passwort ändern!!!!!! kurze Liste des Verzeichnisinhaltes (list) who ls -l Wer ist alles eingeloggt? Ausgabe der Benutzernamen, des Terminals und der Login-Zeit. 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 )
Systeminformationen mount Ausgabe aller gemounteter Partitionen/Geräte df df -h Ausgabe der Speicherkapazität der gemounteten Geräte date date 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
Ü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.
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
Beschaltung von SW1 und LD2 Spannung an PC4 durch Taster SW1 berechnen: Bei offenen Taster U = _____V Bei gedrückten Taster U = _____V U bei „1“ am PC7 (LD2) = 1,8V Berechnung der KernelID: KernelID = Port-Adresse + Pin-Nummer KernelID SW1: ____________________ KernelID LD2: ____________________ IF bei leuchtender LD2 berechnen (UF = 1,7V): IF = _______mA
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.
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/directionEingang: 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/valuesetzen. Diese Vereinbarung ist nur temporär, das heißt: Die Vereinbarungen ist nur während einer Linux-Sitzung gültig.
Ü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.
Infos für die C-Programmierung • C-Einsteigerkursede.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.docKapitel-Angaben ( z.B. K5.3) beziehen sich auf Ansi-C_ES.doc • Einfach zu bedienende Windows-C-Kompilerwww.codeblocks.orgoder 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
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.
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.
Erstellen von C-Programme fürs Foxboard Vorgehensweise: • 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). • Mit WinSCP wird die C-Datei auf das FoxboardG20 ins /home/xx-Verzeichnis kopiert. • 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. • Die ausführbare Datei <Name> starten:./<Name>
Das erste C-Programm: hw.c #include <stdio.h> int main(void) { printf("Hallo Welt von XXXXX!\n"); return(0); // Rücksprung ins Betriebssystem} • 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.
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. • SpeichernSie hw.c in ihrem PC-Ordner. • Übertragen Sie die Datei hw.c mit WinSCP in den /home/xx-Ordner auf dem Foxboard. • Aktionen auf demFoxboardmit dem Programm Putty: • Compilieren Siehw.c in /home/xx mit dem Befehl: gcc hw.c –o hw • Starten Sie die ausführbare Datei hw mit ./hw
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-Programmmuss 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)
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
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);
Aufgabe: ld2.c erweitern • 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. • 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); • 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
for-Schleife und scanf-Anweisunghttp://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturenhttp://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe 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);} • Compilieren Sie das Programm sf.c und starten Sie sf. • Beachten Sie: Bei scanf muss bei der Variablen das &-Zeichen (Pointer) sein. K2.2: VariablenK4.2.2: scanfK5.1: for
Aufgabe: sf.c verändern Verändern Sie das Programm (sf_x.c): • Geben Sie blinkenmax in der for-Schleife aus. • Die Periodendauer des Blinkens soll 0,3 Sekunden betragen. Vereinbaren Sie Taktdauer in einer define-Anweisung. • Nach der For-Schleife soll wieder zur Eingabe zurückgesprungen werden (zusätzliche while-Schleife). • 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). • Geben Sie vor der Rückkehr ins Betriebssystem noch die Meldung aus: Ende durch Eingabe einer Zahl kleiner 1. K5.3: if
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 Zahlenz. B: 3 * 4 * 5 * 6 * 7 = 2520
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)
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 BuchstabensE oder e => Ende des Programms H oder h => Hypotenuse berechnenK oder k => Kathete berechnen
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 Sec1970und 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
Dateioperationenhttp://de.wikibooks.org/wiki/C-Programmierung:_Dateien#StreamsDateioperationenhttp://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
HTML-Programmierung http://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>
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.
Hallo Welt als cgi-Programm //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>");} • 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!!!
LD2 übers Internet schalten (1) 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 ?LD2off ist als Teilstring im query_string. 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>");}