Реализуйте алгоритм, который вызывает внешний код С

Введение

В этом примере показов, как использовать внешние Коды С в Системный объект.

Системные объекты

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

См. также

| |

Похожие темы