Simulink fonctions Matlab embarquées : coder.cinclude() sans en-tête pour des fonctions C/C++ personnalisées
Il est bien connu que vous pouvez utiliser coder.ceval(...) conjointement avec coder.cinclude(...) pour exécuter des fonctions C/C++ externes depuis des fonctions matlab embarquées :
function y = mysquare(x) %#codegen
coder.cinclude('mysquare.h');
y = 0.0;
coder.ceval('mysquare', coder.ref(x), coder.wref(y));
endCe qui est moins connu, c’est que vous pouvez inclure du code C/C++ « en ligne » dans l’appel coder.cinclude(), bien que ce soit quelque peu artificiel. Cela est très utile car cela vous évite d’avoir à gérer des fichiers d’en-tête.
Notez que lors de la compilation de votre modèle, Simulink/Matlab coder doit quand même vérifier que le code compile correctement, vous devez donc vous assurer que la compilation « autonome » de votre code est possible.
function y = mysquare(x) %#codegen
% Utiliser coder.cinclude() signifie simplement que le contenu sera inclus
% en haut du fichier, nous pouvons donc en abuser pour inclure la fonction
% entière au lieu de simplement l'inclusion de l'en-tête.
coder.cinclude(sprintf(...
['<math.h>\n' ... % Inclusion factice pour terminer la ligne #include
'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));
endN’oubliez pas qu’il est absolument essentiel d’utiliser l’inclusion factice <math.h> pour terminer la ligne #include !
Ceci générera le code suivant dans le fichier d’en-tête :
#include <math.h>
inline void mysquare(const double* x, double* y)
{
*y = (*x) * (*x);
}et, avec un niveau de commentaires suffisamment élevé, voici le code du fichier .cpp généré
/* MATLAB Function 'Logic/S-Process emulation/MATLAB Function1': '<S7>:1' */
/* '<S7>:1:5' coder.cinclude(sprintf(... */
/* '<S7>:1:6' ['<math.h>\n' ... % Inclusion factice pour terminer la ligne #include */
/* '<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);