Этот пример показывает, как использовать внешний код С в Системном объекте.
Системные объекты позволяют вам реализовывать использование алгоритмов 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