Вбудовані функції Matlab у Simulink: coder.cinclude() без заголовків для власних C/C++ функцій
Добре відомо, що ви можете використовувати coder.ceval(...) у поєднанні з coder.cinclude(...) для виконання зовнішніх C/C++ функцій із вбудованих функцій matlab:
function y = mysquare(x) %#codegen
coder.cinclude('mysquare.h');
y = 0.0;
coder.ceval('mysquare', coder.ref(x), coder.wref(y));
endМенш відомо те, що ви можете включати C/C++ код “inline” у виклику coder.cinclude(), хоча це дещо штучно. Це дуже корисно, оскільки вам не потрібно керувати файлами заголовків.
Зверніть увагу, що під час компіляції вашої моделі Simulink/Matlab coder все одно повинен перевірити, чи компілюється вона коректно, тому вам потрібно переконатися, що “автономна” компіляція вашого коду можлива.
function y = mysquare(x) %#codegen
% Використання coder.cinclude() просто означає, що це буде включено
% на початку файлу, тому ми можемо зловживати цим, щоб включити
% всю функцію замість лише включення заголовка.
coder.cinclude(sprintf(...
['<math.h>\n' ... % Фіктивне включення для завершення рядка #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));
endПам’ятайте, що абсолютно необхідно використовувати фіктивне включення <math.h> для завершення рядка #include!
Це згенерує наступний код у файлі заголовка:
#include <math.h>
inline void mysquare(const double* x, double* y)
{
*y = (*x) * (*x);
}і, за достатнього рівня коментарів, це код із згенерованого файлу .cpp
/* MATLAB Function 'Logic/S-Process emulation/MATLAB Function1': '<S7>:1' */
/* '<S7>:1:5' coder.cinclude(sprintf(... */
/* '<S7>:1:6' ['<math.h>\n' ... % Фіктивне включення для завершення рядка #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);