Встроенные функции 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++ “инлайн” в вызове coder.cinclude(), хотя это несколько искусственный приём. Это очень полезно, чтобы не управлять заголовочными файлами.
Обратите внимание, что при компиляции вашей модели Simulink/Matlab coder всё равно должен проверить, компилируется ли она правильно, поэтому вам нужно обеспечить возможность “автономной” компиляции вашего кода.
function y = mysquare(x) %#codegen
% Использование coder.cinclude() просто означает, что это будет включено вверху
% файла, поэтому мы можем использовать это для включения всей функции вместо
% только включения заголовка.
coder.cinclude(sprintf(...
['<math.h>\n' ... % Фиктивный include для завершения строки #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Помните, что абсолютно необходимо использовать фиктивный include <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' ... % 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);