• Ежедневно с 10:00 до 19:00
  • +7 (906) 777-62-68 (Достоевская), +7(495)773-73-16 (общие вопросы)
Education Robots
  • Главная
  • Цены
  • О нас
  • Работа у нас
  • Контакты
  • Главная
  • Цены
  • О нас
  • Работа у нас
  • Контакты
Education Robots > Блог > Полезные советы > Немного о скорости выполнения программ на Arduino-совместимых платах. Часть 2: Пишем программу оптимально: пора сниматься с ручника

Немного о скорости выполнения программ на Arduino-совместимых платах. Часть 2: Пишем программу оптимально: пора сниматься с ручника

  • 10.07.2017
  • Автор: admin
  • Рубрика: Полезные советы

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

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

Рассмотрим это на примере одних из самых часто выполняемых операций – на примере цифрового вывода в линию порта функцией digitalWrite. Вы когда-либо задавали себе вопрос «Сколько времени занимает запись единицы или нуля в линию порта?». Вряд ли. На это редко обращают внимание. А зря…

Давайте измерим время выполнения функции digitalWrite. Для этого возьмём стандартный скетч «Blink» и просто уберём из него задержки (рис. 1) – будем как можно быстрее записывать в линию порта ноль и единицу. Загрузим получившийся скетч в плату и логическим анализатором измерим продолжительность единицы и нуля на линии порта (рис. 2).

Результаты удивляют — примерно по 7.5 мкс (микросекунд) на запись единицы и нуля. Удивляют тем, что такая простая функция может съедать так много времени.

Одна операция выполняется микроконтроллером семейства AVR за один такт. При стандартной тактовой частоте 16 МГц на выполнение одной элементарной операции уходит 0,0625 мкс. Следовательно, функция digitalWrite состоит из примерно 120 элементарных операций. Много это или мало? Это ужасно много. Забегая наперёд, скажем, что для этого достаточно всего двух элементарных операций. Так почему же функция digitalWrite содержит аж 120?

Всё кроется в самой концепции Arduino. Платформа Arduino предназначена для новичков, поэтому в ней реализовано максимальное удобство для пользователя, местами в ущерб другим характеристикам. Например, пользователь при использовании функции digitalWrite оперирует лишь условным номером линии порта (№15 в нашем примере). Ему, в частности, не нужно знать внутреннюю структуру аппаратных портов микроконтроллера, допустимые режимы работы каждой линии порта, их привязку к выводам самого микроконтроллера. Этим всем, как раз, и занимается функция digitalWrite. Она ищет соответствующие условному номеру регистры аппаратного порта, проверяет, в каком состоянии нужная линия порта, в каком режиме она работает (не используется ли эта линия порта при работе цифровых интерфейсов, ШИМ и т. д.). К тому же, эта функция написана не оптимально.

Забота о пользователях – это, несомненно, хорошо. Но что, если вы уже стали опытным ардуинщиком и в вашем новом устройстве важна скорость работы программы? Решение есть. Реализуем цифровой вывод в линию порта стандартным способом языка С – просто запишем значение «1» и «0» в нужный разряд нужного регистра микроконтроллера по схеме платы. Для этого найдём соответствующие наименование регистра и номер разряда. В нашей плате условной линии №15 соответствует линия PB7 — разряд 7 порта В, значит нам нужны регистр PORTB, 7-й разряд. Исправляем скетч, как показано на рис. 3, загружаем скетч в плату и повторяем измерения.

Смотрим на результаты (рис. 4). Ну это же совсем другое дело! Всё, как мы говорили (ну почти): 0,125 мкс (2 операции) на запись нуля и 1 мкс (16 операций) на запись единицы (из них 2 – собственно запись и ещё 14 безжалостно съедаются функцией loop, которая тоже не оптимизирована). То есть, на один цикл работы у нас теперь уходит 1.125 мкс (18 тактов) вместо 15 мкс (240 тактов) – мы ускорили работу программы более чем в 13 раз. Но это – не предел оптимизации. Продолжение — в следующей части.

Выводы:

  1. Структура программы сильно влияет на скорость её выполнения, поэтому критичные к скорости участки программы обязательно нужно оптимизировать.
  2. Стандартные функции Arduino написаны неоптимально, но зато имеют защиту от неопытности пользователей.

Мы в соцсетях

Курсы и мероприятия

  • Индивидуальное посещение лаборатории
    9 000 ₽
    9 000 ₽
    от 17 лет
  • Робототехника и программирование для взрослых
    5 000 ₽
    5 000 ₽
    от 20 лет
  • Робототехника и программирование для подростков
    5 000 ₽
    5 000 ₽
    от 12 до 16 лет
  • Робототехника и программирование для детей
    5 500 ₽
    5 500 ₽
    от 8 до 11 лет
  • Летние программы 2021 года
    5 000 ₽
    5 000 ₽
    от 8 до 16 лет
  • Подготовка к конкурсам и олимпиадам
    5 500 ₽
    5 500 ₽
    от 12 до 16 лет

Новые записи

  • Детская робототехника в вопросах и ответах
  • Работа будущего: как не быть вытолкнутым с рынка труда
  • Soft skills будущего: для ученика и учителя
  • Образование XXI века, или Как постичь профессии будущего
  • Поздравляем с Новым годом и Рождеством!

Рубрики

  • Новости образования
  • Новости робототехники
  • Новости школы
  • Полезные советы

О нас

Институт «Образовательные роботы» осуществляет системную подготовку взрослых и детей по программированию, 3D печати, электронике и еще 6 направлениям.

    +7 (495) 773-73-16

    info@educationrobots.ru

ЗАПИСАТЬСЯ НА ЗАНЯТИЯ

Популярные курсы

  • Индивидуальное посещение лаборатории
  • Робототехника и программирование для взрослых
  • Робототехника и программирование для подростков
  • Робототехника и программирование для детей

Адреса центров

  • м. Достоевская
    м. Новослободская

     Селезневская, 30/Б-В
    м. Таганская
     Большой факельный 3с2

Время работы центров

Понедельник9:00 - 21:00
Вторник9:00 - 21:00
Среда9:00 - 21:00
Четверг9:00 - 21:00
Пятница9:00 - 21:00
Суббота10:00 - 20:00
Воскресенье10:00 - 20:00
Footer logo
"Образовательные роботы" © 2015–2021
Предложения сайта не являются публичной офертой.
  • Главная
  • Цены
  • О нас
  • Работа у нас
  • Контакты
Поиск
Запись на курс для взрослых

Мы свяжемся с Вами в ближайшее время!



в соответствии с политикой конфиденциальности.


в соответствии с политикой конфиденциальности.

Записаться на курс

Мы свяжемся с Вами в ближайшее время!

Нажимая кнопку «Отправить», даю своё согласие на хранение и обработку персональных данных в соответствии с политикой конфиденциальности.


Отправка ...

Записаться на курс

Мы свяжемся с Вами в ближайшее время!


в соответствии с политикой конфиденциальности.

Посетить вводный урок

Мы свяжемся с Вами в ближайшее время!

Нажимая кнопку «Отправить», даю своё согласие на хранение и обработку персональных данных в соответствии с политикой конфиденциальности.


Отправка ...

Посетить пробный урок

Стоимость пробного урока в Павшинской пойме составляет 500 руб.

Нажимая кнопку «Отправить», даю своё согласие на хранение и обработку персональных данных в соответствии с политикой конфиденциальности.


Отправка ...

Записаться в лагерь

Мы свяжемся с вами в течение 15 минут!

[contact-form-7 404 "Not Found"]
Договориться о встрече

Мы свяжемся с вами в течение 15 минут!


Отправка ...