exponenta event banner

Импорт данных параметров с условно скомпилированной длиной размера

Предположим, внешний код условно распределяет память для и инициализирует данные таблицы подстановки и набора точек останова на основе длины измерения, указанной как #define макро. В этом примере показано, как создать код, который импортирует эти внешние глобальные данные.

Создание внешних файлов кода

Сохранение определения данных набора точек останова T1Break и данные таблицы поиска T1Data в текущей папке в файле с именем ex_vec_symdim_src.c. Эти глобальные переменные имеют 9 или 11 элементов в зависимости от значения макроса bpLen.

#include "ex_vec_symdim_decs.h"

#if bpLen == 11
double T1Break[bpLen] = { 
    -5.0, 
    -4.0, 
    -3.0, 
    -2.0, 
    -1.0, 
    0.0, 
    1.0, 
    2.0, 
    3.0, 
    4.0, 
    5.0 
} ;
    
double T1Data[bpLen] = { 
    -1.0, 
    -0.99, 
    -0.98, 
    -0.96, 
    -0.76, 
    0.0, 
    0.76, 
    0.96, 
    0.98, 
    0.99, 
    1.0 
} ; 
#endif

#if bpLen == 9
double T1Break[bpLen] = { 
    -4.0, 
    -3.0, 
    -2.0, 
    -1.0, 
    0.0, 
    1.0, 
    2.0, 
    3.0, 
    4.0
} ;
    
double T1Data[bpLen] = { 
    -0.99, 
    -0.98, 
    -0.96, 
    -0.76, 
    0.0, 
    0.76, 
    0.96, 
    0.98, 
    0.99
} ; 
#endif

Сохранение объявлений переменных и определения макроса в текущей папке в файле ex_vec_symdim_decs.h.

#define bpLen 11

extern double T1Break[bpLen];  
extern double T1Data[bpLen];

Изучение и настройка примерной модели

Открыть пример модели rtwdemo_configinterface.

open_system('rtwdemo_configinterface')
set_param('rtwdemo_configinterface/Table1','DataSpecification','Table and breakpoints');

Откройте диалоговое окно Table1 блока. Блок относится к переменным, T1Data и T1Break, в рабочем пространстве модели. Эти переменные хранят данные таблицы подстановки и набора точек останова с 11 элементами.

В командной строке преобразуйте переменные в Simulink.Parameter объекты.

mws = get_param('rtwdemo_configinterface','modelworkspace');
T1Data = mws.getVariable('T1Data');
T1Break = mws.getVariable('T1Break');
T1Data = Simulink.Parameter(T1Data);
T1Break = Simulink.Parameter(T1Break);

В командной строке создайте Simulink.Parameter объект для представления пользовательского макроса bpLen.

bpLen = Simulink.Parameter(11);
bpLen.Min = 9;
bpLen.Max = 11;
bpLen.DataType = 'int32';
bpLen.CoderInfo.StorageClass = 'Custom';
bpLen.CoderInfo.CustomStorageClass = 'ImportedDefine';
bpLen.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';

Использовать bpLen для задания размеров таблицы подстановки и данных набора точек останова. Настройте модель, чтобы включить символьные размеры, выбрав параметр конфигурации Разрешить спецификацию символьных размеров.

T1Data.Dimensions = '[1 bpLen]';
T1Break.Dimensions = '[1 bpLen]';
set_param('rtwdemo_configinterface','AllowSymbolicDim','on');

Задать параметры конфигурации > Создание кода > Пользовательский код > Дополнительные сведения о построении > Исходные файлы для ex_vec_symdim_src.c.

set_param('rtwdemo_configinterface','CustomSource','ex_vec_symdim_src.c')

Настройте объекты для импорта определений данных из внешнего кода.

mws.assignin('T1Data',T1Data);
mws.assignin('T1Break',T1Break);
cm = coder.mapping.utils.create('rtwdemo_configinterface');
setDataDefault(cm,'ModelParameters','StorageClass','Default');
setModelParameter(cm,'Table1','StorageClass','Model default');
setModelParameter(cm,'Table2','StorageClass','Model default');
setModelParameter(cm,'T1Data','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h');
setModelParameter(cm,'T1Break','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h');

Создание и проверка кода

Создайте код из модели.

Сгенерированный алгоритм кода находится в модели step функция в созданном файле rtwdemo_configinterface.c. Алгоритм проходит T1Break, T1Data, и bpLen в качестве значений аргументов функции, выполняющей поиск таблицы. В этом случае bpLen управляет верхней границей двоичного поиска, используемого функцией.

Дополнительные сведения о символьных измерениях см. в разделе Реализация вариантов измерений для размеров массива в сгенерированном коде.

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