You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
2.4 KiB
41 lines
2.4 KiB
\subsection{Multi-Device build infrastructure}
|
|
|
|
|
|
\subsubsection{Framework integration}
|
|
The framework is build to keep control over the application life-cycle.
|
|
It ensures that the device unspecific code is executed at the right time and provides an API for device specific functionality.
|
|
|
|
The framework specifies a simple interface, which must be implemented by each device.
|
|
A single function \texttt{Device* getDevice()} must be defined exactly once in each device specific folder.
|
|
To implement this interface, a static instance of \texttt{Device} is created and returned.
|
|
Each \texttt{Device} is populated with device specific \texttt{Feature} instances.
|
|
While the \texttt{Feature}-API leverages common runtime polymorphism to share functionality between features, the initial \texttt{Device} creation uses compile-time polymorphism which reduces the need for memory management and increases performance by avoiding virtual function tables.
|
|
Listing~\ref{lst:create_device_socket} shows the complete device specific code used for a simple power socket.
|
|
|
|
\begin{lstlisting}[caption={Device specific code for a socket driver.},
|
|
label=lst:create_device_socket, basicstyle=\ttfamily\scriptsize]
|
|
#include "Device.h"
|
|
#include "features/Socket.h"
|
|
|
|
Device device:
|
|
|
|
constexpr const char NAME[] = "socket";
|
|
constexpr const uint16_t GPIO = 12;
|
|
OnOffFeature<NAME, GPIO, false, 1> socket(&device);
|
|
|
|
Device* getDevice() {
|
|
return &device;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
|
|
\subsubsection{Build system}
|
|
The \textit{Makefile} is build to accept a parameter for device type identifiers called \texttt{DEVICE} and to create its whole output inside a subdirectory specific to the device type.
|
|
Another \textit{Makefile} has been created which scans a project subdirectory and uses each directory in there as container for device specific code.
|
|
For each of these directories, the other \textit{Makefile} is called and the subdirectories name is used as \texttt{DEVICE} parameter.
|
|
By splitting the build and recompiling the framework each time before intermixing it with the device specific code, the device type identifier can be used inside the shared framework code.
|
|
|
|
While building a devices firmware, the meta-information file used during updates is also created and stored beside the binary firmware image.
|
|
|
|
For development, each device can be build separately by using the device type identifier as \textit{Makefile} target.
|
|
In addition the prefix \texttt{/flash} can be used to flash a specific firmware.
|