Обработка данных с помощью TLC

Матричные параметры

MATLAB®, Simulink®, и генератор кода использует упорядоченное расположение больших столбцов для хранения массивов (1-D, 2-D,...). Доступ к следующему элементу массива в памяти осуществляется путем увеличения первого индекса массива. Например, эти пары элементов хранятся последовательно в памяти: A(i) и A(i+1), B(i,j) и B(i+1,j), C(i,j,k) и C(i+1,j,k). Для получения дополнительной информации о внутреннем представлении данных MATLAB, см. MATLAB Data.

Параметры матрицы генератора кода

Форматирование внутреннего хранилища данных Simulink и генератора кода отличается от форматирования внутреннего хранилища данных MATLAB только хранением комплексных массивов чисел. В MATLAB действительная и мнимая части хранятся в отдельных массивах. В продуктах Simulink и генератора кода они хранятся в «перемеженном» формате, где числа в памяти чередуются реальными, мнимыми, реальными, мнимыми и так далее. Эта конвенция позволяет эффективно реализовывать маленькие сигналы на линиях Simulink и для блоков Mux и других «виртуальных» блоков манипуляции сигналами (то есть они не активно копируют свои входы, просто ссылки на них).

Скомпилированный файл модели, model.rtw, представляет матрицы как строки в синтаксисе MATLAB, без подразумеваемого формата памяти. Это позволяет скопировать строку из .rtw файл и вставить его в код MATLAB и иметь его распознавание MATLAB.

TLC объявляет Блок Simulink параметры матрицы как скаляр или 1-D переменные массива

real_T scalar; 
real_T mat[ nRows * nCols ];

где real_T может быть произвольным типом данных, поддерживаемым Simulink, и совпадать с типом переменной, заданным в файле модели.

Для примера матрица 3 на 3 в блоке Интерполяционная таблица (2-D)

1   2   3 
4   5   6 
7   8   9

хранится в model.rtw как

Parameter {
 	 Name				"OutputValues"
 	 Value				Matrix(3,3)
[[1.0, 2.0, 3.0]; [4.0, 5.0, 6.0]; [7.0, 8.0, 9.0];]
   String				"t"
   StringType				"Variable"
   ASTNode {
 	   IsNonTerminal					  0
  	 Op					  SL_NOT_INLINED
 	   ModelParameterIdx 				  3
   }
}

и приводит к этому определению в model.h

typedef struct Parameters_tag {
  real_T s1_Look_Up_Table_2_D_Table[9];
   						     /* Variable:s1_Look_Up_Table_2_D_Table
 						         * External Mode Tunable:yes
 		 			            * Referenced by block:
 						         * <S1>/Look-Up Table (2-D
                         */

  [ ... other parameter definitions ... ]

} Parameters;

The model.h файл объявляет фактическое хранилище для матричного параметра, и можно увидеть, что формат является основным столбцом. То есть считывайте столбцы вниз, затем поперек строк.

Parameters model_P = {
  /* 3 x 3 matrix s1_Look_Up_Table_2_D_Table */
  { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 },
  [ ... other parameter declarations ...]
};

TLC обращается к параметрам матрицы через LibBlockMatrixParameter и LibBlockMatrixParameterAddr, где

LibBlockMatrixParameter(OutputValues, "", "", 0, "", "", 1) возвращает "model_P.s1_Look_Up_Table_2_D_Table[<reservedrangesplaceholder0 >]" (автоматически оптимизировано из "[0 + nRows*1]") и

LibBlockMatrixParameterAddr(OutputValues, "", "", 0, "", "", 1) возвращает "& model_P.s1_Look_Up_Table_2_D_Table[<reservedrangesplaceholder0 >]" для inlined и nonlined блочного TLC кода.

Матричные параметры аналогичны другим параметрам TLC. В структуру параметров помещаются только те параметры, к которым явно обращается функция библиотеки TLC во время генерации кода. Итак, следуя примеру, s1_Look_Up_Table_2_D_Table не объявляется, если только LibBlockParameter или LibBlockParameterAddr явный доступ к нему.

Похожие темы