В этом примере показано, как использовать внешний код С в Системном объекте.
Системные объекты позволяют вам реализовывать использование алгоритмов MATLAB. Системные объекты являются специализированным видом объекта MATLAB, специально разработанного для реализации и симуляции динамических систем с входными параметрами то изменение в зависимости от времени.
После того, как вы зададите Системный объект, можно включать его в модель Simulink с помощью блока MATLAB System.
Блок MATLAB System использует Системный объект ExternalCCode
это вызывает внешнюю функцию C extSum
вычислить сумму его входных элементов. Блок Display показывает результат суммы значений от исходного блока.
Можно получить доступ к исходному коду MATLAB, используемому блоком MATLAB System путем нажатия на гиперссылку "Source code" от диалогового окна блока. Системный объект ExternalCCode
реализует stepImpl
метод, чтобы вычислить его выход. stepImpl
вызывает внешнюю функцию C extSum
сделать расчет. Системный объект наследовался coder.ExternalDependency
класс и реализации следующие методы, чтобы использовать внешний код С.
getDescriptiveName
- Возвратите имя, которое вы хотите сопоставить с внешней зависимостью
isSupportedContext
- Возвратите true, если внешняя зависимость поддерживается в текущем контексте сборки
updateBuildInfo
- Предоставьте дополнительную информацию, запрошенную, чтобы соединить внешний код
Системный объект также вызывает 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.ExternalDependency.updateBuildInfo
| coder.ceval
| coder.cinclude