Для некоторых арифметических операций процессор может должен быть взять n
битное значение фиксированной точки и сохранить его в битах m
, где m
≠ n
. Если m
<n
, уменьшаемая область значений значения может вызвать переполнение для арифметической операции. Некоторые процессоры идентифицируют это переполнение как Inf
или NaN
. Другие процессоры, особенно цифровые сигнальные процессоры (DSPS), обрабатывают переполнение путем насыщения или переноса значения.
Для получения дополнительной информации о насыщении и переносящийся для целочисленного переполнения, смотрите Насыщение и Переносящийся (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 продолжает отмечать следующие ситуации:
Нарушения данных из области значений на основе минимальных и максимальных проверок диапазона
Операции деления на нуль