X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=methods.mtask.tex;h=72e66d121a4a7d2e2dc02f12d619effd6a024563;hb=b855f7f75705291002f50f99eab11d4f450cef48;hp=1662d6d64e409e4e8bd98162c02fc502f8f76964;hpb=7b0fe8509016c0841d35239dc87150e945cfd960;p=msc-thesis1617.git diff --git a/methods.mtask.tex b/methods.mtask.tex index 1662d6d..72e66d1 100644 --- a/methods.mtask.tex +++ b/methods.mtask.tex @@ -1,27 +1,27 @@ -The \gls{mTask}-\gls{EDSL} is the basis on which the system is built. The -\gls{mTask}-\gls{EDSL} was created by Koopman et al.\ to support several views -such as an \gls{iTasks} simulation and a \gls{C}-code generator. The \gls{EDSL} -was designed to generate a ready to compile \gls{TOP}-like system for -microcontrollers such as the \gls{Arduino}\cite{koopman_type-safe_nodate}% +The \gls{mTask}-\gls{EDSL} is the language used in the system. The +\gls{mTask}-\gls{EDSL} was created by Koopman et al.\ and supported several +views such as an \gls{iTasks} simulation and a \gls{C}-code generator. The +\gls{EDSL} was designed to generate a ready-to-compile \gls{TOP}-like program +for microcontrollers such as the \gls{Arduino}~\cite{koopman_type-safe_nodate}% \cite{plasmeijer_shallow_2016}. The \gls{mTask}-\gls{EDSL} is a shallowly embedded class based \gls{EDSL} and therefore it is very suitable to have a new backend that partly implements the -given classes. The following sections show the details of the \gls{EDSL} -that are used in this extension. The parts of the \gls{EDSL} that are not used -will not be discussed and the details of those parts can be found in the cited +classes given. The following sections show the details of the \gls{EDSL} that +are used in this extension. The parts of the \gls{EDSL} that are not used will +not be discussed and the details of those parts can be found in the cited literature. A view for the \gls{mTask}-\gls{EDSL} is a type with kind \CI{*->*->*}% \footnote{A type with two free type variables.} that implements some of the classes given. The types do not have to be present as fields in the higher -kinded view and can, and will most often, solely be phantom types. A view is of -the form \CI{v t r}. The first type variable will be the type of the view, the -second type variable will be the type of the \gls{EDSL}-expression and the -third type variable represents the role of the expression. Currently the role -of the expressions form a hierarchy. The three roles and their hierarchy are -shown in Listing~\ref{lst:exprhier}. This implies that everything is a -statement, only a \CI{Upd} and a \CI{Expr} are expressions. The \CI{Upd} +kinded view and can, and will most often, be exclusively phantom types. A view +is of the form \CI{v t r}. The first type variable will be the type of the +view. The second type variable will be the type of the \gls{EDSL}-expression +and the third type variable represents the role of the expression. Currently +the role of the expressions form a hierarchy. The three roles and their +hierarchy are shown in Listing~\ref{lst:exprhier}. This implies that everything +is a statement, only a \CI{Upd} and a \CI{Expr} are expressions. The \CI{Upd} restriction describes updatable expressions such as \gls{GPIO} pins and \glspl{SDS}. @@ -40,10 +40,10 @@ instance isExpr Expr Expressions in the \gls{mTask}-\gls{EDSL} are divided into two types, namely boolean expressions and arithmetic expressions. The class of arithmetic language constructs also contains the function \CI{lit} that lifts a -host-language value in to the \gls{EDSL} domain. All standard arithmetic +host-language value into the \gls{EDSL} domain. All standard arithmetic functions are included in the \gls{EDSL} but are omitted in the example for brevity. Moreover, the class restrictions are only shown in the first functions -and omitted in subsequent funcitons. Both the boolean expression and arithmetic +and omitted in subsequent functions. Both the boolean expression and arithmetic expression classes are shown in Listing~\ref{lst:arithbool}. \begin{lstlisting}[label={lst:arithbool}, @@ -62,18 +62,18 @@ class boolExpr v where \section{Control flow} Looping of \glspl{Task} happens because \glspl{Task} are executed after waiting -a specified amount of time or when they are launched by another task or even -themselves. Therefore there is no need for loop control flow functionality such -as \emph{while} or \emph{for} constructions. The main control flow operators -are the sequence operator and the \emph{if} statement. Both are shown in -Listing~\ref{lst:control}. The first class of \emph{If} statements describes +a specified amount of time or when they are launched by another \gls{Task} or +even themselves. Therefore there is no need for loop control flow functionality +such as \emph{while} or \emph{for} constructions. The main control flow +operators are the sequence operator and the \emph{if} statement. Both are shown +in Listing~\ref{lst:control}. The first class of \emph{If} statements describes the regular \emph{if} statement. The expressions given can have any role. The -functional dependency on \CI{s} determines the return type of the -statement. The listing includes examples of implementations that illustrate -this dependency. +functional dependency on \CI{s} determines the return type of the statement. +The listing includes examples of implementations that illustrate this +dependency. -The sequence operator is very straightforward and just ties -the two expressions together in sequence. +The sequence operator is very straightforward and its only function is to tie +the together in sequence. \begin{lstlisting}[% label={lst:control},caption={Control flow operators}] @@ -92,9 +92,10 @@ class seq v where \section{Input/Output and class extensions} Values can be assigned to all expressions that have an \CI{Upd} role. Examples of such expressions are \glspl{SDS} and \gls{GPIO} pins. Moreover, class -extensions can be created for specific peripherals such as builtin \glspl{LED}. -The classes facilitating this are shown in Listing~\ref{lst:sdsio}. In this way -the assignment is the same for every assignable entity. +extensions can be created for specific peripherals such as built-in +\glspl{LED}. The classes facilitating this are shown in +Listing~\ref{lst:sdsio}. In this way the assignment is the same for every +assignable entity. \begin{lstlisting}[% label={lst:sdsio},caption={Input/Output classes}] @@ -121,10 +122,12 @@ class assign v where \end{lstlisting} A way of storing data in \glspl{mTask} is using \glspl{SDS}. \glspl{SDS} serve -as variables in the \gls{mTask} and maintain their value across executions. +as variables in \gls{mTask} and maintain their value across executions. +\glspl{SDS} can be used by multiple \glspl{Task} and can be used to share data. The classes associated with \glspl{SDS} are listed in Listing~\ref{lst:sdsclass}. The \CI{Main} type is introduced to box an -\gls{mTask} and make it recognizable by the type system. +\gls{mTask} and make it recognizable by the type system by separating programs +and decorations such as \glspl{SDS}. \begin{lstlisting}[% label={lst:sdsclass},caption={\glspl{SDS} in \gls{mTask}}] @@ -140,18 +143,18 @@ The \gls{C}-backend of the \gls{mTask}-system has an engine that is generated alongside the code for the \glspl{Task}. This engine will execute the \glspl{mTask} according to certain rules and semantics. \glspl{mTask} do not behave like functions but more like -\gls{iTasks}-\glspl{Task}. An \gls{mTask} is queued when either his timer runs -out or when it is started by another \gls{mTask}. When an \gls{mTask} is -queued it does not block the execution but it will return immediately while -the actual \gls{Task} will be executed some time in the future. +\gls{iTasks}-\glspl{Task}. An \gls{mTask} is queued when either its timer runs +out or when it is launched by another \gls{mTask}. When an \gls{mTask} is +queued it does not block the execution and it will return immediately while +the actual \gls{Task} will be executed anytime in the future. The \gls{iTasks}-backend simulates the \gls{C}-backend and thus uses the same semantics. This engine expressed in pseudocode is listed as Algorithm~\ref{lst:engine}. All the \glspl{Task} are inspected on their waiting time. When the waiting time has not passed; the delta is subtracted and the -task gets pushed to the end of the queue. When the waiting has surpassed they are -executed. When an \gls{mTask} wants to queue another \gls{mTask} it can just -append it to the queue. +\gls{Task} gets pushed to the end of the queue. When the waiting has surpassed +they are executed. When an \gls{mTask} wants to queue another \gls{mTask} it +can just append it to the queue. \begin{algorithm}[H] \KwData{\textbf{queue} queue, \textbf{time} $t, t_p$} @@ -176,16 +179,16 @@ append it to the queue. \gls{iTasks}-backend}\label{lst:engine} \end{algorithm} -To achieve this in the \gls{EDSL} a \gls{Task} clas are added that work in a +To achieve this in the \gls{EDSL} a \gls{Task} class is added that work in a similar fashion as the \texttt{sds} class. This class is listed in Listing~\ref{lst:taskclass}. \glspl{Task} can have an argument and always have to specify a delay or waiting time. The type signature of the \CI{mtask} is complex and therefore an example is given. The aforementioned Listing -shows a simple specification containing one task that increments a value +shows a simple specification containing one \gls{Task} that increments a value indefinitely every one seconds. \begin{lstlisting}[label={lst:taskclass},% - caption={The classes for defining tasks}] + caption={The classes for defining \glspl{Task}}] class mtask v a where task :: (((v delay r) a->v MTask Expr)->In (a->v u p) (Main (v t q))) -> Main (v t q) | ... @@ -193,14 +196,17 @@ count = task \count = (\n.count (lit 1000) (n +. One)) In {main = count (lit 100 \end{lstlisting} \section{Example mTask} -Some example \glspl{mTask} using almost all of the functionality are shown in +Some example \glspl{mTask} using almost all of their functionality are shown in Listing~\ref{lst:exmtask}. The \glspl{mTask} shown in the example do not belong to a particular view and therefore are of the type \CI{View t r}. The \CI{blink} \gls{mTask} show the classic \gls{Arduino} \emph{Hello World!} application that blinks a certain \gls{LED} every second. The \CI{thermostat} expression will enable a digital pin powering a cooling fan when the analog pin representing a temperature sensor is too high. \CI{thermostat`} shows the same -expression but now using the assignment style \gls{GPIO} technique. +expression but now using the assignment style \gls{GPIO} technique. The +\CI{thermostat} example also show that it is not necessary to run everything as +a \CI{task}. The main program code can also just consist of the contents of the +root \CI{main} itself. \begin{lstlisting}[% label={lst:exmtask},caption={Some example \glspl{mTask}}] @@ -211,7 +217,7 @@ blink = task \blink=(\x. thermostat :: Main (View () Stmt) thermostat = {main = - IF (analogRead A0 >. 50) + IF (analogRead A0 >. lit 50) ( digitalWrite D0 (lit True) ) ( digitalWrite D0 (lit False) ) } @@ -219,5 +225,5 @@ thermostat = {main = thermostat` :: Main (View () Stmt) thermostat` = let a0 = aIO A0 - d0 = dIO D0 in {main = IF (a0 >. 50) (d0 =. lit True) (d0 =. lit False) } + d0 = dIO D0 in {main = IF (a0 >. lit 50) (d0 =. lit True) (d0 =. lit False) } \end{lstlisting}