\section{Architecture}
\subsection{Devices}
The client code for the devices is compiled from one codebase. For a device to
be eligible for \glspl{mTask} it must be able to compile the shared codebase
and implement (part of) the device specific interface. The shared codebase only
uses standard \gls{C} and no special libraries or tricks are used. Therefore
the code is compilable for almost any device or system. Note that it is not
needed to implement a full interface. The full interface excluding the device
specific settings is listed in Appendix~\ref{app:device-interface}. The
interface works in a similar fashion as the \gls{EDSL}. Devices do not have to
implement all functionality, this is analogous to the fact that views do not
have to implement all type classes in the \gls{EDSL}.  When the device connects
for the first time with a server the specifications of what is implemented is
communicated.

At the time of writing the following device families are supported and can run
the device software.
\begin{itemize}
	\item \texttt{POSIX} compatible systems
		
		This includes systems running \emph{Linux} and \emph{MacOS}.
	\item \texttt{STM32} family microcontrollers supported by \texttt{ChibiOS}.

		This is tested in particular on the \texttt{STM32f7x} series \gls{ARM}
		development board.
	\item Microcontrollers programmable by the \emph{Arduino} \gls{IDE}.\\
		
		This does not only include \emph{Arduino} compatible boards but also
		other boards capable of running compiled \emph{Arduino} code. The code
		has been found working on the \texttt{ESP8266} powered \emph{NodeMCU}.
		It is tested on devices as small as the regular \emph{Arduino UNO}
		board that only boasts a meager \emph{2K} of \emph{RAM}.
\end{itemize}

\subsection{Specification}
Devices are stored in a record type and all devices in the system are stored in
a \gls{SDS} containing all devices. From the macro settings in the interface
file a profile is created for the device that describes the specification. When
a connection between the server and a client is established the server will
send a request for specification. The client will serialize his specification
and send it to the server so that the server knows what the client is capable
of. The exact specification is listed in Listing~\ref{lst:devicespec}

\begin{lstlisting}[language=Clean,label={lst:devicespec},
	caption={Device specification for \glspl{mTask}}]
:: MTaskDeviceSpec =
	{haveLed     :: Bool
	,haveAio     :: Bool
	,haveDio     :: Bool
	,bytesMemory :: Int
	}
\end{lstlisting}

\subsection{Memory Management}
\todo{Explain specification, combine task and share space}

\subsection{Communication}
