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

Предположим, что ваш внешний код условно выделяет память для и инициализирует интерполяционную таблицу и данные о наборе точки останова на основе длины размерности, которую вы задаете как #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_basicsc в качестве примера.

open_system('rtwdemo_basicsc')

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

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

T1Data = Simulink.Parameter(T1Data);
T1Break = Simulink.Parameter(T1Break);

Сконфигурируйте объекты импортировать определения данных из вашего внешнего кода.

T1Data.CoderInfo.StorageClass = 'Custom';
T1Data.CoderInfo.CustomStorageClass = 'ImportFromFile';
T1Data.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';

T1Break.CoderInfo.StorageClass = 'Custom';
T1Break.CoderInfo.CustomStorageClass = 'ImportFromFile';
T1Break.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';

В командной строке создайте 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_basicsc','AllowSymbolicDim','on')

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

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

Сгенерировать код с пользовательскими классами памяти, такими как ImportFromFile, необходимо использовать основанный на ERT системный конечный файл. Установите Параметры конфигурации> Генерация кода> Системный конечный файл к ert.tlc.

set_param('rtwdemo_basicsc','SystemTargetFile','ert.tlc')

Сгенерируйте и смотрите код

Сгенерируйте код из модели.

rtwbuild('rtwdemo_basicsc')
### Starting build procedure for: rtwdemo_basicsc
### Successful completion of build procedure for: rtwdemo_basicsc

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

file = fullfile('rtwdemo_basicsc_ert_rtw','rtwdemo_basicsc.c');
rtwdemodbtype(file,'.X = look1_iflf_binlx','bpLen - 1U',1,1)
    rtwdemo_basicsc_DW.X = look1_iflf_binlx(rtwdemo_basicsc_U.input2,
      (&(T1Break[0])), (&(T1Data[0])), bpLen - 1U) * 2.0F;

Для получения дополнительной информации о символьных размерностях, смотрите Варианты Размерности Реализации для Размеров Массивов в Сгенерированном коде.

Похожие темы