Обработайте целочисленное переполнение для данных о графике

Когда целочисленное переполнение может произойти

Для некоторых арифметических операций процессор может должен быть взять n битное значение фиксированной точки и сохранить его в битах m, где mn. Если m <n, уменьшаемая область значений значения может вызвать переполнение для арифметической операции. Некоторые процессоры идентифицируют это переполнение как Inf или NaN. Другие процессоры, особенно цифровые сигнальные процессоры (DSPS), обрабатывают переполнение путем насыщения или переноса значения.

Для получения дополнительной информации о насыщении и переносящийся для целочисленного переполнения, смотрите Насыщение и Переносящийся (Fixed-Point Designer).

Поддержка обработки целочисленного переполнения в графиках

Поскольку Stateflow® строит диаграмму в моделях Simulink®, можно управлять, происходит ли насыщение для целочисленного переполнения. Используйте свойство диаграммы, Saturate on integer overflow, чтобы управлять обработкой переполнения.

ФлажокКогда использовать эту установкуОбработка переполненияПример результата
ВыбранныйПереполнение возможно для данных в вашем графике, и вы хотите явную защиту насыщения в сгенерированном коде.Переполнение насыщает или к минимальному или к максимальному значению, которое может представлять тип данных.Переполнение, сопоставленное с 8-битным целым числом со знаком, насыщает к –128 или +127 в сгенерированном коде.
ОчищенныйВы хотите оптимизировать эффективность сгенерированного кода.Обработка переполнения зависит от компилятора C, который вы используете для генерации кода.Номер 130 не помещается в 8-битное целое число со знаком и переносится к –126 в сгенерированном коде.

Арифметические операции, для которых можно включить защиту насыщения:

  • Унарный минус: A

  • Бинарные операции: a + b, ab, 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;

Для каждого вычисления применяются следующие типы данных и пределы насыщения.

ВычислениеТип данныхПределы насыщения
tmpint32(MIN_INT32, MAX_INT32)
resultint32(MIN_INT32, MAX_INT32)
yuint8(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 продолжает отмечать следующие ситуации:

  • Нарушения данных из области значений на основе минимальных и максимальных проверок диапазона

  • Операции деления на нуль