Simulink eingebettete Matlab-Funktionen: Headerloser coder.cinclude() für benutzerdefinierte C/C++-Funktionen
Es ist wohlbekannt, dass man coder.ceval(...) in Verbindung mit coder.cinclude(...) verwenden kann, um externe C/C++-Funktionen aus eingebetteten Matlab-Funktionen aufzurufen:
function y = mysquare(x) %#codegen
coder.cinclude('mysquare.h');
y = 0.0;
coder.ceval('mysquare', coder.ref(x), coder.wref(y));
endWeniger bekannt ist, dass man C/C++-Code “inline” im coder.cinclude()-Aufruf einbinden kann, obwohl dies etwas konstruiert ist. Dies ist sehr hilfreich, so dass man keine Header-Dateien verwalten muss.
Beachte, dass beim Kompilieren deines Modells der Simulink/Matlab-Coder trotzdem prüfen muss, ob es ordnungsgemäß kompiliert, also musst du sicherstellen, dass eine “standalone”-Kompilierung deines Codes möglich ist.
function y = mysquare(x) %#codegen
% coder.cinclude() zu verwenden bedeutet lediglich, dass es am Anfang der
% Datei eingefügt wird, daher können wir es zweckentfremden, um die gesamte Funktion
% einzubinden statt nur den Header-Include.
coder.cinclude(sprintf(...
['<math.h>\n' ... % Dummy-Include, um die #include-Zeile zu terminieren
'inline void mysquare(const double* x, double* y) {\n' ...
' *y = (*x) * (*x);\n' ...
'}'] ...
));
y = 0.0;
coder.ceval('mysquare', coder.ref(x), coder.wref(y));
endDenke daran, dass es absolut essenziell ist, das Dummy-<math.h>-Include zu verwenden, um die #include-Zeile zu terminieren!
Dies wird den folgenden Code in der Header-Datei generieren:
#include <math.h>
inline void mysquare(const double* x, double* y)
{
*y = (*x) * (*x);
}und, mit ausreichend aktivierten Kommentar-Leveln, dies ist der Code aus der generierten .cpp-Datei
/* MATLAB Function 'Logic/S-Process emulation/MATLAB Function1': '<S7>:1' */
/* '<S7>:1:5' coder.cinclude(sprintf(... */
/* '<S7>:1:6' ['<math.h>\n' ... % Dummy include to terminate the #include line */
/* '<S7>:1:7' 'inline void mysquare(const double* x, double* y) {\n' ... */
/* '<S7>:1:8' ' *y = (*x) * (*x);\n' ... */
/* '<S7>:1:9' '}'] ... */
/* '<S7>:1:10' )); */
/* '<S7>:1:11' y = 0.0; */
/* '<S7>:1:12' coder.ceval('mysquare', coder.ref(x), coder.wref(y)); */
mysquare(&rtb_y_l, &rtb_y);