Целочисленное переполнение указателя для данных графика

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

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

Для получения дополнительной информации о насыщении и переносе для целочисленного переполнения, смотрите Насыщение и Перенос (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 продолжает отмечать следующие ситуации:

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

  • Операции разделения на нулевые