При кодировании с помощью 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 могут быть и очень часто имеют одинаковый размер.