Предположим, что ваш внешний код условно выделяет память для и инициализирует интерполяционную таблицу и данные о наборе точки останова на основе длины размерности, которую вы задаете как #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 model: rtwdemo_basicsc ### Successful completion of build procedure for model: 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;
Для получения дополнительной информации о символьных размерностях, смотрите Варианты Размерности Реализации для Размеров Массивов в Сгенерированном коде.