Для некоторых арифметических операций процессору может потребоваться взять n
- битовое значение с фиксированной точкой и сохраните его в m
биты, где m
≠ n
. Если m
<n
уменьшенная область значений значений может вызвать переполнение для арифметической операции. Некоторые процессоры идентифицируют это переполнение как Inf
или NaN
. Другие процессоры, особенно цифровые сигнальные процессоры (DSP), обрабатывают переполнения, насыщая или оборачивая значение.
Для получения дополнительной информации о насыщении и переносе для целочисленного переполнения, смотрите Насыщение и Перенос (Fixed-Point Designer).
Для Stateflow® графики в Simulink® модели, можно контролировать, происходит ли насыщение для целочисленного переполнения. Используйте свойство графика, Saturate on integer overflow, чтобы управлять обработкой переполнения.
Флажок | Когда использовать эту настройку | Обработка переполнения | Пример результата |
---|---|---|---|
Отобранный | Переполнение возможно для данных на графике, и вы хотите явную защиту насыщения в сгенерированном коде. | Переполнения достигает минимального или максимального значения, которое может представлять тип данных. | Переполнение, сопоставленное с 8-битным целым числом со знаком, достигает -128 или + 127 в сгенерированном коде. |
Очищенный | Вы хотите оптимизировать эффективность сгенерированного кода. | Обработка переполнений зависит от компилятора C, который вы используете для генерации кода. | Число 130 не помещается в подписанное 8-битное целое число и оборачивается к -126 в сгенерированном коде. |
Арифметические операции, для которых можно включить защиту от насыщения:
Унарный минус: - a
Бинарные операции: a + b
, a
– b
, a * b
, a / b
, a ^ b
Операции назначения: a += b
, a
– =b
, a *= b
, a /= b
В графиках C операции шага и декремента: ++
, --
Когда вы выбираете Saturate on integer overflow, имейте в виду, что:
Насыщение применяется ко всем промежуточным операциям, а не только к выходу или конечному результату.
Генератор кода может обнаружить некоторые случаи, когда переполнение невозможно. В этих случаях сгенерированный код не включает защиту от насыщения.
Чтобы определить, является ли снятие флажка Saturate on integer overflow безопасной опцией, выполните тщательный анализ вашей логики, включая симуляцию при необходимости. Если насыщение необходимо только в некоторых разделах логики, инкапсулируйте эту логику в атомарные субдиаграммы или функции MATLAB и задайте другой набор настроек насыщения для этих модулей.
Графики используют ANSI® Правила C для целочисленного продвижения.
Все арифметические операции используют тип данных, который имеет тот же размер слова, что и размер целевого слова. Поэтому промежуточный тип данных в арифметической операции с цепочкой может отличаться от типа данных операндов или конечного результата.
Для операндов с целыми типами, меньшими, чем размер целевого слова, продвижение к большему типу с тем же размером слова, что и для целевого размера. Это неявное приведение происходит до того, как происходят какие-либо арифметические операции.
Для примера, когда размер целевого слова составляет 32 бита, неявное приведение к int32
происходит для операндов с типом uint8
, uint16
, int8
, или int16
прежде чем произойдут какие-либо арифметические операции.
Предположим, что у вас есть следующее выражение, где y
, u1
, u2
, и u3
имеют uint8
тип:
y = (u1 + u2) - u3;
Основываясь на целочисленных правилах продвижения, это выражение эквивалентно следующим операторам:
uint8_T u1, u2, u3, y; int32_T tmp, result; tmp = (int32_T) u1 + (int32_T) u2; result = tmp - (int32_T) u3; y = (uint8_T) result;
Для каждого вычисления применяются следующие типы данных и пределы насыщения.
Вычисление | Тип данных | Пределы насыщения |
---|---|---|
tmp | int32 | (MIN_INT32, MAX_INT32) |
result | int32 | (MIN_INT32, MAX_INT32) |
y | uint8 | (MIN_UINT8, MAX_UINT8) |
Предположим, что u1
, u2
, и u3
равны 200. Поскольку пределы насыщения зависят от промежуточных типов данных, а не от типов операнда, вы получаете следующие значения:
tmp
- 400.
result
- 200.
y
- 200.
Предположим, что вы задаете Wrap on overflow в панели Diagnostics: Data Validity диалогового окна Параметры конфигурации модели (Model Configuration Parameters) значение error
или warning
. Когда вы выбираете Saturate on integer overflow, Stateflow не помечает случаи целочисленного переполнения во время симуляции. Однако Stateflow продолжает отмечать следующие ситуации:
Нарушения данных вне области значений, основанные на минимальных и максимальных проверках области значений
Операции разделения на нулевые