В этом примере показов, как использовать внешние Коды С в Системный объект.
Системные объекты позволяют вам реализовать алгоритмы с помощью 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.ceval
| coder.cinclude
| coder.ExternalDependency.updateBuildInfo