diff --git a/20191128/hp-musterloesung-20191121.pdf b/20191128/hp-musterloesung-20191121.pdf deleted file mode 100644 index a8adbf2b369d7073ba44f6aa9791ac4bb8d4ac2d..0000000000000000000000000000000000000000 Binary files a/20191128/hp-musterloesung-20191121.pdf and /dev/null differ diff --git a/20191128/hp-musterloesung-20191121.tex b/20191128/hp-musterloesung-20191121.tex deleted file mode 100644 index fcfee6bff213e6bb5404d0c0bfdae3918e7b4d70..0000000000000000000000000000000000000000 --- a/20191128/hp-musterloesung-20191121.tex +++ /dev/null @@ -1,278 +0,0 @@ -% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 28.\ November 2019} - - \exercise{Datum-Bibliothek} - - Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019 - in eine \file{.c}- und eine \file{.h}-Datei. \points{4} - - Hinweis: Schreiben Sie zusätzlich ein Test-Programm. - - \solution - - Die Dateien \gitfile{hp}{20191128}{dates.c} und \gitfile{hp}{20191128}{dates.h} enthalten die Bibliothek, - die Datei \gitfile{hp}{20191128}{test-dates.c} ein Programm zum Testen der Bibliothek. - - \exercise{Text-Grafik-Bibliothek} - - Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount} - \begin{itemize} - \item - \lstinline|void clear (char c)|\\ - Bildschirm auf Zeichen \lstinline|c| löschen,\\ - also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen - \item - \lstinline|void put_point (int x, int y, char c)|\\ - Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"') - \item - \lstinline|char get_point (int x, int y)|\\ - Punkt lesen -% \item -% \lstinline|void fill (int x, int y, char c, char o)|\\ -% Fläche in der "`Farbe"' \lstinline|o|, -% die den Punkt \lstinline|(x, y)| enthält, -% mit der "`Farbe"' \lstinline|c| ausmalen - \item - \lstinline|void display (void)|\\ - das Gezeichnete auf dem Bildschirm ausgeben - \end{itemize} - - Hinweise:\vspace*{-\medskipamount} - \begin{itemize} - \item - Eine C-Bibliothek besteht aus (mindestens) - einer \file{.h}-Datei und einer \file{.c}-Datei. - \item - Verwenden Sie ein Array als "`Bildschirm"'. - - Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\ - alle Grafikoperationen erfolgen auf dem Array. - \item - Verwenden Sie Präprozessor-Konstante, - z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\ - um Höhe und Breite des "`Bildschirms"' festzulegen: - \begin{lstlisting}[gobble=8] - #define WIDTH 72 - #define HEIGHT 24 - \end{lstlisting} - \item - Schreiben Sie zusätzlich ein Test-Programm, - das alle Funktionen der Bibliothek benutzt,\\ - um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"') - auszugeben. - \end{itemize} - \points{8} - - \solution - - Siehe die Dateien \gitfile{hp}{20191128}{textgraph.c} und \gitfile{hp}{20191128}{textgraph.h} (Bibliothek) - sowie \gitfile{hp}{20191128}{test-textgraph.c} (Test-Programm). - - Diese Lösung erfüllt zusätzlich die Aufgabe, - bei fehlerhafter Benutzung (Koordinaten außerhalb des Zeichenbereichs) - eine sinnvolle Fehlermeldung auszugeben, - anstatt unkontrolliert Speicher zu überschreiben und abzustürzen. - - Das Schlüsselwort \lstinline{static} - bei der Deklaration der Funktion \lstinline{check_coordinates()} - bedeutet, daß diese Funktion nur lokal (d.\,h.\ innerhalb der Bibliothek) - verwendet und insbesondere nicht nach außen - (d.\,h.\ für die Benutzung durch das Hauptprogramm) exportiert wird. - Dies dient dazu, nicht unnötig Bezeichner zu reservieren - (Vermeidung von "`Namensraumverschmutzung"'). - - Man beachte die Verwendung einfacher Anführungszeichen (Apostrophe) - bei der Angabe von \lstinline{char}-Kon"-stanten (\lstinline{'*'}) - im Gegensatz zur Verwendung doppelter Anführungszeichen - bei der Angabe von String-Konstanten - (String = Array von \lstinline{char}s, abgeschlossen mit Null-Symbol). - Um das einfache Anführungszeichen selbst als \lstinline{char}-Konstante anzugeben, - ist ein vorangestellter Backslash erforderlich: \lstinline{'\''} ("`Escape-Sequenz"'). - Entsprechendes gilt für die Verwendung doppelter Anführungszeichen - innerhalb von String-Konstanten: - \lstinline{printf ("Your name is: \"%s\"", name);} - - \exercise{LED-Blinkmuster} - - Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller - (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}). - - \begin{minipage}[t]{7cm} - \begin{lstlisting}[gobble=6] - #include <stdint.h> - #include <avr/io.h> - #include <avr/interrupt.h> - - uint8_t counter = 1; - uint8_t leds = 0; - - ISR (TIMER0_COMP_vect) - { - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; - } - \end{lstlisting} - \end{minipage}\hfill\begin{minipage}[t]{8.5cm} - \begin{lstlisting}[gobble=6] - void init (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; - } - - int main (void) - { - init (); - while (1) - ; /* do nothing */ - return 0; - } - \end{lstlisting} - \end{minipage} - - An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\ - Sobald das Programm läuft, blinken diese in charakteristischer Weise: - \begin{quote} - \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}} - \begin{tabular}{|c|c|c|c|}\hline - \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline - 1 & aus & aus & an \\\hline - 2 & aus & an & aus \\\hline - 3 & aus & an & an \\\hline - 4 & an & aus & aus \\\hline - 5 & an & aus & an \\\hline - 6 & an & an & aus \\\hline - 7 & an & an & an \\\hline - 8 & aus & aus & aus \\\hline - \end{tabular} - \end{quote} - Jede Phase dauert etwas länger als eine halbe Sekunde. - Nach 8 Phasen wiederholt sich das Schema. - - Erklären Sie das Verhalten des Programms anhand des Quelltextes: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item[(a)] - Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert? - \points{1} - \item[(b)] - Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird? - \points{2} - \item[(c)] - Wie kommt das oben beschriebene Blinkmuster zustande? - \points{2} - \item[(d)] - Wieso dauert eine Phase ungefähr eine halbe Sekunde? - \points{2} - \item[(e)] - Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'? - \points{1} - \end{itemize} - - \goodbreak - Hinweis: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers - etwa 488mal pro Sekunde aufgerufen wird. - Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports. - Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären. - \end{itemize} - - \solution - - \begin{itemize}\itemsep0pt - \item[(a)] - \textbf{Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert?} - - Das Blinken wird durch einen Interrupt-Handler implementiert. - Dieser wird nicht durch das Hauptprogramm, - sondern durch ein Hardware-Ereignis (hier: Uhr) aufgerufen. - - \item[(b)] - \textbf{Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird?} - - Die vorzeichenlose 8-Bit-Variable \lstinline{counter} kann nur - Werte von 0 bis 255 annehmen; bei einem weiteren - INkrementieren springt sie wieder auf 0 (Überlauf), - und die \lstinline{if}-Bedingung ist erfüllt. - - \item[(c)] - \textbf{Wie kommt das oben beschriebene Blinkmuster zustande?} - - In jedem Aufruf des Interrupt-Handlers wird die Variable - \lstinline{leds} um 1 erhöht und anschließend modulo 8 genommen. - Sie durchläuft daher immer wieder die Zahlen von 0 bis 7. - - Durch die Schiebeoperation \lstinline{leds << 4} werden die 3 Bits - der Variablen \lstinline{leds} an diejenigen Stellen im Byte - geschoben, an denen die LEDs an den Mikro-Controller - angeschlossen sind (Bits 4, 5 und 6). - - Entsprechend durchläuft das Blinkmuster immer wieder - die Binärdarstellungen der Zahlen von 0 bis 7 - (genauer: von 1 bis 7 und danach 0). - - \item[(d)] - \textbf{Wieso dauert eine Phase ungefähr eine halbe Sekunde?} - - Der Interrupt-Handler wird gemäß Hinweis 488mal pro Sekunde aufgerufen. - Bei jedem 256sten Aufruf ändert sich das LED-Muster. - Eine Phase dauert somit $\frac{256}{488} \approx 0.52$ Sekunden. - - \item[(e)] - \textbf{Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?} - - Deklaration eines Interrupt-Handlers für den Timer-Interrupt Nr.\ 0 - \end{itemize} - -\end{document} diff --git a/README.md b/README.md index 6d7fb5b14539c00b1fd140423766eb0d2fb104d5..8a0dca3f9b234fc16cb6ae158106d77687753a50 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Vortragsfolien und Beispiele: * [02.01.2020: Quantencomputer, Datensicherheit und Datenschutz](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/hp-20200102.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200102/) * [09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-20200109.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200109/) * [16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-20200116.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200116/) - * [23.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/) + * [23.01.2020: Objektorientierte Programmierung, Datenstrukturen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/) * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf) Übungsaufgaben: @@ -59,7 +59,8 @@ Musterlösungen: * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-musterloesung-20191107.pdf) * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-musterloesung-20191114.pdf) * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-musterloesung-20191121.pdf) - * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191121.pdf) + * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191128.pdf) + * [23.01.2020: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-musterloesung-20200123.pdf) Tafelbilder: ------------ diff --git a/hp-slides-2019ws.pdf b/hp-slides-2019ws.pdf index e58c987c624249785e642c33b8475ad5a6c6db0b..c595e42272702a392ba628da579edda7245a0242 100644 Binary files a/hp-slides-2019ws.pdf and b/hp-slides-2019ws.pdf differ diff --git a/hp-slides-2019ws.tex b/hp-slides-2019ws.tex index c976bd232a8ca75a32615f181e26bd6bc81ac5a9..8d98f8761191d0652da4f3bedc1f95891c1373a3 100644 --- a/hp-slides-2019ws.tex +++ b/hp-slides-2019ws.tex @@ -38,4 +38,6 @@ \includepdf[pages=-]{20200109/hp-20200109.pdf} \pdfbookmark[1]{16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung}{20200116} \includepdf[pages=-]{20200116/hp-20200116.pdf} + \pdfbookmark[1]{23.01.2020: Objektorientierte Programmierung, Datenstrukturen}{20200123} + \includepdf[pages=-]{20200123/hp-20200123.pdf} \end{document}