Pull to refresh

Comments 75

Чем мерялись и рисовались такие красивые осциллограммы?
Цифровым осциллографом, вестимо. У Di Halt какой-то Rigol есть, в его статьях на easyelectronics скриншоты похожие.
Ага. Я про него напишу на днях
Строчка:
$crystal = 16000000
влияет еще и на правильность установки скорости UART.
Точно, забыл. Там еще можно прикинуть процент ошибок в зависимости от частоты кристалла и скорости уарта:
Это не процент ошибок — это просто несовпадение частоты от идеальной. UART небольшие ошибки (порядка процента) переживает без ошибок в передаваемых данных.
Где ты этот топик откопал?))
Я твой бложик читал в ЖЖ, там были ссылки на посты :-)
Подозреваю, что если в Arduino IDE написать код, работающий с портами напрямую, то получится ничуть не хуже по частоте.
Это как? Со вставками на асме?
Нет, это без digitalWrite, которая выполняет поиск номера порта по таблице и проверяет границы массива.

PORTB ^= 1<<5;
Ага, 1351 байт, 500килогерц.
Я думаю, что это сравнение некорректно.
553 байта против 1351 это много или мало?
Эти лишние жирные байты от arduino берутся из-за того, что она всегда инициализирует UART'ы и таймеры. При тех флагах компиляции, что там установлены, код, который не используется в программе, в нее не попадет.Это значит, что разница не в 2.4 раза, а на 798 байт. Причем BASCOM выигрывает за счет того, что ваш проект не использует таймеры и uart.
1,6МГц VS 500килогерц.
Я дуумаю, что дело в том, что вы испольузете хитрую команду «сменить значение регистра», которую можно оптимально написать используя команды SBIS, SBIC, CBI и SBI. В BASCOM примитив toggle есть и он оптимизирован. В языке C его нет. И не всегда компилятор может догодаться, что надо использовать хитрые команды. Насколько я знаю, PORTB |= 1<<5; в SBI gcc превращать умеет. Т.е. если бы вы использовали только установку в высокий и низкий уровень, то производительность была бы одна и та же. А более редкий случай «переключить пин» действительно не оптимизирован.
Ну, говорить про разницу ВСЕГДА в 798 байт тоже некорректно, может код действительно более оптимален. Надо собрать два идентичных проекта с уартом, экраном и проверить.

Ладно, записал как
Do
  Portb.5 = 1
  Portb.5 = 0
Loop

Те же 553 байта, но частота возросла до 2,3мегагерц, гг.


Много бы сказали дизасмы обеих вариантов прошивки.
Ага. Возьметесь? Я не настолько знаю асм, чтоб что-то понять.
Можно попробовать ради лулзов.
BASCOM:
1.hex
Do
 Portb = 0
 Portb = 255
Loop


2.hex
Do
Toggle Portb.5
Loop


Arduino:
3.hex
void loop() {
digitalWrite(13, HIGH);
digitalWrite(13, LOW); 
}


4.hex
void loop() {
PORTB ^= 1<<5;
}


5.hex
void loop() {
PORTB=1;
PORTB=255;
}


6.hex
void loop() {
  while(1){
PORTB=1;
PORTB=255;
}
}


C:
7.hex
while (1)
{
PORTB.5=1;
PORTB.5=0;
};
}


Архив

Забавно получается, С (номер 7) я недооценивал, культурненько выглядит, а вот насчет бейсика я почему то и не сомневался, что он почти асм, только читабельнее :)
Предварительно: баском (1 и 2) — приятный глазу ассемблер, С (7) аналогично. Лишнего ничего нет, если прерывания не используются — в коде относительно их тишына. Огласите, пожалуйста, сишный компилятор.
С ардуиновскими (3-6) не все так просто. Во всех программах обработка переполнения таймера0, хотя он не используется. Структура кода — куча подпрограмм, иногда рвущихся на куски (несколько инструкций, джамп в другое место, еще пара инструкций, возврат обратно). Я называю такое «Lite C» подобным кодом, т.к. впервые столкнулся с таким ужасом кодом в прошивке под pic18 и в ней была сигнатура Lite C :)
Однако можно написать отдельный пост на эту тему, или останемся в комментариях, как вы думаете?
Конечно стоит, очень интересно.
Ну, говорить про разницу ВСЕГДА в 798 байт тоже некорректно, может код действительно более оптимален. Надо собрать два идентичных проекта с уартом, экраном и проверить.

А я и не говорил, что она всгде бвдет такой. Сделать две одинаковых программы не получится. Слишком много надо учесть, чтобы функционал действительно оакзался одинаковым. В таких случаях пропускают сгенерированный код через дизассемблер и смотрят на код, сгенерированный для интересующего участка.
И еще очень большой вопрос, что вы называете оптимальным кодом? digitalWrite из wiring не оптимален т.к. он работает очень медленно? Зато он проверяет не включен ли PWM и т.п. Он прощает ошибки новичков. В этом смысле он оптимален. Поэтому при любом сравнении сначала надо ввести критерии сравнения.
Те же 553 байта, но частота возросла до 2,3мегагерц, гг.

Ну и что? Почему когда вы тестируете C программу, вы внутрь цикла включаете вызов функции, а для BASCON не включаете? Чтобы получить одинаковый код вместо вот этого:
void loop() {
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}

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

А можно вставку на асме еще. Дело не в том, что где-то нельзя получить оптимальный код, это наверняка возможно. Только вот обычный человек не будет этого делать, он прочитает руководство и напишет digitalWrite, который медленнее. Один, второй, третий, четвертый. А потом — «Вот тормоз ваш avr»
Вы самую главную мысль пропустили: вы не ввели критерий оптимальности. Проведу аналогию. Вы взяли две машины: ниву и болид формулы 1. После этого сравнили, какая из них быстрее доедет до вашей дачи. Естествено нива быстрее, а кроме того она вместительнее и намного дешевле. Нива лучше болида формулы один.

Не надо сравнивать digitalWrite и Portb.5 = 0. Это разные операции и они делают разные вещи. И тем более не надо оправдывать сравнение некомпетентностью «обычных людей».
Хорошо.
PORTB=1;
PORTB=255;

Частота — 1мегагерц. Все равно два раза медленнее.
void loop() {
  while(1){
PORTB=1;
PORTB=255;
}
}

Частота 4мгц. 4 такта на переключение.
Проверил на железе — действительно 4 МГц:



Код:
void setup() {                
  pinMode(0, OUTPUT);     
}

void loop() {
  while(1) {
    PORTD=0;
    PORTD=255;
  }
}
Что-то заполнение не 50%.
А можно теперь растолковать, о чём вы тут вообще все говорили? :)

А если ещё кто-нибудь расскажет или хотя бы ссылку даст на разьяснение конструкции «PORTB |= 1<<5», я буду очень признателен.
О том, что arduino ide генерирует не самый оптимальный код, а при использовании digital write — вообще с большими задержками.
То есть в ходе разбирательств так и оказалось?
Ага, это в начале было понятно, по частоте. Потом разбирались, почему это так.
Вот тут с дизасмом: habrahabr.ru/post/151587/
По конструкции можно не рассказывать, уже нашёл.
Заполнение — это термин, относящийся к ШИМ. Имеется ввиду, что у меандра (сигнал прямоугольной формы) на скриншоте ширина импульсов не совпадает с шириной промежутков между ними.

PORTB |= 1<<5 — установить шестой бит в PORTB
1 << 5 — это сдвиг единицы влево (в сторону старших битов)
|= — присваивание с побитовым ИЛИ

Читается так:
PORTB = PORTB | (1 << 5)
Естественно оно не 50%. Оно же разворачивается в
установить низкий сигнал // 1 такт
установить высокий сигнал // 1 такт
безусловный переход на первую команду // 2 такта

Поэтому высокий сигнал держится три такта, а низкий всего 1. Это самый быстрый вариант и, так как код очень прост, любой компилятор (в том числе и bascom) должен давать именно его.

Если очень хочется выжать еще скорости, можно развернуть цикл и ассимптотически стремитсья к 8Мгц. Возможно с некоторыми флагами gcc аже это сделает сам. Только не понятно зачем. Ну и иногда будет чуть более длинный период из-за jmp. Кроме того, на arduino еще иногда будет отрабатывать прерывание таймера.
Иллюстрация:


Код состоит из повторений:
void loop() {
  while(1){
PORTB=1;
PORTB=255;
PORTB=1;
PORTB=255;

...

PORTB=1;
PORTB=255;
PORTB=1;
PORTB=255;
}
}


Частота приближается к 8мгц. В гифе как раз виден на одном из кадров длинный период.
Заполнение не 50%, т.к. джамп (while(1))больше тактов занимает, чем запись данных, nop-ов там не хватает :)
Да, забыл что запись 1 такт занимает. После того, как посмотрел на листинги асма, вспомнил.
Помимо вставок на asm, баском умеет работать с регистрами напрямую. Поэтому если что-то не получается сконфигурировать, всегда можно открыть даташит на камень и подсмотреть.
Жаль немного синтаксис мозговыносящий, но если привыкнуть к нему… будет хорошей заменой!
Зачем?
Весь понт ардуино в библиотеках и исходниках.
Не нравится IDE? Возьмите библиотеки и вообще без проблем портируйте их в любую удобную среду разработки: ICC, AVRStudio, CodeVision, IAR, Eclipse — да что угодно. После этого залейте hex с помощью простой утилитки — Arduino Hex Uploader and Programmer
Я вот не люблю переключаться между приложениями лишний раз, поэтому написал себе свою утилку, в итоге из CodeBlocks прошивка выполняется в 1 нажатие клавиши.Можно встроить и в другие среды.
Годится и не только для Arduino.
А какие библиотеки вам нужны? Программный уарт, работа с HD44780, SPI, I2C, 1-wire, даже работа с картами памяти — есть в стандартной поставке. Много разных модулей вроде работы с экранами от нокии и семисегментниками с динамической индикацией есть на форуме.

А тонна исходников годится только на копипаст.
Вот хоть убей не пойму, в чем смысл-то этого? Переходить на бейсик — ради чего?

Библиотеки эти есть и для С, причем куда больший список — безо всяких ардуинчатых ИДЕ, от которых вы стремитесь убежать, без бейсика — берете AVR-студию, подключаете эти библы, и получаете свой быстрый и высокооптимизированный код.

Чего вам дает этот бейсик, чего не дает стандартная среда с этими библами?
Удобство. Все-в-одном, + понятный синтаксис. Я вообще не программист, мне лень учить С, я хочу мигающую лампочку.
Все в одном — это что именно?
Поставить среду и сразу что нибудь написать не подключая дополнительные библиотеки. Отладить на компе не устанавливая протеус.
Эмулятор — ну ладно, допустим, он тут лучше стандартного (хотя до протеуса ему всяко не дотянуться, так что лучше бы установить).

Но «не устанавливая дополнительные библиотеки»… В нем точно такие же дополнительные библиотеки для работы с периферией, в чем разница? В том, что добрые дяди из MSC сами нажали кнопочку скачать и архивировать, чтобы приложить эти же библы к своему бейсику?
Один клик мышью в самом деле стоит покупки/кряка левой среды, перехода на левый язык?
Да нет конечно, я же не агитирую к переходу с Аврстудио на баском. Я предлагаю альтернативу убогому ардуино IDE, если его рассматривать в этом контексте — это шаг вперед.

А протеус умеет ставить бряки и изменять регистры в процессе отладки? Всмысле один, без студии.
Бряки точно умеет, регистры изменять — не помню, сто лет его не юзал.
Когда есть отладка на железе, все эти эмуляторы как то отходят на второй-третий-десятый план)
Только в младших тиньках нет жтага, пичалька.
Там почти везде debugWire
А его кто-нибудь кроме дракона умеет?
ICE II и ICE III должны уметь.
Регистры не умеет менять, вообще в программу вмешиваться не даст, на то и симулятор.
Неа, я его месяц назад увидел. Дальше копипаста не продвинулся
Пользуясь случаем спрошу: библиотеки 1-wire такие же как у всех — считать ID и температуру, или полный функционал, т.е. можно считать DS1992,DS1993?
Щас ардуинщики налетят и будут хаять за измену :)
Отображение корпуса микросхемы и названия её выводов очень полезная фича. Может как-то можно такое прикрутить к атмел студии?
Блин, шило на мыло Wiring на Basic.
Какая нафиг, отладка, что тут отлаживать, мигание светодиодом, нарисованным?
То что недоразработчикам открывают глаза на реалии микроконтроллера ИМХО хорошо, но человек вкуривший эту тему прекрасно освоится и в AVRstudio, и в чём угодно. И не надо про аццкий си и хадркорный ассемблер, для миганий светодиодами, и мата на жк-дисплейчиках, они не менее просты и понятны.
А что вы сказать-то хотите? Я предложил альтернативу IDE. Я знаю много человек, которые колются, но продолжают жрать кактус — пишут огромные программы без отладки и симуляции, наощупь, и не знаю ничего, кроме этого редактора-огрызка.
Это для тех кто этим зарабатывает важен инструмент, а для тех, у кого это хобби или небольшие проекты для себя — важно только удобство.
Альтернатива — это хорошо. Сама Arduino IDE ужасна. Да и wiring весьма странная штука, которая начинает мешаться, если нужно сделать что-то сложное. Но wiring — это просто библиотека для C/C++. Когда «ардуинщик» вырастает из предложенных библиотек, он может отказываться от wiring постепенно, переписывая проблемные места.
В случае же, когда предлагают альтернативу в виде адаптированного бейсика, то чтобы убедить в её удобстве нужно что-то большее, чем «лампочками можно мигать в 10 раз быстрее».
Там от бейсика пара команд и общий стиль написания, какая адаптация.
Не всем надо вырастать, к тому же.
А вы дискламер читали для BascomAVR?
Никто не говорит, что это среда профессионалов. Когда в 2004 г. столкнулся с этим софтом, то в описании читал, что разработка специально для школы и тп. Т.е., для ознакомления, первоначальных навыков, но никак не для повседневной работы.
Это что-то типа тренажера.
В статье мне предлагают среду с basic подобным языком, позволяющую дергать пины быстрее, чем wiring. Это не достаточно мотивирует, чтобы пойти читать disclaimer.
В такой интерпритации, я с вами согласен. Мое отношение к этой среде — тренажер для школы/младших курсов универа.
А wiring для супер-профи?
Не знаю, не знаком с этой технологией. С 2004 года пользую для своих (just for fun) целей только AVR Studio. Зачем упрощать то, что и так максимально просто и гибко?
Ох, давайте я хоть тут развернуто отвечу. Это я не конкретно вам, а вообще всем, кто спрашивал о смысле программирования в баскоме.
Посмотрите, пожалуйста, на заголовок. Я предлагаю альтернативу Arduino IDE, а меня, блин, пытаются убедить что чистый си или асм круче, типа все равно разбираться, какая разница в чем. Для меня есть разница. Я этим не зарабатываю на жизнь(хоть когда-то и хотел работать только с этим, но потом стало скучно заниматься чем то одним), и для своих проектов я выбираю то, что удобнее. Вот просто для меня.

Я знаю на минимальном уровне и си, и асм, на уровне «чуть чуть поправить константы и логику в готовой программе», а изучать я хочу то, что проще, пусть оно и генерирует неоптимальный код, и вообще не труЪ, бейсик какой-то.
Я не программист, я железячник, и в программировании даже не достигну того уровня, за которым возможности этой среды начнут меня ограничивать. Да и честно говоря(для вас же это не новость, правда?) выбор языка и среды — это далеко не самое главное в программировании, а так, где-то в конце плетется. Или вы считаете, что на асме нет ужасного кода по определению?
Мне нравится среда, я написал о ней статью, в которой просто показываю возможности, я не хожу по всем топикам, посвященным микроконтроллерам и не доказываю всем, что баском — рулез, и надо выкинуть все ваши среды. ЕМНИП, я вообще не оставил ни единого комментария про него до этого топика, хотя участвовал в куче срачей про мк.
Вы считаете что AVR Studio максимально проста и понятна? Так напишите про это, может быть я(и еще кто-нибудь) и изменят свое мнения. Я написал. А вы?
Вот этот текст и в начало статьи бы. Чтобы сразу была видна цель обзора и количество вопросов было бы намного меньше.
Если бы это были вопросы… Я думал что количество людей, читающих заголовок чуток больше.
Простите, если вас задели мои слова. Писал только свое личное мнение, без претензии к статье. Можете так же прочитать мой комментарий ниже. Мне было интересно узнать, как развилась эта среда за почти 10 лет с момента моего практического столкновения с ней в далеком 2004 г. И спасибо вам за это.
Все остальное — это всего лишь моя точка зрения, основанная лишь на том, что когда-то пошел другим путем, показавшимся мне, в то время, более понятным для меня лично. И все.
Для каждой задачи есть свои инструменты, и благодаря вам об одном из таких простых инструментов узнала широкая публика, за что вам и большое спасибо!
Знакомился с этой IDE в далеком 2004-м. Порадовали приятные изменения.
Sign up to leave a comment.

Articles