Simulink embedded Matlab funkce: Headerless coder.cinclude() pro vlastní C/C++ funkce
Je dobře známo, že můžete použít coder.ceval(...) ve spojení s coder.cinclude(...) pro spuštění externích C/C++ funkcí z embedded matlab funkcí:
mysquare_header_included.m
function y = mysquare(x) %#codegen
coder.cinclude('mysquare.h');
y = 0.0;
coder.ceval('mysquare', coder.ref(x), coder.wref(y));
endMéně známé je, že můžete zahrnout C/C++ kód “inline” v coder.cinclude() volání, i když je to trochu konstruované. To je velmi užitečné, abyste nemuseli spravovat hlavičkové soubory.
Všimněte si, že při kompilaci vašeho modelu Simulink/Matlab coder stále potřebuje zkontrolovat, zda se to správně kompiluje, takže musíte zajistit, aby “standalone” kompilace vašeho kódu byla možná.
mysquare_headerless_inline.m
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));
endNezapomeňte, že je absolutně nezbytné použít dummy <math.h> include pro ukončení #include řádku!
To vygeneruje následující kód v hlavičkovém souboru:
mysquare_generated_header.cpp
#include <math.h>
inline void mysquare(const double* x, double* y)
{
*y = (*x) * (*x);
}a, s dostatečnou úrovní komentářů, toto je kód z generovaného .cpp souboru
mysquare_generated_cpp_snippet.cpp
/* 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);Podívejte se na podobné články podle kategorie:
MATLAB/Simulink
Pokud vám tento článek pomohl, zvažte, zda mi nekoupíte kávu nebo nepřispějete přes PayPal na podporu výzkumu a publikování nových článků na TechOverflow