Разное

Оптимизация кода в микроконтроллерах

Автор: Laura McKinney
Дата создания: 4 Апрель 2021
Дата обновления: 11 Май 2024
Anonim
AVR 28# Режимы оптимизации кода компилятором
Видео: AVR 28# Режимы оптимизации кода компилятором

Содержание

Автор завершил свой последний год инженерного проекта с микроконтроллерами dsPic, получив обширное представление об этих устройствах.

Код микроконтроллера на языке C может потребовать оптимизации в некоторых расширенных приложениях. Эта оптимизация кода практикуется для уменьшения двух важных вещей:

  1. Размер кода: Микроконтроллеры могут хранить ограниченные данные и инструкции из-за ограниченного размера их оперативной памяти. Поэтому код необходимо оптимизировать, чтобы доступная память для команд и данных могла использоваться наиболее эффективным образом.
  2. Время выполнения кода: Микроконтроллеры - это последовательные устройства, которые выполняют одну инструкцию за раз. Каждая инструкция сборки потребляет определенное количество тактов для своего выполнения. Следовательно, код должен быть оптимизирован, чтобы гарантировать, что он выполняет требуемую задачу за наименьшее количество тактов или инструкций по сборке. Чем меньше тактов использует код, тем быстрее он работает. Это означает, что приложения могут работать быстрее, поскольку время обработки сводится к минимуму.

В этой статье представлены советы и рекомендации, которые можно использовать для уменьшения размера и времени выполнения кода микроконтроллера.


Среда разработки Microchip MplabX будет использоваться для демонстрации примеров там, где это необходимо.

Как экспериментально измерить время выполнения кода

Чтобы получить представление о том, сколько времени на самом деле требуется вашему коду для выполнения в реальном времени, вам необходимо измерить его экспериментально. Логический анализатор можно удобно использовать для измерения времени выполнения кода, и желающие могут узнать о процессе для этого у меня по электронной почте. Кроме того:

  • Некоторые компиляторы имеют возможность подсчитывать тактовые циклы, которые потребляет код.
  • Некоторые отладчики, например ICD 3 от микрочипа, могут напрямую измерять время выполнения с помощью секундомера.

1. Знайте вычислительную мощность и размер памяти вашего микроконтроллера.

Не всегда тактовая частота (МГц) дает истинное представление о скорости обработки микроконтроллера, более реалистичным показателем является MIPS (мегаинструкций в секунду) или количество инструкций, которые MCU может выполнить за секунду.

Микроконтроллеры обычно варьируются от 60–70 MIPS в категории high-end до 8-битных AVR на 20 MIPS. Микроконтроллер с высоким MIPS, вероятно, будет дороже, чем устройство низкого уровня, поэтому здесь вам нужно найти компромисс между стоимостью и скоростью обработки.


Микроконтроллеры имеют отдельную память для хранения данных и программного кода. Размер их обоих можно узнать из таблицы. Вам может понадобиться MCU с большим объемом памяти, если ваш код существенно большой.

2. Выбор переменных для оптимизации размера кода.

Микроконтроллеры имеют ограниченную память данных, обычно от 1 до 4 Кбайт. В этом случае разумно выбрать наиболее подходящий тип переменной в соответствии с ожидаемым диапазоном сохраняемой даты. В таблице ниже приведены эти переменные:

Сводка переменных, используемых в языке Си.

Тип переменнойРазмер в байтахДиапазон

bool

1

Только 0 или 1

символ

1


От -128 до 127

int

2

От -32 768 до 32 767

беззнаковое целое

2

От 0 до 65 535

длинный

4

От -2 147 483 648 до 2 147 483 647

плавать

4

Точность до 6 знаков после запятой

двойной

8

Точность до 15 знаков после запятой

длинный двойной

10

Точность до 19 знаков после запятой

Пример:

  • Если две переменные X и Y должны быть добавлены, и результат должен быть сохранен в Z, но ожидается, что значение Z будет выше 65 535 после сложения, тогда Z может быть объявлено как длинное, а X и Y могут быть объявлены как беззнаковые. int, значения X и Y также не должны стать отрицательными. Это сэкономит 04 байта в памяти данных, которые в противном случае были бы израсходованы, если бы все переменные были объявлены как длинные.
  • Две переменные X и Y, значения которых должны быть целыми числами, должны быть разделены, но результат деления может дать десятичное число, тогда X и Y могут быть объявлены как int, а результат может быть объявлен как float или double в зависимости от требуемая точность.

Выбор типа данных может иметь решающее значение при объявлении массивов, содержащих большое количество элементов.

3. Выбор переменных для оптимизации времени выполнения кода.

  • Это установленный факт, что вычисления с плавающей запятой занимают больше времени, чем вычисления с фиксированной запятой. Не используйте переменную с плавающей запятой, если десятичное значение не требуется. По возможности работайте с целыми числами без знака.
  • Локальные переменные предпочтительнее глобальных. Если переменная используется только в функции, она должна быть объявлена ​​в этой функции, потому что доступ к глобальным переменным происходит медленнее, чем к локальным переменным.
  • 8-битный MCU быстрее найдет переменную размером в один байт для доступа, а 16-битный MCU обнаружит, что доступ к 2-байтовой переменной проще из-за длины сгенерированного адреса.

4. Оптимизация арифметических операций

Арифметические операции можно оптимизировать следующими способами.

  1. Используйте справочные таблицы предварительно рассчитанных значений вместо оценки синуса или любой другой тригонометрической функции или любой другой операции, результат которой может быть заранее известен в коде.
  2. В случае, если справочная таблица синуса уже хранится в памяти, косинус может быть вычислен путем перемещения указателя массива, эквивалентного 90 градусам.
  3. Среди четырех арифметических операций деление и умножение занимают больше всего времени обработки, на практике оно может составлять сотни микросекунд или около того в случае значений с плавающей запятой.
  4. Используйте инструкции битового сдвига вместо деления и умножения. Инструкция сдвига вправо 3 служит для деления на 23 где в качестве инструкции сдвига влево 1 будет служить для умножения на 21.

5. Используйте микроконтроллер с поддержкой DSP для интенсивных вычислений.

Некоторые микроконтроллеры имеют процессор DSP, отличный от обычного ALU, встроенный в их архитектуру. Этот процессор DSP предназначен для выполнения арифметических вычислений очень быстро за наименьшее количество тактовых циклов (в большинстве случаев один), во много раз быстрее, чем ALU.

Инструкции, которые процессор DSP может выполнять быстрее, чем ALU:

  • Инструкции битового сдвига и поворота.
  • Умножение, деление и другие арифметические операции.
  • Вычисление синусов и других тригонометрических функций.
  • Все операции DSP, такие как БПФ, ДПФ, свертка и КИХ-фильтрация.

Использование процессора DSP микроконтроллера требует, чтобы:

  • В проект включены отдельные библиотеки DSP.
  • Названия функций отличаются от стандартной математической библиотеки языка Си. Документацию по этим библиотекам и функциям можно получить на веб-сайтах соответствующих производителей.
  • В движке DSP используется другой тип переменной - «дробный». Узнайте, как использовать переменные дробного типа, прежде чем переходить к функциям библиотеки dsp.

Обратите внимание, что стандартные функции математической библиотеки не будут вызывать механизм DSP, потому что они транслируются в инструкции сборки ALU.

6. Работа с прерываниями

Используйте прерывания для выполнения определенных функций, таких как:

  • Чтение значений АЦП.
  • Отправка и получение от UART.
  • Обновление регистров рабочего цикла ШИМ.
  • Связь CAN или I2C.

Прерывания будут обслуживать эти функции быстрее, чем выполнение их в основном теле посредством вызова функции или встроенного кода.

Прерывания также будут срабатывать только при необходимости, тогда как, если они закодированы в основном теле, код будет выполняться на каждой итерации цикла while (1).

7. Используйте лучшие доступные компиляторы.

Компиляторы могут автоматически реализовывать некоторые из описанных выше оптимизаций при переводе кода с языка C на язык ассемблера, если они правильно настроены. Ищите параметры оптимизации в своем компиляторе и, если возможно, обновитесь до профессиональных версий компиляторов, поскольку они являются более мощными оптимизаторами кода.

8. Разумно используйте условные операторы.

  • При использовании серии операторов if-else сначала сохраните наиболее вероятное условие. Таким образом, MCU не нужно будет сканировать все условия после того, как он найдет истинное условие.
  • Оператор switch-case обычно быстрее if-else.
  • Используйте вложенные операторы if-else вместо ряда операторов. Блок if-else, содержащий множество операторов, может быть разделен на более мелкие подветви для оптимизации для худшего (последнего) условия.

9. Используйте встроенные функции

Функции, которые должны использоваться в коде только один раз, могут быть объявлены как статические. Это заставит компилятор оптимизировать эту функцию до встроенной функции, и, следовательно, код сборки не будет транслироваться для вызова функции.

  • Функция может быть объявлена ​​встроенной с помощью ключевого слова static.

10. Используйте декрементированные циклы

Уменьшенный цикл будет генерировать меньше кода сборки по сравнению с увеличенным циклом.

Это связано с тем, что в цикле приращения требуется инструкция сравнения для сравнения индекса цикла с максимальным значением в каждом цикле, чтобы проверить, достигает ли индекс цикла максимального значения. Напротив, в цикле декремента это сравнение больше не требуется, потому что результат декремента индекса цикла установит нулевой флаг в SREG, если он достигнет нуля.

Учитывая, что цикл должен повторяться сто раз, сокращение одной инструкции из цикла позволит избежать его выполнения сотни раз, поэтому влияние, вероятно, будет более значительным, когда цикл будет повторяться много раз.

Заключение

Эти советы могут быть полезны, но их истинное применение и эффективность зависят от навыков программиста и команды, которую он имеет над своим кодом. Помните, что размер программы не всегда определяет время выполнения, некоторые инструкции могут потреблять больше тактов, чем другие, поэтому навыки работы с программой снова должны сыграть свою роль.

Эта статья точна и правдива, насколько известно автору. Контент предназначен только для информационных или развлекательных целей и не заменяет личного или профессионального совета по деловым, финансовым, юридическим или техническим вопросам.

Статьи для вас

Мы советуем

Советы по ведению блога: как узнать, когда закрыть блог
Интернет

Советы по ведению блога: как узнать, когда закрыть блог

Хайди Торн - сторонник самостоятельной публикации и автор научно-популярных, электронных и аудиокниг. Она бывший редактор торговой газеты.Признание: я блогер и только что закрыл два блога. Какие? Заче...
Обзор веб-камеры Emeet Nova Auto-Focus с автофокусом
Компьютеры

Обзор веб-камеры Emeet Nova Auto-Focus с автофокусом

Уолтер Шиллингтон пишет о продуктах, которые знает не понаслышке. Его статьи посвящены здравоохранению, электронике, часам и предметам домашнего обихода.Сейчас я слишком много времени провожу на вирту...