В этом примере показано, как использовать внешний код C в объекте System.
Системные объекты позволяют реализовать алгоритмы с помощью MATLAB. Системные объекты - специализированный вид объектов MATLAB, разработанный специально для реализации и моделирования динамических систем с вводами, изменяющимися с течением времени.
После определения объекта System его можно включить в модель Simulink с помощью блока MATLAB System.
Системный блок MATLAB использует системный объект ExternalCCode который вызывает внешнюю функцию C extSum вычисляют сумму его входных элементов. В блоке «Отображение» отображается результат суммирования значений из исходного блока.

Доступ к исходному коду MATLAB, используемому системным блоком MATLAB, можно получить, щелкнув гиперссылку «Исходный код» в диалоговом окне блока. Системный объект ExternalCCode реализует stepImpl способ вычисления его выхода. stepImpl вызывает внешнюю функцию C extSum для выполнения вычислений. Объект System наследует от coder.ExternalDependency и реализует следующие методы для использования внешнего кода C.
getDescriptiveName - возврат имени, которое требуется связать с внешней зависимостью;
isSupportedContext - Возвращает значение true, если внешняя зависимость поддерживается в текущем контексте построения
updateBuildInfo - Предоставьте дополнительную информацию, необходимую для связывания внешнего кода
Объект System также вызывает coder.cinclude от stepImpl метод включения внешнего файла заголовка C sum.h.
classdef ExternalCCode < matlab.System & coder.ExternalDependency
% ExternalCCode Compute output by calling into external C Code
methods(Access = protected)
function y = stepImpl(~, a)
% Add header file sum.h to build
coder.cinclude('sum.h');
y = 0.0; %#ok<NASGU> % Pre-initialize y since coder cannot
% identify the type of output y from an
% external C function
% Call external C function to calculate sum of input elements
y = coder.ceval('extSum', coder.rref(a), int32(numel(a)));
end
end
methods(Static)
function bName = getDescriptiveName(~)
% Return a descriptive name for the external dependency. Code
% generator uses this name for error messages.
bName = 'SumAPI';
end
function tf = isSupportedContext(~)
% Use this function to determine whether current build context
% supports external dependency. Build context includes information
% about target language and code generation target.
tf = true;
end
function updateBuildInfo(buildInfo, ~)
% Add source file sum.c to build
buildInfo.addSourceFiles('sum.c');
end
end
end
Внешняя функция C extSum определен в файле sum.c.
#include "sum.h"
double extSum(const double *a, int numElems)
{
int ii;
double sum = 0.0;
for (ii=0; ii < numElems; ii++) {
sum += a[ii];
}
return sum;
}
extSum объявлен в sum.h.
#ifndef SUM_H #define SUM_H extern double extSum(const double *a, int numElems); #endif
coder.ceval | coder.cinclude | coder.ExternalDependency.updateBuildInfo