Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 2015ss
  • 2016ss
  • 2016ws
  • 2017ss
  • 2017ws
  • 2018ws
  • 2019ss
  • 2019ws
  • 2020ws
  • 2021ws
  • 2022ws
  • 2023ws
  • 2024ss
  • 2025ss
14 results

Target

Select target project
  • pgerwinski/es
  • MPeth/es
2 results
Select Git revision
  • 2015ss
  • 2016ss
  • 2016ws
  • 2017ss
  • 2017ws
  • 2018ws
  • 2019ss
  • 2019ws
  • 2020ws
  • 2021ws
  • 2022ws
  • MPeth-2022ws-patch-01682
12 results
Show changes

Commits on Source 103

3 additional commits have been omitted to prevent performance issues.
Showing
with 1412 additions and 2 deletions
../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
File moved
No preview for this file type
% es-20250327.pdf - Lecture Slides on Embedded Systems
% Copyright (C) 2013-2024, 2025 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: Einführung: eingebettete Systeme, Wiederholung: hardwarenahe Programmierung, Unix
\documentclass[10pt,t]{beamer}
\usepackage{pgslides}
\usepackage{rotating}
\usepackage{tikz}
\newcommand{\underconstruction}{%
\begin{picture}(0,0)
\put(9,0.9){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}}
\put(9,0.6){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}}
\end{picture}}
\title{Eingebettete Systeme}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{27.\ März 2025}
\newcommand{\greyurl}[1]{\href{#1}{\color{gray}\nolinkurl{#1}}}
\newcommand{\redhref}[2]{\href{#1}{\color{red}\nolinkurl{#2}}}
\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C}
\begin{document}
\iffalse
\maketitleframe
\else
\begin{frame}[plain,fragile]
\vspace*{8cm}
\begin{picture}(0,0)
% \put(12.3,8.0){\makebox(0,0)[tr]{\LARGE\bf\color{gray}\shortstack[r]{%
% {\normalsize Software-Entwicklung für}\\[0.5ex]
\put(12.3,8.0){\makebox(0,0)[tr]{\LARGE\bf\color{gray}\shortstack[r]{%
Eingebettete Systeme\\[2ex]
% \makebox(0,0)[br]{\color{yellow}\rule{5cm}{3cm}}%
% \makebox(0,0)[br]{\includegraphics[trim=0.98cm 13.60cm 0.98cm 13.59cm,width=5cm]{logo-hochschule-bochum-de-wide.pdf}}\\[2cm]
\includegraphics[trim=0.98cm 13.60cm 0.98cm 13.59cm,width=6.4cm]{logo-hochschule-bochum-de-wide.pdf}\\[2ex]
\large Sommersemester 2025}}}
%\put(9.5,6.677) % zum Vergleich
\put(0.0,8.0){\makebox(0,0)[tl]{\includegraphics[width=3.5cm]{logo-hochschule-bochum-cvh-text-v3.pdf}}}
\end{picture}%
\begin{picture}(-0.3,-0.5)
% \put(0,0.5){\includegraphics[width=5.6cm]{floppys.jpg}}
\put(0,-0.3){\includegraphics[width=5.6cm]{wetterstation.jpg}}
\end{picture}%
\begin{picture}(0,0)
\put(0.4,4.1){\includegraphics[width=5.4cm]{floppys.jpg}}
% \put(1.7,3.1){\includegraphics[width=6.3cm]{hexapode.png}}
\end{picture}%
\begin{picture}(0,0)
\put(6.1,-0.7){\includegraphics[width=6cm]{csa2.jpg}}
\end{picture}
\begin{picture}(0,0)
\put(0.2,-1.1){\makebox(0,0)[bl]{\bf\color{gray}\shortstack[l]{\insertauthor\\[\smallskipamount]\insertdate}}}
\put(12.4,-1.1){\makebox(0,0)[r]{%
\greyurl{https://www.peter.gerwinski.de/}%
\visible<2->{\redhref{https://www.peter.gerwinski.de/physik/}{physik/}}}}
\put(3.55,-0.95){\only<2->{\makebox(0,0)[br]{\tikz{\draw[-latex,red](0,0)--(-0.75,0.25);}}}}
\put(3.2,-0.8){\only<2->{\makebox(0,0)[tl]{\footnotesize\color{red}\shortstack{%
\emph{rerum naturalium}\\der Naturwissenschaften}}}}
\end{picture}
\end{frame}
\fi
\sectionnonumber{Vorab: Online-Werkzeuge}
\begin{frame}
\showsectionnonumber
\begin{itemize}
\item
Diese Veranstaltung findet \textbf{in Präsenz} statt.\\
Wir versuchen aber, auch eine Online-Teilnahme zu ermöglichen.
\medskip
\item
\textbf{Mumble}: Seminarraum 2\\
Fragen: Mikrofon einschalten oder über den Chat\\
Umfragen: über den Chat -- \textbf{auch während der Präsenz-Veranstaltung}
\smallskip
\item
\textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\
Eigenen Bildschirm freigeben: VNC-Software oder Web-Interface \emph{yesVNC}\\
Eigenes Kamerabild übertragen: Web-Interface \emph{CVH-Camera}
\smallskip
\item
Allgemeine Informationen:
\url{https://www.cvh-server.de/online-werkzeuge/}
\smallskip
\item
Notfall-Schnellzugang: \url{https://www.cvh-server.de/virtuelle-raeume/}\\
Seminarraum 2, VNC-Passwort: \lstinline[style=cmd]{testcvh}
% \smallskip
% \item
% Bei Problemen: bitte notieren:\\
% Art des Problems, genaue Uhrzeit, eigener Internet-Zugang
\bigskip
\item
\textbf{Lehrmaterialien:} \url{https://gitlab.cvh-server.de/pgerwinski/es}
\end{itemize}
\end{frame}
\section{Einführung}
\subsection{Was sind eingebettete Systeme?}
\begin{frame}
\showsubsectionnonumber
\emph{Der Ausdruck \textbf{\newterm{eingebettetes System\/}} (\dots\,) bezeichnet
einen elektronischen Rechner oder auch Computer,
der in einen technischen Kontext eingebunden (eingebettet) ist.}
\vspace*{-0.5cm}
\begin{flushright}
\url{https://de.wikipedia.org/wiki/Eingebettetes_System}
\end{flushright}
\begin{itemize}
\pause
\item
\emph{keine\/} Aussage über die Größe
\item
in der Praxis: so klein wie möglich\only<4->{, z.\,B.:}\\[\smallskipamount]
\only<3>{\vspace*{-3.3cm}\hspace*{0.7cm}\includegraphics[height=8cm]{csa2.jpg}\hspace*{-1cm}\vspace*{-8cm}}
\pause
\pause
\begin{itemize}
\item
mehrere Rechnerschränke
\item
Industrie-PC
\item
Einplatinencomputer
\item
Mikro-Controller
\end{itemize}
\pause
\item
Bedienung über spezielle Ein-/Ausgabegeräte (z.\,B.\ PKW, Telefon)
\pause
\item
Wartung über speziellen Adminstrator-Zugang
\begin{itemize}
\item
Bus-Schnittstelle (RS-232, CAN-BUS)
\item
Netzwerk (TCP/IP, Ethernet oder WLAN)
\end{itemize}
\pause
\item
Programmierung oft außerhalb des Systems\\
(Cross-Entwicklungswerkzeuge)
\end{itemize}
\vspace*{-1cm}
\end{frame}
\subsection{In dieser Lehrveranstaltung}
\begin{frame}
\showsubsectionnonumber
\vspace*{-\medskipamount}
\begin{itemize}
\item
Auffrischung: Hardwarenahe Programmierung
\item
Auffrischung bzw.\ neu: Einführung in Unix
\item
Auffrischung bzw.\ neu: TCP/IP in der Praxis
\item
Neu: Bus-Systeme
\item
Neu: Echtzeit-Systeme
\item
\dots
\medskip
\item
\textbf{Prüfungsleistung:} Projektaufgabe
\only<2->{{\color{red}\textarrow\ Projektaufgabe überlegen}}\\
Eingebettetes System eigener Wahl zum Laufen bringen
\item
Statt Klausur: Hausarbeit mit Kolloquium
\item
Details werden in der Lehrveranstaltung abgesprochen.
\medskip
\item
% \textbf{Praktikum:} 3 Versuche
% \textbf{Praktikum:} Details stehen noch nicht fest
\textbf{Praktikum:} kombiniert mit der Prüfungsleistung\\
(Details werden noch festgelegt.)
% \item
% Details werden in der Lehrveranstaltung bekanntgegeben.
\medskip
\item
\textbf{Lehrmaterialien:} \url{https://gitlab.cvh-server.de/pgerwinski/es}
% \item
% Termine (Praktika, Kolloquien)\\
% werden in der Lehrveranstaltung abgesprochen\\
% und via GitLab bekanntgegeben (Datei: \file{termine.txt})
\end{itemize}
\iffalse
\bigskip
{\color{gray}
Weitere Ideen:
\begin{itemize}
\item
{\color{black}im Sommer: Exkursion: Lufthansa Aviation Training, Frankfurt am Main}
\item[\color{gray}$\bullet$]\color{gray}
falls möglich: Exkursion: TFC -- Simulatoren und Technik GmbH, Velbert-Nierenhof
\item[\color{gray}$\bullet$]\color{gray}
Einführung in die GUI-Programmierung
\item[\color{gray}$\bullet$]\color{gray}
Web-Interfaces
\end{itemize}}
\vspace*{-1cm plus 1filll}
\underconstruction
\fi
\end{frame}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es}}}
\begin{itemize}
\color{medgreen}
\item[1.1] Was sind eingebettete Systeme?
% \item[1.2] Vertiefung Systemtechnik
\item[1.2] In dieser Lehrveranstaltung
\end{itemize}
\item[\textbf{2}] \textbf{Hardwarenahe Programmierung}
\item[\textbf{3}] \textbf{Einführung in Unix}
% \begin{itemize}
% \item[2.1] \color{red}Grundkonzepte
% \item[2.2] Die Kommandozeile: Grundlagen
% \item[2.3] Dateisysteme
% \item[2.4] Ein- und Ausgabeströme
% \item[2.5] Pipes
% \item[2.6] Verzweigungen und Schleifen
%% \item[\dots]
% \end{itemize}
% \color{gray}
\item[\textbf{4}] \textbf{TCP/IP in der Praxis}
\vspace*{-\smallskipamount}
\item[\textbf{\dots}]
\end{itemize}
% \vspace*{-1cm plus 1filll}
%
% \underconstruction
\end{frame}
\section{Hardwarenahe Programmierung}
\begin{frame}
\showsection
\begin{itemize}
\item
\href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241017/hp-uebung-20241017.pdf}%
{Übungsaufgaben 1, 17.\,10.\,2024:\\Schaltjahr ermitteln, Multiplikationstabelle,\\Fibonacci-Zahlen, fehlerhaftes Programm}
\item
\href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241121/hp-uebung-20241121.pdf}%
{Übungsaufgaben 5, 21.\,11.\,2024:\\Zahlensysteme, Mikrocontroller, LED-Blinkmuster}
\item
\href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20241212/hp-uebung-20241212.pdf}%
{Übungsaufgabe 8.1, 12.\,12.\,2024:\\Trickprogrammierung}
\item
\href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/2024ws/20250109/hp-uebung-20250109.pdf}%
{Übungsaufgabe 10.1, 9.\,1.\,2025:\\Personen-Datenbank}
\end{itemize}
\end{frame}
\iffalse
\subsection{Arrays und Zeiger für Fortgeschrittene}
\begin{frame}[fragile]
\showsubsection
\begin{minipage}[t]{6cm}
Array:
\smallskip
\begin{lstlisting}[gobble=6]
char a[] = "Test";
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[t]{6cm}
Zeiger:
\smallskip
\begin{lstlisting}[gobble=6]
char *p = "Test";
\end{lstlisting}
\end{minipage}
\bigskip
\begin{itemize}
\item
In beiden Fällen wird ein Array von ganzen Zahlen\\
(5 \lstinline{char}-Variable mit den Werten 84, 101, 115, 116 und 0)\\
im Speicher angelegt.
\medskip
\item
Links heißt das Array \lstinline{a};
rechts ist es "`anonym"'.
\item
Rechts wird zusätzlich ein Zeiger \lstinline{p} im Speicher angelegt,\\
der auf das (anonyme) Array zeigt.
\medskip
\item
\lstinline{&a} ist dasselbe wie \lstinline{a},
nämlich die Adresse des Arrays.
\item
\lstinline{&p} ist die Adresse des Zeigers.
\item
\lstinline{p} ist der Wert des Zeigers,\\
momentan also die Adresse des (anonymen) Arrays.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{minipage}[t]{6cm}
Array:
\smallskip
\begin{lstlisting}[gobble=6]
char a[] = "Test";
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[t]{6cm}
Zeiger:
\smallskip
\begin{lstlisting}[gobble=6]
char *p = "Test";
\end{lstlisting}
\end{minipage}
\bigskip
\begin{itemize}
\item
In beiden Fällen wird ein Array von ganzen Zahlen\\
(5 \lstinline{char}-Variable mit den Werten 84, 101, 115, 116 und 0)\\
im Speicher angelegt.
\medskip
\item
Links heißt das Array \lstinline{a};
rechts ist es "`anonym"'.
\item
Rechts wird zusätzlich ein Zeiger \lstinline{p} im Speicher angelegt,\\
der auf das (anonyme) Array zeigt.
\medskip
\item
\lstinline{&a} ist {\color{red}fast} dasselbe wie \lstinline{a},\\
nämlich die Adresse des Arrays {\color{red}bzw.\ das Array selbst,\\
das zuweisungskompatibel zu einem Zeiger auf Elemente des Arrays ist.\\
\lstinline{&} bewirkt hier eine (nicht explizite!) Typumwandlung.}
\item
\lstinline{&p} ist die Adresse des Zeigers.
\item
\lstinline{p} ist der Wert des Zeigers,\\
momentan also die Adresse des (anonymen) Arrays.
\end{itemize}
\vspace*{-1cm}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{minipage}[t]{7cm}
Array:
\smallskip
\begin{lstlisting}[gobble=6]
char *a[] = { "Dies", "ist", "ein", "Test" };
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[t]{5cm}
Zeiger:
\smallskip
\begin{lstlisting}[gobble=6]
char **p = a;
\end{lstlisting}
\end{minipage}
\bigskip
\begin{itemize}
\item
Array von Zeigern auf \lstinline{char}-Variable
\item
Zeiger auf das Array = Zeiger auf Zeiger auf \lstinline{char}-Variable
\item
Schleife durch äußeres Array mit \lstinline{p++} möglich
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{minipage}[t]{7cm}
Array:
\smallskip
\begin{lstlisting}[gobble=6]
char a[][5] = { "Dies", "ist", "ein", "Test" };
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}[t]{5cm}
Zeiger:
\smallskip
\begin{lstlisting}[gobble=6]
char *p = a[0];
\end{lstlisting}
\end{minipage}
\bigskip
\begin{itemize}
\item
zweidimensionales Array von \lstinline{char}-Variablen
\item
Zeiger auf Array-Komponente\\
= Zeiger auf eindimensionales Array\\
= Zeiger auf \lstinline{char}-Variable
\item
Schleife durch äußeres Array mit Zeiger-Arithmetik nicht möglich
\end{itemize}
\begin{picture}(0,0)
\color{red}
\thicklines
\put(8.6,0.63){\line(1,0){0.85}}
\put(9.05,0.4){\makebox(0,0)[t]{$\overbrace{\mbox{nur mit Trick:
\lstinline{p += 5}}}$}}
\end{picture}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
typedef char string5[5];
string5 a[] = { "Dies", "ist", "ein", "Test" };
string5 *p = a;
\end{lstlisting}
\bigskip
\begin{itemize}
\item
Array von Array von \lstinline{char}-Variablen\\
= zweidimensionales Array von \lstinline{char}-Variablen
\item
Zeiger auf zweidimensionales Array
\item
Schleife durch äußeres Array mit \lstinline{p++} möglich
\bigskip
\arrowitem
Fazit:\\
Ein Hoch auf \lstinline{typedef}!
\arrowitem
Trotzdem: {\color{red}Vorsicht!}\\
Ein \lstinline{p++} auf einen Zeiger vom Typ \lstinline{string5 *p}\\
ergibt anscheinend undefiniertes Verhalten!
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
typedef char string5[5];
string5 *p = { "Dies", "ist", "ein", "Test" };
\end{lstlisting}
\bigskip
\begin{itemize}
\item
anonymes Array von Array von \lstinline{char}-Variablen\\
= anonymes zweidimensionales Array von \lstinline{char}-Variablen
\item
Zeiger auf zweidimensionales Array
\item
Schleife durch äußeres Array mit \lstinline{p++} möglich
\end{itemize}
% \pause
\begin{picture}(0,0)(-2,-0.4)
\color{red}
\thicklines
\put(0,0){\line(2,1){4}}
\put(0,2){\line(2,-1){4}}
\end{picture}
Das Konstrukt \lstinline|{ "Dies", "ist", "ein", "Test" }|\\
steht für ein Array von 4 Zeigern auf \lstinline{char}-Variable.
\smallskip
\lstinline{string5 *p} hingegen erwartet einen Zeiger auf ein Array
von 5 \lstinline{char}-Variablen.
\smallskip
Es bekommt die Adresse von \lstinline{"Dies"} zugewiesen.
\smallskip
Durch das Erhöhen von \lstinline{p} (um 5) zeigt es danach
\emph{zufällig\/} auf das \lstinline{"ist"}.
Bei nochmaligem Erhöhen zeigt es auf das \lstinline{"in"} von \lstinline{"ein"}.
\smallskip
(Auch ohne Optimierung werden die Strings \lstinline{"ist"}, \lstinline{"ein"}
und \lstinline{"Test"}\\
u.\,U.\ wegoptimiert.)
\end{frame}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es}}}
\begin{itemize}
\color{medgreen}
\item[1.1] Was sind eingebettete Systeme?
% \item[1.2] Vertiefung Systemtechnik
\item[1.2] In dieser Lehrveranstaltung
\end{itemize}
\item[\textbf{2}] \textbf{C für Fortgeschrittene}
\begin{itemize}
\color{medgreen}
\item[2.1] Hardwarenahe Programmierung
\item[2.2] Arrays und Zeiger für Fortgeschrittene
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in Unix}
% \begin{itemize}
% \item[2.1] \color{red}Grundkonzepte
% \item[2.2] Die Kommandozeile: Grundlagen
% \item[2.3] Dateisysteme
% \item[2.4] Ein- und Ausgabeströme
% \item[2.5] Pipes
% \item[2.6] Verzweigungen und Schleifen
%% \item[\dots]
% \end{itemize}
% \color{gray}
\item[\textbf{4}] \textbf{TCP/IP in der Praxis}
\vspace*{-\smallskipamount}
\item[\textbf{\dots}]
\end{itemize}
% \vspace*{-1cm plus 1filll}
%
% \underconstruction
\end{frame}
\section{Einführung in Unix}
\subsection{Grundkonzepte}
\begin{frame}
\begin{minipage}[b]{6.5cm}
\showsection
\vspace{-\medskipamount}
\showsubsection
\end{minipage}
\begin{description}
\addtolength{\leftskip}{-1cm}
\item[1965]
Vorgänger: Multics (Multiplexed Information and Computing Service)\\
"`überladen"'
\item[1970]
Unix: Einfachheit als Grundkonzept
\item[1972]
Umstellung auf neu entwickelte Programmiersprache C
\item[1975]
AT\&T: Unix inkl.\ Quelltext für Universitäten
\item[1977]
Berkeley Software Distribution (BSD)
\item[1983]
GNU-Projekt
\item[1987]
Minix
\item[1991]
Linux
\item[1993]
FreeBSD, NetBSD
\item[1994]
OpenBSD
\item[2000]
Darwin (Mac OS X, BSD-basiert)
\item[2008]
Android (Linux-basiert)
\end{description}
\end{frame}
\begin{frame}[fragile]
\begin{minipage}[b]{6.5cm}
\showsection
\vspace{-\medskipamount}
\showsubsection
Unix und C: Einfachheit als Grundkonzept
% \vspace{-\bigskipamount}
\begin{itemize}
\item
Vermeiden von Ausnahmen
\item[\color{lightgray}$\bullet$]
\color{lightgray}Baukastensystem
\end{itemize}
\end{minipage}\hspace*{0.5cm}%
\begin{minipage}[b]{5cm}
\small
C: Hauptprogramm\\
= "`normale"' Funktion
\medskip
\begin{lstlisting}[gobble=6]
int main (int argc, char **argv)
{
printf ("Hello, world!\n");
return 0;
}
\end{lstlisting}
\vspace{-\bigskipamount}
\end{minipage}
\bigskip
\bigskip
Unix: übergeordnetes Verzeichnis = "`normales"' Verzeichnis
\medskip
\begin{lstlisting}[style=terminal]
cassini/home/peter/foo> ¡ls -la¿
insgesamt 24
drwxr-xr-x 2 peter peter 4096 Okt 6 13:30 .
drwxr-xr-x 172 peter peter 20480 Okt 6 13:30 ..
cassini/home/peter/foo> ¡cd ..¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\begin{minipage}[b]{6.5cm}
\showsection
\vspace{-\medskipamount}
\showsubsection
Unix und C: Einfachheit als Grundkonzept
% \vspace{-\bigskipamount}
\begin{itemize}
\item
Vermeiden von Ausnahmen
\item
Baukastensystem
\end{itemize}
\end{minipage}%
\begin{minipage}[b]{5.5cm}
\small
C: Bibliotheken
\smallskip
z.\,B.: \lstinline{printf()} = "`normale"' Funktion\\
aus eine Bibliothek (\file{libc})
\end{minipage}
\bigskip
\bigskip
Unix: Programme arbeiten zusammen
\medskip
\begingroup\small
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo> ¡find . -name "*klausur*.tex" \
| xargs grep -l "PBM-Datei"¿
./2014ws/ainf/20150130.0/ainf-klausur-20150130.tex
./2016ws/hp/20170920.0/klausur.tex
./2016ws/hp/20170206.0/klausur.tex
./2011ws/rarch/20120322.0/rarch-klausur-20120322.tex
./2012ws/klausuren-gerwinski/rarch-klausur-20120322.tex
./2013ws/ainf/20140918.0/ainf-klausur-20140918.tex
./2017ws/hp/20180213.k1/klausur.tex
./2017ws/hp/20180205/klausur.tex
./2015ws/ainf/20160913/ainf-klausur-20160913.tex
\end{lstlisting}
\endgroup
\end{frame}
\subsection{Die Kommandozeile: Grundlagen}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
Programm aufrufen: Namen eingeben, z.\,B.: \lstinline[style=cmd]{ls}
\item
Optionen: \lstinline[style=cmd]{ls -l}
\item
Lange Optionen (GNU-Konvention): \lstinline[style=cmd]{ls --help}
\medskip
\item
Text schreiben: \lstinline[style=cmd]{echo "Hello, world!"}
\item
(String-)Variable setzen: \lstinline[style=cmd]{FOO=bar}
\item
Variable abrufen: \lstinline[style=cmd]{echo $FOO}
\end{itemize}
\pause
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo> ¡FOO=ls¿
cassini/home/peter/bo> ¡echo $FOO¿
ls
cassini/home/peter/bo> ¡$FOO¿
2011ws 2012ws 2013ws doc misc projekte
2012ss 2013ss briefe material orga
cassini/home/peter/bo>
\end{lstlisting}
\end{frame}
\begin{frame}
\showsubsection
\begin{itemize}
\item
Befehl zurückholen: Pfeiltasten $\uparrow$, $\downarrow$
\item
Befehl bearbeiten: Pfeiltasten $\leftarrow$, $\rightarrow$ usw.
\item
Befehl vervollständigen: TAB
\item
Befehl rückwärts suchen: Ctrl+R
\item
Bildschirm löschen: Ctrl+L
\item
Befehl abbrechen: Ctrl+C
\bigskip
\pause
\item
Hilfe-Option: \lstinline[style=cmd]{ls --help}
\item
Unix-Handbuch -- \emph{manual\/}: \lstinline[style=cmd]{man ls}\\
(Beenden mit \lstinline[style=cmd]{q})
\end{itemize}
\end{frame}
\begin{frame}
\showsubsection
\begin{itemize}
\item
Verzeichnisse für Programme: \lstinline[style=cmd]{echo $PATH}
\item
Programm in explizitem Verzeichnis aufrufen: \lstinline[style=cmd]{/bin/ls -l}
\item
Programm im aktuellen Verzeichnis aufrufen: \lstinline[style=cmd]{./hello}
\bigskip
\addtolength{\leftskip}{1cm}
\item[MS-DOS:]
Ausführbare Programme werden gefunden,\\
wenn sie im \lstinline[style=terminal]{PATH} stehen\\
\emph{oder\/} sich im aktuellen Verzeichnis befinden.
\smallskip
\item[Unix:]
Ausführbare Programme werden gefunden,\\
wenn sie im \lstinline[style=terminal]{PATH} stehen.
\smallskip
\textarrow\ Vermeiden von Ausnahmen
\pause
\smallskip
Das aktuelle Verzeichnis (\lstinline[style=terminal]{.})
\emph{kann\/} im \lstinline[style=terminal]{PATH} stehen,\\
muß dies aber nicht\only<2>{ --\\
und sollte es aus Sicherheitsgründen auch nicht}.
\end{itemize}
\end{frame}
\subsection{Dateisysteme}
\begin{frame}
\showsubsection
\begin{itemize}
\item
Dateien listen: \lstinline[style=cmd]{ls}\\
langes Listenformat: \lstinline[style=cmd]{ls -l}\\
rückwärts nach Zeit sortiert: \lstinline[style=cmd]{ls -lrt}
\item
Datei ausgeben: \lstinline[style=cmd]{cat hello.c}
\item
Datei anzeigen: \lstinline[style=cmd]{less hello.c}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
Arbeitsverzeichnis anzeigen: \lstinline[style=cmd]{pwd}\\
\item
Arbeitsverzeichnis wechseln: \lstinline[style=cmd]{cd script}\\
(\emph{kein\/} Programm, sondern Shell-Befehl)
\item
übergeordnetes Verzeichnis: \lstinline[style=cmd]{cd ..}
\item
eigenes \newterm{Home-\/}Verzeichnis: \lstinline[style=cmd]{cd}
\item
Wurzelverzeichnis: \lstinline[style=cmd]{cd /}
\item
wieder zurück: \lstinline[style=cmd]{cd -}
\end{itemize}
\pause
\begin{lstlisting}[style=terminal]
cassini/home/peter/bo/2013ss/net/script> ¡cd /usr/bin¿
cassini/usr/bin> ¡cd ../lib¿
cassini/usr/lib> ¡cd¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
Dateien kopieren (\emph{copy\/}): \lstinline[style=cmd]{cp}
\item
Dateien verschieben/umbenennen (\emph{move\/}): \lstinline[style=cmd]{mv}
\item
Dateien löschen (\emph{remove\/}): \lstinline[style=cmd]{rm}
\end{itemize}
\begin{lstlisting}[style=terminal,xleftmargin=-3pt]
cassini/home/peter> ¡cp -p foo/test.txt¿
cp: missing destination file operand after `foo/test.txt'
Try `cp --help' for more information.
cassini/home/peter> ¡cp -p foo/test.txt .¿
cassini/home/peter> ¡mv test.txt bla.txt¿
cassini/home/peter> ¡cat bla.txt¿
Dies ist ein Test.
cassini/home/peter> ¡rm bla.txt¿
cassini/home/peter>
\end{lstlisting}
\medskip
Aktuelles Verzeichnis: \lstinline[style=cmd]{.}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
Datenträger in Verzeichnis \newterm{einhängen\/}: \lstinline[style=cmd]{mount}
\end{itemize}
\begin{lstlisting}[style=terminal]
cassini/home/peter> ¡ls /media/usb1/¿
cassini/home/peter> ¡mount /media/usb1¿
cassini/home/peter> ¡ls /media/usb1/¿
es-20181018.pdf hello.c hexapode KIS-Bericht.pdf
cassini/home/peter> ¡umount /media/usb1¿
cassini/home/peter> ¡ls /media/usb1/¿
cassini/home/peter>
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
\newterm{Zugriffsrechte}
\end{itemize}
\begingroup
% \small
\begin{lstlisting}[style=terminal,gobble=6,xleftmargin=-3pt]
cassini/home/peter/bo/2013ws/ainf/20131031.0> ¡ls -l¿
...
-rw-r--r-- 1 peter peter 1539 Nov 29 2012 orbit-x1.c
\end{lstlisting}
\endgroup
\begin{onlyenv}<2>
\begin{picture}(0,1)
\color{red}
\put(0.3,0){\tikz{\draw[-latex,red](0,0)--(0,1);
\draw[-latex,red](0,0)--(2.5,1);}}
\put(0,-0.1){\makebox(0,0)[tl]{Benutzer (u -- \emph{user\/}) darf lesen und schreiben}}
\end{picture}
\end{onlyenv}
\begin{onlyenv}<3>
\begin{picture}(0,1)
\color{red}
\put(0.84,0){\tikz{\draw[-latex,red](0,0)--(0,1);
\draw[-latex,red](0,0)--(3.2,1);}}
\put(0,-0.1){\makebox(0,0)[tl]{Gruppe (g -- \emph{group\/}) darf lesen}}
\end{picture}
\end{onlyenv}
\begin{onlyenv}<4>
\begin{picture}(0,1)
\color{red}
\put(1.47,0){\tikz{\draw[-latex,red](0,0)--(0,1);}}
\put(0,-0.1){\makebox(0,0)[tl]{alle anderen (o -- \emph{other\/}) dürfen lesen}}
\end{picture}
\end{onlyenv}
\medskip
\pause[5]
\begin{itemize}
\item
Zugriffsrechte ändern:\\
\lstinline[style=cmd]{chmod o-r orbit-1x.c} -- Lesezugriff entziehen\\
\lstinline[style=cmd]{chmod g+w orbit-1x.c} -- Schreibzugriff gewähren\\
\lstinline[style=cmd]{chmod 640 orbit-1x.c} -- auf \lstinline[style=terminal]{-rw-r-----} setzen
\end{itemize}
\pause
\begin{picture}(0,0)
\color{red}
\put(6.15,0.55){\makebox(0,0)[tl]{%
\small
\begin{math}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 6}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 4}%
\underbrace{\rule{0.7em}{0pt}}_{\textstyle 0}
\end{math}}}
\end{picture}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
\newterm{ausführbare\/} Dateien
\end{itemize}
\begingroup
\small
\begin{lstlisting}[style=terminal,gobble=6,xleftmargin=-3pt]
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡cat test¿
ls -l systech-20131008.*
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡chmod +x test¿
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡ls -l test¿
-rwxr-xr-x 1 peter peter 25 Okt 6 16:45 test
cassini/home/peter/bo/2013ws/systech/20131008.0> ¡./test¿
-rw-r--r-- 1 peter peter 4120 Okt 6 16:44 systech-20131008.aux
...
\end{lstlisting}
\endgroup
\pause
\begin{itemize}
\item
ausführbare Textdateien: \newterm{Skripte}
\pause
\smallskip
hier: ausführbare Textdatei mit Shell-Befehlen\\
(ohne spezielle Kennung): Shell-Skript
% \pause
% \smallskip
% Kennung: 1.\ Zeile enthält \lstinline[style=terminal]{#!} und den Interpreter,\\
% z.\,B.\ \lstinline[style=terminal]{#!/bin/bash}\\
\end{itemize}
\end{frame}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/es}}}
\begin{itemize}
\color{medgreen}
\item[1.1] Was sind eingebettete Systeme?
% \item[1.2] Vertiefung Systemtechnik
\item[1.2] In dieser Lehrveranstaltung
\end{itemize}
\item[\textbf{2}] \textbf{C für Fortgeschrittene}
\begin{itemize}
\color{medgreen}
\item[2.1] Hardwarenahe Programmierung
\item[2.2] Arrays und Zeiger für Fortgeschrittene
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in Unix}
\begin{itemize}
\item[2.1] Grundkonzepte
\item[2.2] Die Kommandozeile: Grundlagen
\item[2.3] Dateisysteme
\item[2.4] Ein- und Ausgabeströme
\item[2.5] Pipes
\item[2.6] Verzweigungen und Schleifen
% \item[\dots]
\end{itemize}
% \color{gray}
\item[\textbf{4}] \textbf{TCP/IP in der Praxis}
\vspace*{-\smallskipamount}
\item[\textbf{\dots}]
\end{itemize}
% \vspace*{-1cm plus 1filll}
%
% \underconstruction
\end{frame}
\fi
\end{document}
File moved
#include <stdio.h>
int main (void)
{
int year = 42;
if (year % 4 == 0)
{
if (year % 400 == 0)
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
else if (year % 100 == 0)
{
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
else
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
}
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
if (year % 4 == 0)
{
if (year % 400 == 0)
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
else if (year % 100 == 0)
{
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
else
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
}
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", year);
if (year % 4 == 0)
{
if (year % 400 == 0)
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
else if (year % 100 == 0)
{
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
else
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
}
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
if (year % 4 == 0)
{
if (year % 400 == 0)
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
else if (year % 100 == 0)
{
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
else
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
}
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
if (year <= 1752)
printf ("Zulässige Jahreszahlen: größer als 1752.\n");
else if (year % 4 == 0)
{
if (year % 400 == 0)
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
else if (year % 100 == 0)
{
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
else
{
printf ("%d ist ein Schaltjahr.\n", year);
return 0;
}
}
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
if (year <= 1752)
printf ("Zulässige Jahreszahlen: größer als 1752.\n");
else if (year % 4 == 0)
{
if (year % 400 == 0)
printf ("%d ist ein Schaltjahr.\n", year);
else if (year % 100 == 0)
printf ("%d ist kein Schaltjahr.\n", year);
else
printf ("%d ist ein Schaltjahr.\n", year);
}
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
if (year <= 1752)
printf ("Zulässige Jahreszahlen: größer als 1752.\n");
else if (year % 4 == 0)
if (year % 100 == 0)
if (year % 400 == 0)
printf ("%d ist ein Schaltjahr.\n", year);
else
printf ("%d ist kein Schaltjahr.\n", year);
else
printf ("%d ist ein Schaltjahr.\n", year);
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
int is_leap_year = 0;
if (year <= 1752)
printf ("Zulässige Jahreszahlen: größer als 1752.\n");
else if (year % 4 == 0)
if (year % 100 == 0)
if (year % 400 == 0)
is_leap_year = 1;
else
is_leap_year = 0;
else
is_leap_year = 1;
else
is_leap_year = 0;
if (is_leap_year)
printf ("%d ist ein Schaltjahr.\n", year);
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
int year = 42;
printf ("Jahr: ");
scanf ("%d", &year);
if (year <= 1752)
printf ("Zulässige Jahreszahlen: größer als 1752.\n");
else if (year % 4 == 0 && (year % 400 == 0 || year % 100))
printf ("%d ist ein Schaltjahr.\n", year);
else
printf ("%d ist kein Schaltjahr.\n", year);
return 0;
}
#include <stdio.h>
int main (void)
{
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
printf ("%2d * %2d = %3d \n", i, j, i * j);
}
}
return 0;
}
#include <stdio.h>
int main (void)
{
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
printf ("%2d * %2d = %3d \n", j, i, j * i);
}
}
return 0;
}
#include <stdio.h>
int main (void)
{
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
printf ("%2d * %2d =%3d \n", j, i, j * i);
}
}
return 0;
}
#include <stdio.h>
int main (void)
{
for (int j = 1; j <= 10; j++)
{
for (int i = 1; i <= 10; i++)
{
printf ("%2d * %2d =%3d \n", i, j, i * j);
}
}
return 0;
}
#include <stdio.h>
#include <stdint.h>
int main ()
{
uint64_t fibonacci_zahlen[50];
fibonacci_zahlen[0] = 0;
fibonacci_zahlen[1] = 1;
for (int i = 2; i < 50; i++)
{
fibonacci_zahlen[i] = fibonacci_zahlen[i - 2] + fibonacci_zahlen[i - 1];
}
for (int i = 0; i < 50; i++)
{
printf ("%d. Zahl = %ld\n", i + 1, fibonacci_zahlen[i]);
}
return 0;
}