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

Введение

При кодировании с помощью 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

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

FXP_STORAGE_SCALEDDOUBLE

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

Пример контейнеров для хранения в симуляции

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

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

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

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

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