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.
Beachten Sie, dass beim Kompilieren Ihres Modells der Simulink/Matlab-Coder trotzdem prüfen muss, ob es ordnungsgemäß kompiliert, also müssen Sie sicherstellen, dass eine “standalone”-Kompilierung Ihres Codes möglich ist.
function y = mysquare(x) %#codegen
% Using coder.cinclude() just means it will be included at the top of the
% file, hence we can misuse it to include the entire function instead of
% just the header include.
coder.cinclude(sprintf(...
['<math.h>\n' ... % Dummy include to terminate the #include line
'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));
endDenken Sie 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);