Arduino ide долго компилирует скетч

Arduino ide долго компилирует скетч

Существует простой способ в два раза увеличить скорость загрузки скомпилированного кода в микроконтроллер при использовании Arduino IDE.

Заходим в Настройки в Arduino IDE, снимаем галочку с пункта Проверка кода после загрузки и жмем OK . Вот и все что нужно сделать. Не верите? Откроем большой скетч, который занимает около 30 килобайт во флеш-памяти микроконтроллера. С выбранным пунктом проверки, загрузка файла занимает примерно 24 секунды. Сняв отметку, мы выполним это же действие примерно за 13 секунд.

Что при этом происходит? По умолчанию, Arduino IDE проверяет, что все было записано правильно:

Загрузка:

Проверка:

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

На самом деле, даже с выключенной проверкой, все равно будут произведены две другие проверки ошибок. Одна на уровне загрузчика — каждый блок данных загрузчика STK500 имеет, так называемый циклический избыточный код ( Cyclic redundancy check, CRC ), который представляет из себя алгоритм нахождения контрольной суммы , предназначенный для проверки целостности данных. Другая проверка происходит на уровне соединения между USB и последовательным интерфейсом микроконтроллера (каждый блок данных, переданных через USB имеет свой CRC). Если какое-то сообщение будет повреждено, оно выявляется и исправляется на этих уровнях. Маловероятно, что что ваш скетч будет записан неправильно в Arduino, после того, как вы нажмете Загрузить .

Почему это важно?

Многие скетчи занимают несколько тысяч байт и, выключив проверку, вы сэкономите лишь несколько секунд при их загрузке. Но сколько раз вы загружаете скетч, когда вы работаете над проектом? 10 раз? 50? И над сколькими проектами вы могли бы работать? Некоторые, наверное, загрузили уже десятки тысяч скетчей. Теперь умножьте на казалось бы незначительную экономию при загрузке и вы получите внушительное количество сэкономленного времени. В любом случае, будет точно не хуже, если вы меньше времени будете тратить на наблюдение за миганием светодиодов на TX и RX.

Случаи, при которых проверка не помешает

Так выглядит ошибка при проверке в Arduino IDE

В некоторых случаях вы, возможно, все же захотите проверить свой ​​код. Если вы собираетесь поместить Arduino в спутник или в какой-либо другой ответственный проект, вы можете спать спокойнее, зная, что загруженный в него код является корректным. Если вы подкючаетесь к Arduino при помощи 15-метрового USB-кабеля или у вас провод длиной 2 км при передаче через интерфейс RS485, вы, возможно, захотите произвести проверку после загрузки своего скетча. Хотя также маловероятно, что ошибка проскочет через проверку контрольных сумм, так что решайте сами делать проверку или нет.

На каких платах этот трюк работает?

Это работает с любой платой Arduino, которая использует соединение последовательное USB-соединение (Uno, Mega, Pro Mini, LilyPad Simple, Fio и т.д.). Эти все платы используют один и тот же загрузчик avrdude, в котором по умолчанию устанавливается флаг проверки.

Любые платы, использующие загрузчик Catarina (Leonardo, Micro и т.д.) или загрузчик Halfkay (платы Teensy) имеют гораздо более быстрее загрузчики, и для них преимущество в скорости неочевидно.

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

Источник

Почему Arduino такая медленная и что с этим можно сделать

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

Часть 1 «Вопросы»

Цитируя автора указанной статьи:

Получается проигрыш производительности в данном случае — 28 раз. Разумеется что это не значит, что ардуино работает в 28 раз медленнее, но я считаю, что для наглядности, это лучший пример того, за что не любят ардуино.

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

Напишем простую программу для ардуино (по сути просто скопируем blink).

Зашиваем в контроллер. Так как у меня нет осциллографа, а только китайский логический анализатор, его необходимо правильно настроить. Максимальная частота анализатора 24 MHz следовательно её необходимо уравнять с частотой контроллера — выставить 16MHz. Смотрим .

… долго. Пытаемся вспомнить, от чего зависит скорость работы контроллера — точно, частота. Смотрим в arduino.cc. Clock Speed — 16 MHz, а у нас тут 145.5 kHz. Что делать? Попробуем решить в лоб. На том же arduino.cc смотрим остальные платы:

  • Leonardo — не подайдёт — там тоже 16 MHz
  • Mega — тоже — 16 MHz
  • 101 — подойдёт — 32MHz
  • DUE — ещё лучше — 84 MHz

Можно предположить, что если увеличить частоту контроллера в 2 раза, то частота мигания светодиода тоже увеличится в 2 раза, а если в 5 — то в 5 раза.

Мы не получили желаемых результатов. Да и генератор все меньше и меньше напоминает меандр. Думаем дальше — теперь, наверное, язык плохой. Вроде как есть с, с++, но это сложно(в соответствии с эффектом Даннинга-Крюгера мы не можем осознать что уже пишем на с++), потому ищем альтернативы. Недолгие поиски приводят нас к BASCOM-AVR (тут неплохо про него рассказано), ставим, пишем код:

Результат намного лучше, к тому же получился идеальный меандр, но… бейсик в 2018м, серьезно? Пожалуй, оставим это в прошлом.

Часть 2 «Ответы»

Кажется, уже пора переставать валять дурака и начинать разбираться (а также вспомнить си и ассемблер). Просто скопируем «полезный» код из статьи, упоминавшейся в начале, в loop().

Здесь, полагаю, нужно пояснение: весь код будет писаться в проекте ардуино, но в среде Atmel Studio 7.0 (там удобный дизассемблер), скрины будут из неё же.

Вот оно! Почти то, что нужно. Только форма не особо на меандр похожа и частота, хоть и уже ближе, но все равно не та. Также попробуем увеличить масштаб и обнаружим разрывы в сигнале каждую миллисекунду.

Связано это со срабатыванием прерываний от таймера, отвечающего за millis(). Так что поступим просто — отключим. Ищем ISR (функция обработчик прерывания). Находим:

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

слишком много операторов, уменьшим до одного присвоения.

Да и переход по loop() занимает много команд, так как это лишняя функция в основном цикле.

Поэтому просто сделаем бесконечный цикл в setup(). Получаем следующее:

61 ns это максимум, соответствующий частоте работы контроллера. А можно ли быстрее? Спойлер — нет. Давайте попробуем понять почему — для этого дизасемблим наш код:

Как видно из скрина, для того чтобы записать в порт 1 или 0 тратится ровно 1 такт, вот только дальше идет переход, который не может быть выполнен меньше чем за один такт (RJMP выполняется за два такта, а, например, JMP, за три). И мы практически у цели — для того, чтобы получился меандр, необходимо увеличить время, когда подан 0, на два такта. Добавим для этого две ассемблерные команды nop, которые ничего не делают, но занимают 1 такт:

Часть 3 «Выводы»

К сожалению, все что мы делали абсолютно бесполезно с практической точки зрения, потому что мы не можем больше исполнять никакой код. Так же в 99,9% случаев частот переключения портов вполне хватает для любых целей. Да и если нам очень нужно генерировать ровный меандр, можно взять stm32 с dma или внешнюю микросхему таймера вроде NE555. Данная статья полезна для понимания устройства работы mega328p и arduino в целом.

Тем не менее запись в регистры 8ми битных значений PORTB = 0b11111111; намного быстрее чем digitalWrite(13, 1); но за это придется заплатить невозможностью переноса кода на другие платы, потому что названия регистров могут отличатся.

Остался лишь один вопрос: почему использование более быстрых камней не дало результатов? Ответ очень прост — в сложных системах частота gpio ниже чем частота ядра. А вот насколько ниже и как её выставить всегда можно посмотреть в даташите на конкретный контроллер.

Источник

Arduino ide долго компилирует скетч

Мяяяяяу коты.
Понадобилось прошить ардуино Mega2560. ОС Windows8 64x. Скачал IDE 1.6.5 (пробовал 1.6.4, 1.6.3), распаковал, запустил. Подключил ардуино через USB, все установилось, появился COM5.
В функции Setup прописываю Serial.begin(9600); Жму компилировать, он что то долго там варит и выдает ошибку компиляции без каких либо кодов. Пробовал разные пляски с бубном. Всякие режимы совместимости, ни фига.
Попробовал на другом компе (ОС Windows7 64x) все компилируется без проблем.
Пробовал гуглить, но такой проблемы чтобы IDE не компилоровала не нашел, в основном у всех проблемы с драйверами, загрузчиком и прочее.

Помогите пожалуйста подружить arduino IDE с Windows8.

Реклама
Morroc
Друг Кота

Карма: 49
Рейтинг сообщений: 437
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 14892
Рейтинг сообщения: 0

_________________
«Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !» / Джордж Оруэлл /
«Война — это,когда за интересы других,гибнут совершенно безвинные люди.» / Уинстон Черчилль /

Gisteresis
Друг Кота

Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26
Сообщений: 4732
Откуда: Санкт-Петербург
Рейтинг сообщения: 0

Вот все, что выдал

Уровень выдачи ошибок и предупреждений: Все.

Реклама

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Gisteresis
Друг Кота

Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26
Сообщений: 4732
Откуда: Санкт-Петербург
Рейтинг сообщения: 0

Реклама

Приглашаем 13 октября всех желающих присоединиться к вебинару, который будет проводить компания КОМПЭЛ совместно с представителями бренда MEAN WELL. Вебинар будет посвящен новинкам продукции, планам MEAN WELL на следующий год, аналогам продукции ушедших из РФ брендов, особенностям работы в текущих условиях, возможностях субдистрибьюции и другим вопросам. Мероприятие пройдет в формате живого диалога.

Страница 1 из 1 [ Сообщений: 4 ]

Часовой пояс: UTC + 3 часа

Кто сейчас на форуме

Сейчас этот форум просматривают: azhel12, uuu000 и гости: 17

Источник

Adblock
detector