По возможности ограничьте размеры слова типа данных с фиксированной точкой в вашей модели, чтобы они были равны или меньше целого размера целевого микроконтроллера. Это приводит к меньшему количеству математических инструкций в микроконтроллере и уменьшает ПЗУ и время выполнения.
Эта рекомендация настоятельно относится к глобальным переменным, которые используют глобальную ОЗУ. Для примера Unit Delay блоки имеют дискретные состояния, которые имеют те же размеры слова, что и их вход и выходные сигналы. Эти дискретные состояния являются глобальными переменными, которые используют глобальную ОЗУ, которая является дефицитным ресурсом во многих встраиваемых системах.
Для временных переменных, которые кратко занимают только регистр CPU или расположение стека, пространство, используемое long
менее критична. Однако в зависимости от операции, использования long
переменные в математических операциях могут быть дорогими. Сложение и вычитание длинных целых чисел обычно требует тех же усилий, что и сложение и вычитание регулярных целых чисел, так что операция не является проблемой. Напротив, умножение и деление с длинными целыми числами могут потребовать значительно большего и более медленного кода.
По возможности избегайте использования чисел с фиксированной точкой с смещением. В некоторых случаях, если вы выбираете смещения тщательно, можно избежать значительного увеличения ROM и времени выполнения. См. Рекомендации по арифметике и масштабированию для получения дополнительной информации о том, как выбрать соответствующие смещения в случаях, когда это необходимо; для примера, если вы взаимодействуете с аппаратным устройством, которое имеет встроенное смещение. В целом, однако, безопаснее вообще избегать использования чисел с фиксированной точкой с смещением.
Входные параметры интерполяционных таблиц являются важным исключением из этой рекомендации. Если вход интерполяционной таблицы и связанные входные данные используют то же смещение, то нет штрафа, связанного с ненулевым смещением для этой операции.
Для большинства операций с фиксированной и целочисленной точками Simulink® программное обеспечение предоставляет опции для обработки переполнений и скругления вычислений. Традиционный рукописный код, особенно для приложений управления, почти всегда использует режим округления «без усилий». Например, чтобы уменьшить точность переменной, эта переменная смещена вправо. Для беззнаковых целых чисел и двух комплементарных целых чисел, переключение вправо эквивалентно округлению в пол. Чтобы получить результаты, сопоставимые с или лучше, чем вы ожидаете от традиционного рукописного кода, вы должны округлить к полу в большинстве случаев.
Основным исключением из этого правила является поведение округления целочисленного деления со знаком. Язык C оставляет это округление неопределенным, но для большинства целей режим «без усилий» равен нулю. Для беззнакового деления все неотрицательно, поэтому округление до этажа и округление до нуля идентичны.
Можно улучшить эффективность кода, задав значение параметра Model Configuration Parameters > Аппаратная реализация > Device details > Signed integer distribution rounds to parameter, чтобы описать, как ваша производственная платформа обрабатывает округление для подписанного деления. Для Product блоков, которые делают только деление, установка параметра Integer rounding mode в режим округления вашей производственной платформы дает лучшие результаты. Можно также использовать Simplest
режим округления для блоков, где он доступен. Для получения дополнительной информации см. раздел «Режим округления: самый простой».
Опции обработки переполнения также оказывают большое влияние на эффективность вашего сгенерированного кода. Использование программного обеспечения для обнаружения ситуаций переполнения и насыщения результатов требует, чтобы код был намного больше и медленнее по сравнению с простым игнорированием переполнений. Когда переполнения игнорируются для беззнаковых целых чисел и двух целых чисел со знаком дополнения, результаты обычно оборачиваются по модулю 2N, где N - количество бит. Необработанные переливы, которые оборачиваются, крайне нежелательны для многих ситуаций.
Однако из-за размера кода и потребностей в скорости традиционный рукописный код содержит очень мало насыщения ПО. Как правило, масштабирование с фиксированной точкой очень тщательно устанавливается, так что переполнение не происходит в большинстве вычислений. Код для этих вычислений безопасно игнорирует переполнение. Чтобы получить результаты, сопоставимые с или лучше, чем вы ожидаете от традиционного рукописного кода, параметр Saturate on integer overflow не должен быть выбран для блоков Simulink, выполняющих эти вычисления.
В проекте может быть несколько мест, где может произойти переполнение и необходима защита от насыщения. Традиционный рукописный код включает насыщение программного обеспечения для этих нескольких мест, где это необходимо. Чтобы получить сопоставимый сгенерированный код, параметр Saturate on integer overflow должен быть выбран только для нескольких блоков Simulink, которые соответствуют этим вычислениям риска.
Вторичным преимуществом использования наиболее эффективных опций для обработки переполнения и округления является то, что вычисления часто сокращаются от нескольких операторов, требующих нескольких линий кода С, до небольших выражений, которые могут быть сложены в нисходящие вычисления. Складывание выражения является методом оптимизации кода, который дает преимущества, такие как минимизация необходимости хранения промежуточных расчетов во временных буферах или переменных. Это может уменьшить размер стека и сделать его более вероятным, что вычисления могут быть эффективно обработаны, используя только регистры CPU. Генератор автоматического кода может тщательно применить складывание выражений между частями модели и часто видеть оптимизации, которые могут быть не очевидны. Автоматическая оптимизация этого типа часто позволяет сгенерированному коду превысить эффективность типичных примеров рукописного кода.
В сложении к советам, упомянутым в Переносе и Round to Floor или Simplest, чтобы получить максимальные преимущества складывания выражения, вы также должны убедиться, что Storage class задан как Auto
для сигналов в вашей модели. Когда вы выбираете настройку кроме Auto
, нужно назвать сигнал, и в сгенерированном коде создается отдельный оператор. Поэтому используйте только настройку, отличную от Auto
когда это необходимо для глобальных переменных.
Для получения дополнительной информации об установке Storage class сигналов, смотрите Сконфигурируйте данные сигнала для генерации кода C.