Skip to content
Snippets Groups Projects
Commit 1f42eb4f authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Vorbereitung 29.11.2021

parent 1ee4804f
Branches
No related tags found
No related merge requests found
Showing
with 2103 additions and 3 deletions
% hp-musterloesung-20211115.pdf - Solutions to the Exercises on Low-Level Programming % hp-musterloesung-20211122.pdf - Solutions to the Exercises on Low-Level Programming
% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski % Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski
% %
% This document is free software: you can redistribute it and/or % This document is free software: you can redistribute it and/or
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
% Attribution-ShareAlike 3.0 Unported License along with this % Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>. % document. If not, see <http://creativecommons.org/licenses/>.
% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, LED-Blinkmuster % README: Ausgabe von Hexadezimalzahlen, Länge von Strings, LED-Blinkmuster
\documentclass[a4paper]{article} \documentclass[a4paper]{article}
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
% Attribution-ShareAlike 3.0 Unported License along with this % Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>. % document. If not, see <http://creativecommons.org/licenses/>.
% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, LED-Blinkmuster % README: Ausgabe von Hexadezimalzahlen, Länge von Strings, LED-Blinkmuster
\documentclass[a4paper]{article} \documentclass[a4paper]{article}
......
#include <stdio.h>
#include <stdint.h>
int main (void)
{
uint64_t x = 4262939000843297096;
char *s = &x;
printf ("%s\n", s);
return 0;
}
#include <stdio.h>
#include <stdint.h>
typedef struct
{
uint32_t a;
uint64_t b;
uint8_t c;
} three_numbers;
int main (void)
{
three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
printf ("%s\n", &xyz);
return 0;
}
File added
This diff is collapsed.
File added
% hp-2021ws-p3.pdf - Labor Notes on Low-Level Programming
% Copyright (C) 2014, 2015, 2018, 2019, 2020, 2021 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: Versuch 3: Weltraum-Simulation
\documentclass[a4paper]{article}
\usepackage{pgscript}
\usepackage{multicol}
%\usepackage{sfmath}
\sloppy
\raggedcolumns
\pagestyle{empty}
\addtolength{\textheight}{1cm}
\newcommand{\sep}{~$\cdot$~}
\newcommand{\mylicense}{CC BY-SA (Version 4.0) oder GNU GPL (Version 3 oder höher)}
\begin{document}
\makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
\makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}
\par\bigskip\bigskip
\begin{center}
\Large\textbf{Praktikumsversuch 3: Weltraum-Simulation}
\par\medskip
\normalsize Hardwarenahe Programmierung\sep
Wintersemester 2021/22\sep
Prof.~Dr.~Peter Gerwinski
\end{center}
Aufgabe: Schreiben Sie ein C-Programm,
das die Bahnen von beliebig vielen Massenpunkten unter Einfluß der Gravitation
simuliert und in bewegter Grafik darstellt.
\begin{multicols}{2}
\begin{itemize}
\item
Zwei Massenpunkte ("`Himmelskörper"') mit den Massen $m_i$ und $m_j$
an den Orten $\vec{r}_i$ und $\vec{r}_j$ ziehen einander an.
Diese Kraft heißt Gravitation. Sie hat den Betrag:
\begin{equation}
|\vec{F}_{ij}| = \frac{m_j\cdot m_i\cdot G}{|\vec{r}_j - \vec{r}_i|^2}
\end{equation}
Hierbei ist $G$ eine Konstante (Gravitationskonstante).
\item
Die auf einen Himmelskörper wirkende Gesamtkraft $\vec{F}_i$
ergibt sich als Summe der von allen anderen Himmelskörpern herrührenden
Gravitationskräfte:
\begin{equation}
\vec{F}_i = \sum_{j=0,\,j\ne i}^{N - 1} \vec{F}_{ij}
\end{equation}
\item
Die Gravitationskraft beschleunigt jeden Himmelskörper gemäß:
\begin{equation}
\vec{F_i} = m_i\cdot \vec{a_i}
\end{equation}
\item
Beispiel: Wir betrachten zwei Himmelskörper. Einer davon ("`Zentralgestirn"')
ruht im Zentrum ($\vec{r}_0 = 0$, $\vec{v}_0 = 0$)
und hat eine wesentlich größere Masse als der andere
("`Satellit"', $m_1 \ll m_0$). Mit geeignetem Anfangsort $\vec{r}_1$
und geeigneter Anfangsgeschwindigkeit $\vec{v}_1$ beschreibt dann
der Satellit eine elliptische Umlaufbahn um das Zentralgestirn.
\item
Wir rechnen in zwei Dimensionen $x$ und $y$.
\item
Für die Zerlegung einer Kraft $\vec{F}_{ij}$ in $x$- und $y$-Komponenten
benötigen Sie nur die Grundrechenarten und die Wurzelfunktion,
jedoch insbesondere \emph{keine} trigonometrischen Funktionen:
\begin{equation}
\vec{F}_{ij} = |\vec{F}_{ij}| \cdot \frac{\vec{r}_j - \vec{r}_i}{|\vec{r}_j - \vec{r}_i|}
\end{equation}
\item
Die Wurzelfunktion \lstinline{sqrt()} finden Sie
in der Mathematik-Bibliothek.
Um diese zu nutzen, verwenden Sie \lstinline{#include <math.h>} im Quelltext,
und geben Sie beim \lstinline[style=cmd]{gcc}-Aufruf
\lstinline[style=cmd]{-lm} mit an.
\columnbreak
\item
Für die Simulation betrachten wir das System in kurzen Zeitintervallen $dt$
und berechnen die Änderungen des Ortes $\vec{r}_i = (x_i,y_i)$
und der Geschwindigkeit $\vec{v}_i = (v_{xi},v_{yi})$ jedes Himmelskörpers
mit Hilfe des expliziten Eulerschen Polygonzugverfahrens.
\par
(Wer möchte, darf natürlich auch andere Verfahren anwenden,
beispielsweise das klassische Runge-Kutta-Verfahren 4.~Ordnung.)
\item
Für eine derartige Simulation
einschließlich ihrer Darstellung als bewegte Grafik
können Sie sich von dem Beispiel-Programm \gitfile{hp}{2020ws/20201217}{gtk-16.c}
inspirieren lassen.
% (Compilieren mit:
% \lstinline[style=cmd]{gcc}
% \lstinline[style=cmd]{-Wall}
% \lstinline[style=cmd]{-O}
% \lstinline[style=cmd]{gtk-16.c}
% \lstinline[style=cmd]{$(pkg-config}
% \lstinline[style=cmd]{--cflags}
% \lstinline[style=cmd]{--libs}
% \lstinline[style=cmd]{gtk+-3.0)}
% \lstinline[style=cmd]{-o}
% \lstinline[style=cmd]{gtk-16})
\item
In einer \file{GTK+}-\lstinline{drawing_area}
liegt der Nullpunkt der Zeichnung oben links,
eine Längeneinheit entspricht einem Pixel,
und die $y$-Koordinate wächst nach unten.
Es empfiehlt sich, die Koordinaten so umzurechnen,
daß der Nullpunkt in der Mitte der Zeichnung liegt,
die Längeneinheit Ihrem persönlichen Geschmack entspricht
und die $y$-Koordinate nach oben wächst.
\item
Beispiel-Szenarien für 3 oder mehr Körper:
\vspace{-\smallskipamount}
\begin{itemize}\itemsep0pt
\item
Planet mit Mond umkreist Sonne
\item
Sonne mit mehreren Planeten, die sich gegenseitig beeinflussen
\item
zwei Sonnen umkreisen sich gegenseitig, Planet kreist drumherum
\item
Raumsonde besucht nacheinander mehrere Planeten
\end{itemize}
\item
\textbf{Hinweis:}
Speichern Sie die verschiedenen Körper nicht als separate Variable,
sondern in einem Array. Ihr Programm wird dadurch nicht nur flexibler,
sondern auch übersichtlicher und weniger fehleranfällig.
\item
\textbf{Online-Abgabe:}
Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte
per E-Mail an \file{peter.gerwinski@hs-bochum.de}
mit dem \textbf{Betreff:} \lstinline[style=terminal]{Poo6va2U}
unter Angabe von Name, Matrikel-Nummer,
Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS).
\end{itemize}
\end{multicols}
\vspace*{-\bigskipamount}
\strut\hfill\emph{Viel Erfolg!}\qquad\qquad
\vfill
\begingroup
\small
\setlength{\leftskip}{3cm}
Stand: 29.\ November 2021
% Soweit nicht anders angegeben:\\
Copyright \copyright\ 2014, 2015, 2018, 2019, 2020, 2021\quad Peter Gerwinski\\
Lizenz: \mylicense
Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext
und Beispielprogramm herunterladen unter:
\url{https://gitlab.cvh-server.de/pgerwinski/hp}
\endgroup
\end{document}
File added
This diff is collapsed.
File added
% hp-uebung-20211122.pdf - Exercises on Low-Level Programming
% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 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: Trickprogrammierung, Thermometer-Baustein an I²C-Bus
\documentclass[a4paper]{article}
\usepackage{pgscript}
\usepackage{gensymb}
\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C}
\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C}
\begin{document}
% \thispagestyle{empty}
\section*{Hardwarenahe Programmierung\\
Übungsaufgaben -- 22.\ November 2021}
Diese Übung enthält Punkteangaben wie in einer Klausur.
Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten
unter Verwendung ausschließlich zugelassener Hilfsmittel
15 Punkte (von insgesamt \totalpoints) erreichen.
\exercise{Trickprogrammierung}
Wir betrachten das folgende Programm (Datei: \gitfile{hp}{2021ws/20211129}{aufgabe-1.c}):
\begin{lstlisting}
#include <stdio.h>
#include <stdint.h>
int main (void)
{
uint64_t x = 4262939000843297096;
char *s = &x;
printf ("%s\n", s);
return 0;
}
\end{lstlisting}
Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt:
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿
aufgabe-1.c: In function `main':
aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...]
$ ¡./aufgabe-1¿
Hallo
\end{lstlisting}
\begin{itemize}
\item[(a)]
Erklären Sie die Warnung beim Compilieren. \points{2}
\item[(b)]
Erklären Sie die Ausgabe des Programms. \points{5}
\item[(c)]
Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3}
\end{itemize}
Hinweis: Modifizieren Sie das Programm
und lassen Sie sich Speicherinhalte ausgeben.
\exercise{Thermometer-Baustein an \ITWOC-Bus}
Eine Firma stellt einen elektronischen Thermometer-Baustein her,
den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann,
um die Temperatur auszulesen.
Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt,
die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt.
Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt,
das langsam auf Zimmertemperatur abkühlt.
Alle 10 Minuten liest ein Programm, das auf dem PC läuft,
die gemessene Temperatur über beide Schnittstellen aus
und erzeugt daraus die folgende Tabelle:
\begin{center}
\renewcommand{\arraystretch}{1.2}
\begin{tabular}{|c|c|c|}\hline
Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline
\phantom{0}0 & 94 & 122 \\\hline
10 & 47 & 244 \\\hline
20 & 30 & 120 \\\hline
30 & 24 & \phantom{0}24 \\\hline
40 & 21 & 168 \\\hline
\end{tabular}
\end{center}
\begin{itemize}
\item[(a)]
Aus dem Vergleich der Meßdaten läßt sich
auf einen Fehler bei der \ItwoC-Übertragung schließen.\\
Um welchen Fehler handelt es sich,
und wie ergibt sich dies aus den Meßdaten?
\points{5}
\item[(b)]
Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)},
die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.
\points{5}
\end{itemize}
\exercise{Speicherformate von Zahlen}
Wir betrachten das folgende Programm (\gitfile{hp}{2021ws/20211129}{aufgabe-3.c}):
\begin{lstlisting}
#include <stdio.h>
#include <stdint.h>
typedef struct
{
uint32_t a;
uint64_t b;
uint8_t c;
} three_numbers;
int main (void)
{
three_numbers xyz = { 1819042120, 2410670883059281007, 0 };
printf ("%s\n", &xyz);
return 0;
}
\end{lstlisting}
Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\
(Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür,
daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.)
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿
aufgabe-2.c: In function "main":
aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but
argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=]
printf ("%s\n", &xyz);
^
$ ¡./aufgabe-2¿
Hallo, Welt!
\end{lstlisting}
\begin{enumerate}[\quad(a)]
\item
Erklären Sie die beim Compilieren auftretende Warnung.
\points{2}
\item
Erklären Sie die Ausgabe des Programms.
\points{4}
\item
Welche Endianness hat der verwendete Rechner?
Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?
\points{2}
\item
Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\
(Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür,
daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)
\begin{lstlisting}[style=terminal,gobble=8]
$ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿
aufgabe-2.c: In function "main":
aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *",
but argument 2 has type "three_numbers * {aka struct <anonymous> *}"
[-Wformat=]
printf ("%s\n", &xyz);
^
$ ¡./aufgabe-2¿
Hall5V
\end{lstlisting}
(Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par
Erklären Sie die geänderte Ausgabe des Programms.
\points{3}
\end{enumerate}
\begin{flushright}
\textit{Viel Erfolg!}
\end{flushright}
\makeatletter
\immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
\makeatother
\end{document}
../common/io-ports-and-interrupts.pdf
\ No newline at end of file
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main (void)
{
uint64_t x = 4262939000843297096;
char *s = &x;
printf ("%lx\n", x);
printf ("%" PRIx64 "\n", x);
printf ("%s\n", s);
return 0;
}
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main (void)
{
uint64_t x = 4262939000843297096;
char *s = &x;
printf ("%lx\n", x);
printf ("%" PRIx64 "\n", x);
printf ("%c %c %c %c %c %c %c %c\n",
0x48, 0x61, 0x6c, 0x6c, 0x6f, 0x00, 0x29, 0x3b);
printf ("%s\n", s);
return 0;
}
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main (void)
{
uint64_t x = 0x48616c6c6f00293b;
char *s = &x;
printf ("%s\n", s);
return 0;
}
#include <stdio.h>
#include <stdint.h>
uint8_t repair (uint8_t data)
{
uint8_t result = 0;
uint8_t mask_data = 0x01;
uint8_t mask_result = 0x80;
while (mask_data)
{
if (data & mask_data)
result |= mask_result;
mask_data <<= 1;
mask_result >>= 1;
}
return result;
}
int main (void)
{
int data[] = { 122, 244, 120, 24, 168, -1 };
int i = 0;
while (data[i] >= 0)
printf ("%d\n", repair (data[i++]));
return 0;
}
../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
../common/logo-hochschule-bochum.pdf
\ No newline at end of file
#include <gtk/gtk.h>
#include <math.h>
int width = 320;
int height = 240;
int gap = height / 20;
int r = gap;
double visual_length = height - 2 * gap - r;
double phi0 = -0.5;
double omega0 = 0.0;
double t0 = 0.0;
double g = 9.81;
double l = 1.0;
double dt = 0.02;
double t = t0;
double phi = phi0;
double omega = omega0;
gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
{
GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
int x = width / 2 + visual_length * sin (phi);
int y = gap + visual_length * cos (phi);
gdk_cairo_set_source_rgba (c, &blue);
cairo_move_to (c, width / 2, gap);
cairo_line_to (c, x, y);
cairo_stroke (c);
cairo_arc (c, x, y, r, 0, 2 * G_PI);
cairo_fill (c);
return FALSE; /* TRUE to stop other handlers from being invoked for the event.
FALSE to propagate the event further. */
}
gboolean timer (GtkWidget *widget)
{
t += dt;
phi += omega * dt;
omega += - dt * g / l * sin (phi);
gtk_widget_queue_draw_area (widget, 0, 0, width, height);
g_timeout_add (50, (GSourceFunc) timer, widget);
return FALSE;
}
int main (int argc, char **argv)
{
gtk_init (&argc, &argv);
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_window_set_title (GTK_WINDOW (window), "Hello");
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
GtkWidget *drawing_area = gtk_drawing_area_new ();
gtk_widget_show (drawing_area);
gtk_container_add (GTK_CONTAINER (window), drawing_area);
gtk_widget_set_size_request (drawing_area, width, height);
g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
g_timeout_add (50, (GSourceFunc) timer, drawing_area);
gtk_main ();
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment