Doku fertig

This commit is contained in:
Johannes Theiner 2021-01-02 14:07:36 +01:00
parent 28470a46a5
commit 17e2e31d10
3 changed files with 60 additions and 14 deletions

0
build.sh Normal file → Executable file
View File

View File

@ -27,7 +27,6 @@ anchorcolor = black]{hyperref}
\RequirePackage[nolist, footnote]{acronym}
\RequirePackage{enumitem}
\RequirePackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
\RequirePackage{titlesec}
\RequirePackage{tikz}
\RequirePackage[bottom=5em]{geometry}
\RequirePackage{svg}
@ -43,18 +42,21 @@ anchorcolor = black]{hyperref}
\usetikzlibrary{positioning, shapes.geometric}
\RequirePackage[]{draftwatermark}
\RequirePackage[final]{draftwatermark}
%watermark
\SetWatermarkText{Preview}
\SetWatermarkColor{red}
\SetWatermarkFontSize{35.83pt}
\titlespacing\section{0pt}{12pt}{10pt}
\titlespacing\subsection{0pt}{5pt}{5pt}
\titlespacing\subsubsection{0pt}{5pt}{5pt}
\titlespacing*{\paragraph}{0pt}{12pt}{5pt}[50pt]
\titlespacing*{\subparagraph}{0pt}{12pt}{5pt}[50pt]
%\titlespacing\section{0pt}{12pt}{10pt}
%\titlespacing\subsection{0pt}{5pt}{5pt}
%\titlespacing\subsubsection{0pt}{5pt}{5pt}
%\titlespacing*{\paragraph}{0pt}{12pt}{5pt}[50pt]
%\titlespacing*{\subparagraph}{0pt}{12pt}{5pt}[50pt]
\RedeclareSectionCommand[beforeskip=0pt,afterindent=false]{section}
\RedeclareSectionCommand[beforeskip=0pt,afterindent=false]{subsection}
\setitemize{noitemsep,topsep=0pt,parsep=0pt,partopsep=0pt}
\setlist[enumerate]{noitemsep, topsep=0pt, parsep=0pt, partopsep=0pt}
@ -82,7 +84,7 @@ autogobble
%https://tex.stackexchange.com/a/391042
\newcommand{\und}{\\ & & }
\graphicspath{{include/}}
\graphicspath{{include}}
\newcommand{\link}[1]{\footnote{\url{#1}}}
@ -135,7 +137,7 @@ autogobble
\vspace*{50pt}
\begin{center}
\includegraphics[scale=1.0]{hsel-logo}
\includegraphics{hsel-logo}
\end{center}
\vspace*{200pt}
@ -164,4 +166,4 @@ autogobble
\end{titlepage}
}
\endinput
\endinput

View File

@ -11,8 +11,6 @@
\maketitle
%\tableofcontents
\section{Tasks}\label{sec:tasks}
Um einen konsistenten Startpunkt zu erhalten werden bei allen Tasks zu Beginn sämtliche vom entsprechenden
@ -183,7 +181,53 @@
\end{figure}
\section{Hilfsfunktionen}\label{sec:functions}
\lipsum[2-4]
\section{Hilfsfunktionen}\label{sec:functions}
Zur Vereinfachung des Leseflusses und der besseren Nachvollziehbarkeit des Codes werden wiederkehrende Programmteile in Hilfsfunktionen ausgelagert.
Passiert während des Durchlaufens der einzelnen Funktionen ein Fehler,
so wird die erste hier beschriebene Hilfsfunktion aufgerufen.
\subsection{void end(bool fail)}\label{subsec:void end(bool fail)}
Bei Aufruf dieser Hilfsfunktion werden sämtliche Taks, Mailboxen, Modbus-Verbindungen und Semaphoren deinitialisiert und der Timer gestoppt.
Falls der Übergabeparameter \mintinline{c}{fail == true} ist, so wird eine entsprechende Nachricht auf der Konsole ausgegeben.
\subsection{int readAll(int type, int *result)}\label{subsec:int readAll(int type, int *result)}
Das Auslesen aller zur Verfügung stehenden Bits, abhängig vom Typ der Verbindung, erfolgt mithilfe der nicht Thread-sicheren Funktion readAll.
Dabei wird dieser Funktion sowohl der Verbindungs-Typ (\mintinline{c}{DIGITAL_IN, DIGITAL_OUT, ANALOG_IN, ANALOG_OUT}),
als auch ein Pointer auf den Speicherplatz übergeben, an welchem das Ergebnis gespeichert wird.
Bei erfolgreichem Durchlaufen dieser Funktion wird eine 0 zurückgegeben, ansonsten eine 1.
\subsection{int readData(int part)}\label{subsec:int readData(int part)}
Im Gegensatz zur Hilfsfunktion \mintinline{c}{readAll()} liest die Funktion readData nur ein einzelnes Bit aus und gibt dieses zurück.
Damit die Richtigkeit der Daten während des Auslesens gewährleistet werden kann,
ist diese Funktion mithilfe einer Semaphore Thread-sicher gemacht worden.
Nach dem Auslesen aller Bits des Modbus wird der Wert der Funktion \mintinline{c}{readAll()} mit der in \mintinline{c}{part} übergebenen Bitmaske verundet und somit isoliert.
Dieses einzelne Bit wird nun in \mintinline{c}{result} gespeichert und die Semaphore wieder freigegeben.
Bei fehlerfreiem Aufruf der \mintinline{c}{readAll()}-Funktion wird das spezifizierte einzelne Bit zurückgeben, falls nicht,
so wird in die \mintinline{c}{end()}-Hilfsfunktion gesprungen und alle Tasks, Mailboxen, etc deinitialisiert und gestoppt.
\subsection{void disable(int actor)}\label{subsec:void disable(int actor)}
Diese Funktion deaktiviert den im Übergabeparameter spezifizierten Aktor.
Da auch in diesem Fall die Daten aus dem Modbus während des Lesezugriffs nicht verändert werden dürfen ist diese Funktion Thread-sicher.
Zur Kommunikation mit dem jeweiligen Aktor wird die gesamte Bitfolge über \emph{readAll()} ausgelesen.
Ist dies ohne Fehler geschehen, so wird die empfangene Bitfolge mit der negierten Bitmaske des anzusprechenden Aktors verundet.
Diese neue, sich nur in einem Bit unterscheidende Bitfolge wird auf den Modbus geschrieben und die Semaphore freigegeben.
\subsection{void sendMail(MBX * mailbox, int msg)}\label{subsec:void sendMail(MBX * mailbox, int msg)}
Das Senden einer blockierenden Nachricht (\mintinline{c}{msg}) an eine über mailbox spezifierte Mailbox wird mithilfe dieser Funktion realisiert.
\subsection{void sendMailNonBlocking(MBX * mailbox, int msg)}\label{subsec:void sendMailNonBlocking(MBX * mailbox, int msg)}
Im Unterschied zur Funktion \mintinline{c}{sendMail()} wird hier eine nicht-blockierende Nachricht (msg) an die in mailbox spezifizierte Mailbox gesendet.
\subsection{int receiveMail(MBX * mailbox)}\label{subsec:int receiveMail(MBX * mailbox)}
Diese Hilfsfunktion fasst das Erhalten einer blockierenden Nachricht an der im Übergabeparameter spezifizierten Mailbox
zusammen und gibt den Nachrichteninhalt zurück.
\subsection{int receiveMailNonBlocking(MBX * mailbox)}\label{subsec:int receiveMailNonBlocking(MBX * mailbox)}
Analog zu \mintinline{c}{receiveMail()} wird auch hier einen Nachricht an der im Übergabeparamter spezifizierten Mailbox erhalten und deren Inhalt zurückgegeben,
jedoch ist diese nicht blockierend.
\subsection{void sleepMs(int ms)}\label{subsec:void sleepMs(int ms)}
Da bei der Kommunikation der Tasks untereinander oder der Abarbeitung an den einzelnen Stationen teilweise Pausen benötigt werden,
ist diese Funktion unerlässlich. Dabei wird mithilfe des Übergabeparameters festgelegt, für wie viele Millisekunden ein Tasks pausieren soll.
\end{document}