exponenta event banner

Контейнеры для хранения

Введение

При кодировании с помощью API для написанных пользователем S-функций с фиксированной точкой важно иметь в виду разницу между размером контейнера хранения, длиной слова контейнера хранения и длиной сигнального слова. В следующих разделах рассматриваются контейнеры, используемые API для хранения сигналов при моделировании и генерации кода.

Контейнеры для хранения в моделировании

При моделировании сигналы хранятся в одном из нескольких типов контейнеров определенного размера.

Категории контейнеров для хранения

Во время моделирования сигналы с фиксированной точкой удерживаются в одном из типов контейнеров для хранения, как показано в следующей таблице. Во многих случаях сигналы представлены в контейнерах с большим количеством битов, чем их заданная длина слова.

Контейнеры для хранения с фиксированной точкой

Категория контейнера

Сигнал
Длина слова

Длина слова контейнера

Размер контейнера

FXP_STORAGE_INT8 (подпись)
FXP_STORAGE_UINT8 (без подписи)

от 1 до 8 бит

8 бит

1 байт

FXP_STORAGE_INT16 (подпись)
FXP_STORAGE_UINT16 (без подписи)

От 9 до 16 бит

16 бит

2 байта

FXP_STORAGE_INT32 (подпись)
FXP_STORAGE_UINT32 (без подписи)

от 17 до 32 бит

32 бита

4 байта

FXP_STORAGE_OTHER_SINGLE_WORD

33 - длина слова long тип данных

Длина long тип данных

Длина long тип данных

FXP_STORAGE_MULTIWORD

Больше длины слова long тип данных до 128 бит

Кратные длине long тип данных до 128 бит

Кратные длине long тип данных до 128 бит

Когда количество битов в сигнальном слове меньше, чем размер контейнера, биты длины слова всегда сохраняются в младших значащих битах контейнера. Остальные биты контейнера должны быть расширены знаком:

  • Если тип данных не подписан, биты расширения знака должны быть сброшены до нуля.

  • Если тип данных подписан, биты расширения знака должны быть установлены на единицу для строго отрицательных чисел и в противном случае очищены до нуля.

Например, сигнал типа данных sfix6_En4 содержится в FXP_STORAGE_INT8 контейнер. Сигнал удерживается в шести младших разрядах. Остальные два бита устанавливаются в нуль, когда сигнал положительный или нулевой, и в нуль, когда он отрицательный.

Сигнал типа данных ufix6_En4 содержится в FXP_STORAGE_UINT8 контейнер. Сигнал удерживается в шести младших разрядах. Остальные два бита всегда сбрасываются до нуля.

Длина слова в сигнальном и запоминающем контейнере возвращается посредством ssGetDataTypeFxpWordLength и ssGetDataTypeFxpContainWordLen соответственно. Размер контейнера хранения возвращается ssGetDataTypeStorageContainerSize функция. Тип контейнера возвращается ssGetDataTypeStorageContainCat функция, которая в дополнение к приведенным выше в таблице, может также возвращать следующие значения.

Другие контейнеры для хранения

Категория контейнера

Описание

FXP_STORAGE_UNKNOWN

Возвращается, если неизвестна категория контейнера хранения

FXP_STORAGE_SINGLE

Тип контейнера для Simulink ®single

FXP_STORAGE_DOUBLE

Тип контейнера для Simulink double

FXP_STORAGE_SCALEDDOUBLE

Тип контейнера для типа данных, который был переопределен Scaled double

Контейнеры для хранения в примере моделирования

Один sfix24_En10 тип данных имеет длину слова 24, но фактически хранится в 32 битах во время моделирования. Для этого сигнала,

Контейнеры для хранения при создании кода

Контейнеры хранения, используемые этим API для генерации кода, не всегда совпадают с контейнерами, используемыми для моделирования. Во время создания кода всегда используется собственный тип данных C. Типы данных с плавающей запятой хранятся в C double или float. Типы данных с фиксированной точкой хранятся в подписанных и неподписанных С char, short, int, или long.

Эмуляция

Поскольку он полезен для быстрого прототипирования и тестирования аппаратных средств в петле, при формировании кода поддерживается эмуляция сигналов меньшего размера внутри больших контейнеров. Например, 29-битовый сигнал поддерживается в генерации кода, если имеется тип данных C, который имеет, по меньшей мере, 32 бита. Правила для размещения сигнала меньшего размера в более крупном контейнере и для работы с дополнительными битами контейнера те же при формировании кода, что и при моделировании.

Если меньший сигнал эмулируется внутри большего контейнера хранения при моделировании, он не обязательно эмулируется при формировании кода. Например, 24-разрядный сигнал эмулируется в 32-разрядном контейнере хранения при моделировании. Однако некоторые чипы DSP имеют собственную поддержку 24-битных величин. На такой цели компилятор C может определить int или long ровно 24 бита. В этом случае 24-разрядный сигнал содержится в 32-разрядном контейнере при моделировании и в 24-разрядном контейнере при формировании кода.

И наоборот, сигнал, который не был эмулирован при моделировании, может потребоваться эмулировать при генерации кода. Например, некоторые чипы DSP имеют минимальную поддержку целых чисел. На таких чипах, char, short, int, и long может быть определено 32 бита. В этом случае необходимо эмулировать 8- и 16-разрядные типы данных с фиксированной точкой при генерации кода.

Функции TLC контейнера хранения

Поскольку сопоставление контейнеров хранения при моделировании с контейнерами хранения при генерации кода не является однозначным, функции компилятора целевого языка (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. int8_T будет typdefchar, short, int, или long в сгенерированном коде, в зависимости от того, что подходит для целевого компилятора.

Остальные функции TLC, перечисленные выше, возвращаются TRUE или FALSE в зависимости от того, используется ли конкретный стандартный тип данных C для хранения данного зарегистрированного API типа данных. Следует отметить, что эти функции не обязательно дают взаимоисключающие ответы для данного зарегистрированного типа данных из-за того, что типы данных C могут потенциально перекрываться по размеру. В C,

sizeof (char ) ≤ sizeof ( короткий) ≤ sizeof ( int ) ≤ sizeof (длинный).

Один или несколько из этих типов данных C могут иметь одинаковый размер.