При кодировании с 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. Типы данных с плавающей точкой сохранены в double
C или
float
. Типы данных с фиксированной точкой считаются в C подписанным и char
без знака,
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) для контейнеров устройства хранения данных отличаются от тех в симуляции:
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
будет typdef
'd к char
, short
, int
, или long
в сгенерированном коде, в зависимости от того, что подходит для целевого компилятора.
Остающиеся упомянутые выше функции TLC возвращают TRUE
или FALSE
в зависимости от того, используется ли конкретный стандартный тип данных C, чтобы содержать данный указанный в API тип данных. Обратите внимание на то, что эти функции не обязательно дают взаимоисключающие ответы для данного указанного типа данных, вследствие того, что типы данных C могут потенциально перекрыться в размере. В C,
sizeof (char) ≤ sizeof (короткий) ≤ sizeof (int) ≤ sizeof (долго).
Один или несколько из этих типов данных C может быть, и очень часто, тот же размер.