По возможности ограничьте длины слов типа данных с фиксированной точкой в модели, чтобы они были равны целому размеру целевого микроконтроллера или были меньше его. Это приводит к меньшему количеству математических команд в микроконтроллере и сокращает время ПЗУ и выполнения.
Эта рекомендация в значительной степени применима к глобальным переменным, которые потребляют глобальную оперативную память. Например, блоки единичной задержки имеют дискретные состояния, которые имеют те же длины слов, что и их входные и выходные сигналы. Эти дискретные состояния являются глобальными переменными, которые потребляют глобальную оперативную память, которая является дефицитным ресурсом во многих встраиваемых системах.
Для временных переменных, которые занимают только регистр ЦП или расположение стека на короткое время, пространство, занимаемое long менее критична. Однако, в зависимости от операции, использование long переменные в математических операциях могут быть дорогими. Сложение и вычитание длинных целых чисел обычно требует тех же усилий, что и сложение и вычитание правильных целых чисел, так что операция не является проблемой. В отличие от этого, умножение и деление с длинными целыми числами может потребовать значительно большего и более медленного кода.
По возможности избегайте использования чисел с фиксированной точкой со смещением. В некоторых случаях при тщательном выборе отклонений можно избежать значительного увеличения ПЗУ и времени выполнения. Дополнительные сведения о выборе соответствующих отклонений в тех случаях, когда это необходимо, см. в разделе Рекомендации по арифметике и масштабированию. например, при взаимодействии с аппаратным устройством со встроенным смещением. В целом, однако, безопаснее вообще избегать использования чисел с фиксированной точкой со смещением.
Ввод данных в таблицы поиска является важным исключением из этой рекомендации. Если входные данные таблицы подстановки и соответствующие входные данные используют одно и то же смещение, то для этой операции не существует штрафа, связанного с ненулевым смещением.
Для большинства операций с фиксированной точкой и целыми числами программное обеспечение Simulink ® предоставляет возможности обработки переполнений и округления вычислений. Традиционный рукописный код, особенно для управляющих приложений, почти всегда использует режим округления «без усилий». Например, чтобы уменьшить точность переменной, она смещается вправо. Для неподписанных целых чисел и дополнений двух подписанных целых чисел смещение вправо эквивалентно округлению до пола. Чтобы получить результаты, сравнимые с или лучше, чем вы ожидаете от традиционного рукописного кода, в большинстве случаев вы должны округлиться до пола.
Основным исключением из этого правила является поведение округления целочисленного деления со знаком. Язык C оставляет это поведение округления неопределенным, но для большинства целей режим «без усилий» округляется до нуля. Для беззнакового деления всё неотрицательно, поэтому округление до пола и округление до нуля идентичны.
Можно повысить эффективность кода, задав значение параметра Параметры конфигурации модели > Реализация оборудования > Сведения об устройстве > Округления целочисленного деления с подписью на параметр, чтобы описать, как конечный объект производства обрабатывает округление для разделения с подписью. Для блоков продуктов, выполняющих только деление, наилучшие результаты дает установка параметра Режим округления по целому числу в режиме округления целевого производственного объекта. Вы также можете использовать Simplest режим округления для блоков, где он доступен. Дополнительные сведения см. в разделе Режим округления: простейший.
Варианты обработки переполнения также оказывают большое влияние на эффективность создаваемого кода. Использование программного обеспечения для обнаружения ситуаций переполнения и насыщения результатов требует, чтобы код был намного больше и медленнее по сравнению с простым игнорированием переполнений. Когда переполнения игнорируются для неподписанных целых чисел и двух чисел со знаком дополнения, результаты обычно оборачиваются вокруг 2N по модулю, где N - количество битов. Необработанные переполнения, которые оборачиваются, очень нежелательны для многих ситуаций.
Однако из-за необходимости в размере и скорости кода традиционный рукописный код содержит очень мало программного обеспечения. Обычно масштабирование с фиксированной точкой устанавливается очень тщательно, чтобы переполнение не происходило в большинстве вычислений. Код для этих расчетов безопасно игнорирует переполнение. Чтобы получить результаты, сравнимые или лучшие, чем вы ожидаете от традиционного рукописного кода, для блоков Simulink, выполняющих эти вычисления, не следует выбирать параметр Saturate on integer overflow.
В конструкции может быть несколько мест, где может произойти переполнение и необходима защита от насыщения. Традиционный рукописный код включает в себя программную насыщенность для этих нескольких мест, где это необходимо. Чтобы получить сопоставимый сгенерированный код, параметр Saturate on integer overflow должен быть выбран только для нескольких блоков Simulink, которые соответствуют этим вычислениям риска.
Дополнительное преимущество использования наиболее эффективных вариантов обработки переполнения и округления состоит в том, что вычисления часто сокращаются от нескольких инструкций, требующих нескольких строк кода C, до небольших выражений, которые могут быть свернуты в нижестоящие вычисления. Сворачивание выражения - это метод оптимизации кода, который дает такие преимущества, как минимизация необходимости хранения промежуточных вычислений во временных буферах или переменных. Это может уменьшить размер стека и повысить вероятность того, что вычисления могут быть эффективно обработаны с использованием только регистров CPU. Автоматический генератор кода может тщательно применять сворачивание выражения по частям модели и часто видеть оптимизации, которые могут быть неочевидными. Автоматические оптимизации этого типа часто позволяют сгенерированному коду превышать эффективность типичных примеров рукописного кода.
В дополнение к кончику, упомянутому в разделе Wrap and Round to Floor или Simpest, для получения максимальных преимуществ сворачивания выражения необходимо также убедиться, что класс Storage имеет значение Auto для сигналов в модели. При выборе параметра, отличного от Auto, необходимо назвать сигнал, и в сгенерированном коде создается отдельная инструкция. Поэтому используйте только настройку, отличную от Auto когда это необходимо для глобальных переменных.
Дополнительные сведения об установке класса сигналов Storage см. в разделе Настройка сигнальных данных для генерации кода C.