exponenta event banner

класс coder.ExternalDependency

Пакет: кодер
Суперклассы:

Интерфейс с внешним кодом

Описание

coder.ExternalDependency является абстрактным классом для разработки интерфейса между внешним кодом и кодом MATLAB ®, предназначенным для генерации кода. Можно определить классы, производные отcoder.ExternalDependency инкапсуляция интерфейса с внешними библиотеками, файлами объектов и исходным кодом C/C + +. Эта инкапсуляция позволяет отделить подробные данные интерфейса от кода MATLAB.

Определение класса, производного от coder.ExternalDependency, создайте подкласс. Например:

classdef myClass < coder.ExternalDependency

Необходимо определить все методы, перечисленные в разделе Методы. Эти методы являются статическими и не компилируются. Генератор кода вызывает эти методы в MATLAB после завершения создания кода для конфигурирования сборки для сгенерированного кода. RTW.BuildInfo и coder.BuildConfig объекты, описывающие сведения о построении и контекст построения, автоматически создаются в процессе построения. updateBuildInfo способ обеспечивает доступ к этим объектам. Дополнительные сведения о настройке информации построения см. в разделе Настройка процесса построения (кодер MATLAB).

Также определяются методы, которые вызывают внешний код. Эти методы компилируются. Для каждой внешней функции, которую требуется вызвать, напишите метод для определения интерфейса программирования функции. В методе используйте coder.ceval для вызова внешней функции.

Методы

getDescriptiveNameВернуть описательное имя для внешней зависимости
isSupportedContextОпределить, поддерживает ли контекст построения внешнюю зависимость
updateBuildInfoОбновить сведения о построении

Примеры

свернуть все

В этом примере показано, как инкапсулировать интерфейс во внешнюю динамическую связанную библиотеку C с помощью coder.ExternalDependency.

Запись функции adder возвращает сумму его входных данных.

function c = adder(a,b)
%#codegen
c = a + b;
end

Создание библиотеки, содержащей adder.

codegen('adder','-args',{-2,5},'-config:dll','-report')

Запись файла определения класса AdderAPI.m для инкапсуляции интерфейса библиотеки.

%================================================================
% This class abstracts the API to an external Adder library.
% It implements static methods for updating the build information
% at compile time and build time.
%================================================================

classdef AdderAPI < coder.ExternalDependency
    %#codegen
    
    methods (Static)
        
        function bName = getDescriptiveName(~)
            bName = 'AdderAPI';
        end
        
        function tf = isSupportedContext(buildContext)
            if  buildContext.isMatlabHostTarget()
                tf = true;
            else
                error('adder library not available for this target');
            end
        end
        
        function updateBuildInfo(buildInfo, buildContext)
            % Get file extensions for the current platform
            [~, linkLibExt, execLibExt, ~] = buildContext.getStdLibInfo();
            
            % Add file paths
            hdrFilePath = fullfile(pwd, 'codegen', 'dll', 'adder');
            buildInfo.addIncludePaths(hdrFilePath);

            % Link files
            linkFiles = strcat('adder', linkLibExt);
            linkPath = hdrFilePath;
            linkPriority = '';
            linkPrecompiled = true;
            linkLinkOnly = true;
            group = '';
            buildInfo.addLinkObjects(linkFiles, linkPath, ...
                linkPriority, linkPrecompiled, linkLinkOnly, group);

            % Non-build files for packaging
            nbFiles = 'adder';
            nbFiles = strcat(nbFiles, execLibExt);
            buildInfo.addNonBuildFiles(nbFiles,'','');
        end
        
        %API for library function 'adder'
        function c = adder(a, b)
            if coder.target('MATLAB')
                % running in MATLAB, use built-in addition
                c = a + b;
            else
                % Add the required include statements to the generated function code
                coder.cinclude('adder.h');
                coder.cinclude('adder_initialize.h');
                coder.cinclude('adder_terminate.h');
                c = 0;
                
                % Because MATLAB Coder generated adder, use the
                % housekeeping functions before and after calling
                % adder with coder.ceval.

                coder.ceval('adder_initialize');
                c = coder.ceval('adder', a, b);
                coder.ceval('adder_terminate');
            end
        end
    end
end

Запись функции adder_main который вызывает функцию внешней библиотеки adder.

function y = adder_main(x1, x2)
    %#codegen
    y = AdderAPI.adder(x1, x2);
end

Создание функции MEX для adder_main. Функция MEX выполняет coder.ExternalDependency методы.

codegen('adder_main','-args',{7,9},'-report')

Скопируйте библиотеку в текущую папку, используя расширение файла для вашей платформы. Для Windows ® используйте:

copyfile(fullfile(pwd,'codegen','dll','adder','adder.dll'));

Для Linux ® используйте:

copyfile(fullfile(pwd,'codegen','dll','adder','adder.so'));

Выполните функцию MEX и проверьте результат.

adder_main_mex(2,3)
Представлен в R2013b