Ардуино цикл: Урок 4. Arduino — цикл for. Изучаем Ардуино без Arduino.

Ардуино while

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


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

По завершению появится ссылка для доступа к найденным материалам.

Содержание:

  • Циклы в Ардуино for и while
  • arduino while цикл выполняется только один раз
  • Подписаться на ленту
  • Arduino — управляющие операторы
  • Arduino, LabView и датчик температуры
  • Arduino:Примеры/WhileLoop
  • Программирование Arduino урок 15 — цикл while
  • Цикл While не прекращается

ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: LESSON 7 Using While Loops with Arduino

Циклы в Ардуино for и while


И таки макроса loop там нет. Есть функция loop , которая вызывается из замаскированного main :. Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. Что быстрее while true или for ;;? Кто же пишет более оптимальный код. Я написал 2 исходника: while. Кому лень читать ассемблерные листниги — можете прокрутить страницу вниз. Так же оптимизации не повлияли на реализацию for — он тоже всегда был из 3х команд: mov, callq, jmp. Между собой mov, callq и jmp ничем не отличались.

Длинна команд в байтах во всех 6и случаях неизменна. Страница памяти одна. Да это 97 страница Виртуальной памяти Виртуального адресного пространства процесса. Но именно она нам и нужна. Итог while true и for ;; идентичны по производительности между собой и с любыми оптимизациями -Ox.

Источник бесперебойного питания на источнике бесперебойной подачи информации Читайте на Хабре. Читают сейчас. Для охлаждения батареи электромобиля Tesla после ДТП понадобилось 11 тонн воды и специальный контейнер для эвакуации 25,5k Поделиться публикацией.

Похожие публикации. Заказы Библиотека и утилита для устройств банкомата принтер, диспенсер 0 откликов 31 просмотр.

Сверстать презентации PowerPoint 16 откликов просмотра. Разработка на C 6 откликов 56 просмотров. Все заказы Разместить заказ. Ну раз нет разницы в производительности, я считаю, что все же лучше использовать while true , т.

Можно еще и for ;;0 например написать. Ну, лет 10 назад на Turbo C 2. С тех пор на C я не писал, так что, боюсь, всё уже забыл. AraneusAdoro 23 октября в 0. Гугл выплюнул такую страницу. Так это цитата. Слепорылый я. Мне показалось, что forgotten привёл пример своего кода. Xazzzi 24 октября в 0.

А еще можно найти это на lurkmore. Если в пределах проекта договорились использовать while true , то и отключить одно предупреждение не проблема. Для полноты, мне кажется, стоит добавить хотябы один результат с компилятором Visual Studio.

Привыкать к автоматическому приведению типов — не есть хорошо. Всё есть 1 и 0. Это же не значит, что нужно писать бинарные данные. На самом деле, писать while 1 или while true или for ;; — дело принятого форматирования и каждый выбирает для себя свой удобный вариант.

Главное, чтобы в пределах одного проекта использовалась везде идентичное использование написание. UPD: масло масленное. Либо вы неверно понимаете природу boolean значений в C, либо неверно читаете мои комментарии.

Я не сказал, что записываю значение true в бинарном виде. Я сказал, что записываю его в той самой форме, в которой его воспринимает компилятор. Утверждать, что в C литерал 1 приводится к литералу true — безграмотность, извините.

Простите, виноват, не правильно выразился. Это был ответ на ваш комментарий, что Вы сразу даёте конечное значение. Как бы параллель с бинарными данными: все, что мы пишем в любом случае становится бинарными данными, но ведь мы не пишем прямо бинарные данные. Я ни в коем случае не подразумеваю, что только так нужно делать, это уже выбор каждого.

Безусловно, вы правы, это выбор каждого. Во мне скорее говорит старая привычка, сформировавшаяся при разработке на Си в достаточно давние времена.

На StackOverflow, к слову, есть дискуссия на эту тему. Согласно википедии , тип Boolean определяется как int. А true и false — как макросы для 1 и 0, соответственно. Вероятно, википедия немного лукавит. Сейчас еще погуглил. Psionic 23 октября в 0. В Студии инт занимает 4 байта, а bool 1 — в МиниГВ аналогично.

Дефакто выделенный байт может иметь различных состояний — студия просто возвращет тру если не равно нулю, а МиниГВ проверяет только крайний правый бит — правда не ясно как на это смотрят ребята из комитета станадартов. Выше я уже отписал, что википедия видимо лукавит. Ну логично предположить, если у Вас был курс компиляторов, что for — это while. Ответят — while 1 , разница в один символ, но читабельность! Valery4 23 октября в 0.

Статья просто шикарная! А сделаете сравнение скорости обработки двойных и одинарных кавычек в JS? И сравнение скорости обработки переменной компилятором GCC если буквы написаны в алфавитном порядке и в обратном алфавитном порядке?

Мне почему-то кажется, что в обратном порядке компилятору будет быстрее — как в жизни — сначала самое тяжёлое делается, а потом лёгкая мелочьь уже добивается запросто. А если начинать с мелких кодов, то на крупные у компилятора может не остаться сил. KvanTTT 23 октября в 0. Ну в жизни все по-разному. Соответственно у компилятора принятие решения тоже зависит от его настроения, состояния оперативной памяти, температуры процессора, фазы луны и других критических факторов.

Скорость распознавания лексем от этих факторов не зависит. Для этого есть bit sets или вообще — таблично управляемые конечные автоматы. Aingis 23 октября в 0. В случае табличного конечного автомата — можно считать, что одновременно. Битовое перемножение, не более.

Даже если это выглядит так для программиста. Что делает процессор? Проверьте, прогоните тесты. Некрасова выше абсолютно бесполезен. То что нельзя строго одновременно проверить один символ сразу на два значения? Обычно, сравнивая кавычки, далее чем за сравнение цикла в итераций руки ни у кого не доходят. Тут же бенчмарк подкреплен анализом скомпилированного участка кода с выводами и объяснениями.

ZyXI 22 октября в 0. Почему не оптимально? Если вы включите оптимизацию хотя бы -O1 , то получите ровно то же самое. Писать, конечно, дольше, но если использовать сниппеты, то без разницы. А это плохо. В любом случае спор о спичках.

Это, скорее, претензия к создателям языка. Его приходится компенсировать специальными костылями с препроцессором. Причина очевидна — в языке уже есть аж целых два идиоматических способа выразить бесконечный цикл; зачем добавлять сахар, который не делает код ни короче, ни понятней? Кстати, заметьте, что ни один мэйнстримный ЯП с си-подобным синтаксисом не ввёл такой сахар — хотя в других областях понадобавляли много чего, вплоть до лямбд.

Это как бы говорит нам о ценности данной фичи…. Я бы не назвал это мейнстримным языком. Впрочем, даже если опустить эту планку, суть аргумента не меняется — наиболее популярные языки-последователи этой темы не касались, при том, что была масса других нововведений.


arduino while цикл выполняется только один раз

Отправить комментарий. Прерывания в Ардуино. Часть 1. Что такое прерывание Внешние прерывания attachInterrupt volatile Функции interrupts и noInterrupts Атомарно исполняемые блоки кода detachInterrupt Дребезг контактов Использование прерываний для выхода из спящего режима Запрос прерывания во время выполнения обработчика Общие рекомендации по написанию обработчиков прерываний. Функция имеет следующий синтаксис:.

Цикл while() работает, в данном случае не работает delay(), а чтобы оный заработал (как и прочие подобные arduino’вские функции).

Подписаться на ленту

Сегодня руки дошли до того, чтобы оформить свои мысли относительно циклов в очередной пост. Циклы наряду с операторами выбора являются важнейшими управляющими конструкциями. Основная задача циклов — это многократное повторение определенного набора операторов. Всего циклических конструкции в синтаксисе языка Си три: while условие ; do while условие ; for инициализация ; условие ; приращение ;. Для большей гибкости управления циклами предусмотрено два оператора: continue — заставляет программу пропустить все операторы до конца цикла и начать цикл заново; break — пропустить все операторы до конца цикла и выйти из цикла. Чтобы увидеть разницу между работой приведенных выше команд и управляющих конструкций, приведу сравнительную блок схему всех трёх циклов. Полный размер Циклические управляющие конструкции. Между конструкциями while и do while принципиальная разница только в том, что тело циклa while может быть не выполнено ни разу, если условие изначально ложное, а в do while тело цикла сначала выполнится, а уже потом будет проверяться условие.

Arduino — управляющие операторы

Используя наш сайт, вы подтверждаете, что прочитали и поняли политику о куки , политику конфиденциальности и пользовательское соглашение. Stack Overflow на русском — это сайт вопросов и ответов для программистов. Регистрация займёт не больше минуты. Провожу эксперименты с Arduino и решил замучать цикл while вместо loop.

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

Arduino, LabView и датчик температуры

Начнем с того что с циклами вы уже по-любому сталкивались. Это конечно же основной цикл любой программы loop. Цикл это грубо говоря рамки, код внутри которых выполняется сверху вниз и повторяется с начала, когда достигает конца. Продолжается это дело до тех пор, пока выполняется какое то условие. Есть два основных цикла, с которыми мы будем работать, это for и while. Цикл for обычно содержит переменную, которая изменяется на протяжении работы цикла, мы можем пользоваться её меняющимся значением в своих целях.

Arduino:Примеры/WhileLoop

Цикл while будет проводить вычисления пока выражение помещенное в круглые скобки не станет логически ложным. Для отправки комментария вам необходимо авторизоваться. Ваш IP: Цикл while Arduino. Arduino Цикл do

Цикл while() работает, в данном случае не работает delay(), а чтобы оный заработал (как и прочие подобные arduino’вские функции).

Программирование Arduino урок 15 — цикл while

Например, превышает ли входное значение заданное число. Формат оператора if следующий:. Иначе говоря, если выражение в круглых скобках истинно, выполняются операторы внутри фигурных скобок. В противном случае, фрагмент в фигурных скобках будет пропущен.

Цикл While не прекращается

ВИДЕО ПО ТЕМЕ: #6 Условные операторы и циклы. Основы Arduino для начинающих — Центр РАЗУМ Омск

Я работаю над тем, чтобы сделать палач-ардуино. Это неполное, поэтому в настоящее время все, что он делает, это получение последовательного ввода и создание подчеркиваний и пробелов на ЖК-экране 16×2. Я не получаю сообщений об ошибках, и первый символ работает нормально. Заранее спасибо!

Циклы используются для многократного повторения однотипных действий.

Вот где это становится интересным. Удаление цикла while и его содержимого полностью не уменьшает использование динамической памяти. Как ни странно, это не проблема утечки, потому что даже удаление содержимого цикла while полностью не решает никаких проблем. Любая помощь по устранению неполадок, почему динамическое использование памяти настолько высока, было бы высоко оценено! Он выясняет, можно ли получить инструкцию или нет. Если значительная объявленная переменная упоминается только в части кода, которая никогда не будет достигнута, она не вычисляет память, необходимую для этой переменной, при вычислении динамической памяти. Теперь, в зависимости от того, какая из следующих комбинаций объявлена, динамическая память изменяется следующим образом.

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


Alex Morozov Цикл уроков по программированию на C++ для Arduino.

Ecoimpact managers > Интернет вещей > Alex Morozov Цикл уроков по программированию на C++ для Arduino.

Alex Morozov Цикл уроков по программированию на C++ для Arduino.

Arduino и прочие питомцы.

Описание :

Документы базы знаний :

Расширенный поиск   

Полнотекстовый поиск по содержимому документов

  • Arduino ООП и зачем все это нужно

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Arduino оптимизация использования оперативной памяти

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • AVR heap mystic

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 DeepSleep

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 GeoWiFi

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 http OTA

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 RTC память

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 UnReal Time Clock

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 Web and MQTT Framework

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • ESP8266 Web and MQTT Relay Demo

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • MQTT BarScanner

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • PlatformIO или прощай, Arduino IDE

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Relays for ESP8266

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • TSL2561

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • За облаками небо

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Навигация по «Alex Morozov Цикл уроков по программированию на C++ для Arduino»

    Часть 1 Часть 2 Часть 3

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Параметры в скетче для ESP8266

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Размер структур и классов в программах на ESP8266

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Сравнение с функцией millis()

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Умное реле на ESP8266 (версия 2.0)

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Часть 1.

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • » data-id=»5468″ data-latitude=»» data-longitude=»» data-preview=»» data-image=»»>

    Часть 2.

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

  • Часть 3.

    Ecoimpact managers :

    Alex Morozov Цикл уроков по программированию на C++ для Arduino.

delay() Функция Arduino: узкие циклы и код блокировки

Вы когда-нибудь создавали проект Arudino и хотели, чтобы что-то происходило с заданным интервалом времени? Может быть, каждые 3 секунды вы хотите, чтобы сервопривод двигался, или, может быть, каждую 1 минуту вы хотите отправлять обновление статуса на веб-сервер.

Как вы это делаете? Есть ли простая и понятная функция, которая поможет нам в этом? Да, есть! Мы обсудим функцию задержки, а также функцию millis() в видео ниже:

Это вторая часть нашей мини-серии о функциях millis(). Часть 1 помогает нам понять, что делает функция millis(), часть 2 обсуждает узкие циклы и блокирующий код, а часть 3 обсуждает, когда функция millis() затмевает функцию delay().

Темы этого урока

  • Тугие петли
  • Код блокировки
  • Древний рецепт вдохновляющей музыки

Millis() против Delay()

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

Более крутой и эффектный вариант — это функция Arduino millis(). И чем больше вы знакомы с использованием функции millis, помогающей вам синхронизировать события в вашем коде Arduino, тем легче будет позже включить другие части в вашу программу.

Как только вы начнете использовать функцию millis(), вы станете счастливее, веселее и, черт возьми, вы будете нравиться людям.

Тугие петли

Сначала давайте обсудим концепцию узкой петли. И когда мы говорим «узкая петля», что это значит?

Давайте посмотрим на скетч Arduino для демонстрации узкой петли. Начиная с самого простого скетча, у нас есть только две функции: установка пустоты и петля пустоты. И, как вы, возможно, знаете, установка void запускается только один раз, а затем передает шоу циклу void.

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

Выполняет первую строку, затем вторую, затем третью и так далее и тому подобное, пока не дойдет до конца. А потом возвращается наверх.

Как быстро выполняется цикл? Это зависит от того, какую плату Arduino вы используете, но Arduino Uno имеет тактовую частоту 16 мегагерц. Это означает, что каждую секунду на Arduino выполняется 16 миллионов инструкций!

Каждая строка кода не обязательно является одной инструкцией. На самом деле, скорее всего, это несколько инструкций. Но, тем не менее, это относительно быстро (процессор вашего компьютера, вероятно, работает на гигагерцовой скорости… это миллиарды).

Можно ли считать этот пустой набросок зацикленным? Определенно, это настолько быстро и туго, насколько вы можете сделать петлю. Поскольку внутри цикла нет ничего для выполнения, время, необходимое для выполнения скетча, практически равно нулю. Другими словами, интервал от начала цикла до конца короткий (поэтому он быстрый или «напряженный»).

Давайте добавим несколько строк кода. Мы запустим последовательную связь, а затем выведем что-нибудь в окно последовательного монитора.

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

Однако стоит отметить, что этот цикл не такой тугой, как в предыдущем примере. В предыдущем примере у нас не было кода. Так что это просто мчался по петле. Теперь, когда у нас есть функция последовательной печати, потребуется немного времени, чтобы напечатать «Ice Ice Baby» на последовательном мониторе.

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

Итак, мы объявили кнопку и использовали оператор if, чтобы проверить и увидеть если кнопка была нажата. Напряжение на пятом контакте высокое? Если это так, то мы печатаем что-то еще в окно последовательного монитора.

Это тугая петля? Итак, от начала цикла до конца цикла это довольно быстро?

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

Теперь давайте добавим в эту программу задержку, используя функцию Arduino delay(). Вы можете видеть ниже, что мы добавили задержку в тысячу миллисекунд (1 секунду) к циклу.

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

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

Когда Arduino доходит до этой строки кода, это похоже на поход в продуктовый магазин. Вы попадаете в очередь из 12 пунктов или меньше, но затем парень перед вами вытаскивает свою чековую книжку и начинает выписывать чек. Ты знаешь, что будешь там минутку. Здесь такая же сделка.

Так что это не тугая петля. Время от начала цикла до конца цикла довольно значительно. Особенно по сравнению с парой последних программ. Порядок величины времени огромен.

Здесь мы попытались продемонстрировать, что вся эта идея о тугих петлях относительна. Все зависит от вашего приложения. Если вам нужно проверять состояние датчика каждую 10-миллионную долю секунды, то программа, состоящая из трех строк кода, может оказаться недостаточно жесткой, она просто зависит.

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

Таким образом, герметичность петли — относительное понятие.

Код блокировки

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

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

Однако блокирующий код возникает не только тогда, когда мы используем функцию delay().

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

Итак, как долго выполняется этот цикл? Он будет работать какое-то время, потому что ему нужно пройти 100 итераций, прежде чем он остановится.

А что насчет кода после цикла for? Умеет ли бегать? Нет, он должен ждать, потому что он заблокирован циклом for.

Этот цикл for вложен в основной цикл . Является ли цикл for «узким» циклом? Прежде чем вы ответите, давайте еще раз подчеркнем, как вы должны думать об этом: много ли времени требуется, чтобы пройти этот цикл for сверху вниз?

Ну, не совсем так. Там всего две строчки кода. Так что это довольно узкая петля.

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

Подробнее о функции delay()

Давайте поговорим немного подробнее об этой функции задержки. Что мы установили на данный момент?

Во-первых, мы сказали, что функция задержки уменьшает плотность цикла. Если у вас плотная петля и вы добавляете функцию задержки, это займет больше времени и сделает ее менее жесткой. То есть количество времени, которое требуется, чтобы добраться от начала цикла до конца, будет увеличиваться с помощью функции задержки.

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

Вы можете подумать, что эта функция задержки — полная ерунда! В наших проектах это никогда ни к чему не приведет. Но для множества простых программ, которые мы пишем, функция задержки работает фантастически. Он прост в использовании, его действительно легко написать, и он делает именно то, что говорит.

Таким образом, мы не должны обязательно исключать функцию delay() из нашего набора инструментов для программирования. Мы должны просто признать, что это простая функция программирования, которая может работать во многих случаях.

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

В следующем уроке этой серии, часть 3, мы собираемся определить, где это действительно становится проблемой. Вы узнаете, когда имеет смысл использовать функцию delay() в программе, а когда пора переключиться на использование функции millis().

Обзор

Сначала мы говорили о герметичности петли. Мы сказали, что герметичность петли относительна. Это зависит от того, какое у вас приложение.

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

Надеемся, вам понравился этот урок! В следующей части этой серии мы продолжим наше путешествие, изучая, как использовать функцию millis для создания синхронизированных повторяющихся событий в нашем коде Arduino. Увидимся в следующий раз!

» Заблуждения об Arduino 2: Arduino «медленный»

Опубликовано by cybergibbons

Во втором посте о неверных представлениях об Arduino существует распространенная идея о том, что Arduino «медленная». Чаще всего я слышу это в контексте реагирования на действия пользователя, работы с несколькими датчиками, использования светодиодных или ЖК-дисплеев или работы в рамках контура управления. Люди советуют более быстрые микроконтроллеры, такие как серия ARM Cortex.

Давайте рассмотрим здесь основы:

  • ATmega328P на платах Arduino работает на частоте 16 МГц — это 16 миллионов циклов в секунду.
  • Инструкции ATmega328P занимают от 1 до 3 тактов (за исключением инструкций, связанных с подпрограммами, которые занимают 4 или 5 тактов). Среднее значение находится где-то между 1 и 2 для большинства скомпилированных C-кодов.
  • Тогда мы можем сделать вывод, что ATmega328P может выполнять не менее 8 миллионов инструкций в секунду!
  • Трудно напрямую перевести эти инструкции в строки кода C. То, что выглядит простым в C, может потребовать десятков инструкций, а то, что выглядит сложным, можно сделать за одну.
  • Мы по-прежнему можем сказать, что ATmega328P будет разрывать ваш код со скоростью узлов, намного быстрее, чем думает большинство людей.

Так почему люди говорят, что он медленный? Я бы назвал следующие причины:

  • Это 16 МГц, а ПК и телефоны большинства людей работают в диапазоне 1 ГГц, так что это не так уж много. Однако ATmega328P выполняет совсем другие задачи.
  • Он 8-битный, а большинство современных процессоров 32- или 64-битные. Это не имеет большого значения для проектов, использующих Arduino (но будет связано с моим следующим заблуждением!)
  • Частое использование delay() в коде Arduino. Delay() приводит к тому, что процессор просто перегружается — во время работы он не может делать ничего другого. Итак, если у вас есть 4 кнопки, которые предназначены для включения 4 соответствующих светодиодов на 2 секунды, система перестанет отвечать, если вы используете delay() для 2 секунд.
  • Частое использование Serial.print() в большинстве кодов для отладки или отчетов о состоянии. Arduino до 1.0 использует блокировку при отправке данных через последовательный порт. Это означало вывод строки из 80 символов в 9600 бит/с (по какой-то причине по умолчанию) заняло бы более 80 мс, в течение которых процессор больше ничего не мог делать! Даже теперь, когда он использует прерывания, вывод строк занимает много времени.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *