При кодировании с помощью API для написанных пользователем S-функций с фиксированной точкой важно иметь в виду различие между размером контейнера хранения, размером слова контейнера хранения и сигнальными размерами слова. В следующих разделах рассматриваются контейнеры, используемые API для хранения сигналов в симуляции и генерации кода.
В симуляции сигналы сохраняются в одном из нескольких типов контейнеров определенного размера.
Во время симуляции сигналы с фиксированной точкой сохраняются в одном из типов контейнеров для хранения, как показано в следующей таблице. Во многих случаях сигналы представлены в контейнерах с большим количеством бит, чем их заданный размер слова.
Контейнеры хранения с фиксированной точкой
Категория контейнера | Сигнал | Контейнерные Размеры слова | Размер контейнера |
---|---|---|---|
| От 1 до 8 бит | 8 бит | 1 байт |
| От 9 до 16 бит | 16 бит | 2 байта |
| От 17 до 32 бит | 32 бита | 4 байта |
| С 33 по размеру слова | Длина | Длина |
| Больше, чем размер слова | Множители длины | Множители длины |
Когда количество битов в длине сигнального слова меньше, чем размер контейнера, биты размера слова всегда сохраняются в наименее значимых битах контейнера. Оставшиеся биты контейнера должны быть расширены знаком:
Если тип данных не подписан, биты расширения знака должны быть очищены до нуля.
Если тип данных подписан, биты расширения знака должны быть установлены на единицу для строго отрицательных чисел и в противном случае сброшены на нуль.
Для примера сигнал типа данных sfix6_En4
содержится в FXP_STORAGE_INT8
контейнер. Сигнал удерживается в шести младших битах. Оставшиеся два бита равны нулю, когда сигнал положителен или равен нулю, и единице, когда он отрицателен.
Сигнал типа данных ufix6_En4
содержится в FXP_STORAGE_UINT8
контейнер. Сигнал удерживается в шести младших битах. Оставшиеся два бита всегда очищаются до нуля.
Сигнал и размеры слова контейнера хранения возвращаются ssGetDataTypeFxpWordLength
и ssGetDataTypeFxpContainWordLen
функций, соответственно. Размер контейнера для хранения возвращает значение ssGetDataTypeStorageContainerSize
функция. Категория контейнера возвращается ssGetDataTypeStorageContainCat
функция, которая в дополнение к функциям в таблице выше, может также возвращать следующие значения.
Другие контейнеры для хранения данных
Категория контейнера | Описание |
---|---|
| Возвращается, если категория контейнера хранения неизвестна |
| Тип контейнера для Simulink®
|
| Тип контейнера для |
| Тип контейнера для типа данных, который был переопределен на |
Система координат sfix24_En10
тип данных имеет размер слова 24, но фактически сохранен в 32 битах во время симуляции. Для этого сигнала,
ssGetDataTypeStorageContainCat
возвращает FXP_STORAGE_INT32
.
ssGetDataTypeStorageContainerSize
или sizeof( )
возвращает 4
, который является размером контейнера памяти в байтах.
ssGetDataTypeFxpContainWordLen
возвращает 32
, которая является размером слова контейнера хранения в битах.
ssGetDataTypeFxpWordLength
возвращает 24
, который является типом данных, размером слова в битах.
Контейнеры хранения данных, используемые этим API для генерации кода, не всегда совпадают с контейнерами, используемыми для симуляции. Во время генерации кода всегда используется собственный тип данных C. Типы данных с плавающей точкой хранятся на C double
или float
. Типы данных с фиксированной точкой хранятся в char
со знаком и без знака на C,
short
, int
, или long
.
Поскольку он полезен для быстрого прототипирования и HIL-тестирования, эмуляция меньших сигналов внутри больших контейнеров поддерживается в генерации кода. Для примера 29-битовый сигнал поддерживается в генерации кода, если существует доступный тип данных C, который имеет по меньшей мере 32 бита. Правила для размещения меньшего сигнала в большем контейнере и для работы с дополнительными битами контейнера те же самые в генерации кода, что и для симуляции.
Если меньший сигнал эмулируется внутри большего контейнера памяти в симуляции, он не обязательно эмулируется в генерации кода. Для примера 24-битовый сигнал эмулируется в 32-битном контейнере памяти в симуляции. Однако некоторые микросхемы DSP имеют нативную поддержку 24-битных величин. На такой цели компилятор C может задать int
или long
чтобы быть в точности 24 бита. В этом случае 24-битовый сигнал удерживается в 32-битном контейнере в симуляции и в 24-битном контейнере в генерации кода.
И наоборот, сигнал, который не был эмулирован в симуляции, может потребоваться эмулировать в генерации кода. Например, некоторые чипы DSP имеют минимальную поддержку целых чисел. На таких фишках char
, short
, int
, и long
все могут быть определены как 32 бита. В этом случае необходимо эмулировать 8- и 16-битные типы данных с фиксированной точкой при генерации кода.
Поскольку отображение контейнеров хранения в симуляции с контейнерами хранения в генерации кода не является единичным, функции Target Language Compiler (TLC) для контейнеров хранения отличаются от функций в симуляции:
FixPt_DataTypeNativeType
FixPt_DataTypeStorageDouble
FixPt_DataTypeStorageSingle
FixPt_DataTypeStorageScaledDouble
FixPt_DataTypeStorageSInt
FixPt_DataTypeStorageUInt
FixPt_DataTypeStorageSLong
FixPt_DataTypeStorageULong
FixPt_DataTypeStorageSShort
FixPt_DataTypeStorageUShort
FixPt_DataTypeStorageMultiword
Первая из этих функций TLC, FixPt_DataTypeNativeType
, является ближайшим аналогом к ssGetDataTypeStorageContainCat
в симуляции. FixPt_DataTypeNativeType
возвращает строку TLC, которая задает тип контейнера памяти, и продукт Simulink Coder™ автоматически вставляет typedef
который преобразует строку в собственный тип данных C в сгенерированном коде.
Например, рассмотрите тип данных с фиксированной точкой, который содержится в FXP_STORAGE_INT8
в симуляции. FixPt_DataTypeNativeType
вернется int8_T
. The int8_T
будет typdef
бы к char
, short
, int
, или long
в сгенерированном коде в зависимости от того, что подходит для целевого компилятора.
Остальные функции TLC, перечисленные выше, возвращают TRUE
или FALSE
в зависимости от того, используется ли конкретный стандартный тип данных C для хранения заданного типа данных, зарегистрированных API. Обратите внимание, что эти функции не обязательно дают взаимоисключающие ответы для данного зарегистрированного типа данных, из-за того, что типы данных C могут потенциально перекрываться в размере. В C,
sizeof (char ) ≤ sizeof ( short) ≤ sizeof ( int ) ≤ sizeof (long).
Один или несколько из этих типов данных C могут быть и очень часто имеют одинаковый размер.