exponenta event banner

Реализация алгоритма вызова внешнего кода C

Введение

В этом примере показано, как использовать внешний код 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

Внешняя функция 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

См. также

| |

Связанные темы