Почему не Arduino (На примере Energia для TI MSP430)



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

Внимание! Не смотря на то, что в заголовке речь идет про Arduino, все таки ниже написанное относится к среде Energia для TI MSP430, что с одной стороны заставляет помнить об отличиях архитектур, а с другой идеи заложенные в Arduino используются и в среде Energia (при старте так и написано Wiring/Arduino IDE for MSP430), что позволяет с некоторыми допусками делать выводы о платформе в целом. Также следует участь, что в реальности от описываемых событий прошло уже 1.5-2 года, так что просьба простить за некоторые неточности, кое-что уже забылось, да сам проект Arduino/Energia не стоит на месте и потихоньку совершенствуется.

Два брата близнеца

Предисловие

Электроникой я увлекся давно, в году 2007 ну и юзал себе AVR через AVRStudio. Но, если кто помнит, то несколько лет назад TI разродилась акцией — отладки MSP430G25XX c 2 МК и отладчиком /программатором всего за 5 баксов. Федексом, до дверей :-). Кто ж против такого устоит :-). Да и новую платформу пощупать было интересно. Вот, только с софтом ихним у меня не сложилось, сыроват он был что ли. Вообщем он успешно отбился глюками от моего кавалерийского наскока, а еще Eclipse, да… Я тогда с ним первый раз познакомился. Все это, включая конские цены на МК в местных лобазах заметно поубавили энтузиазм.
Хотя в целом, архитектура и доки для данного МК мне очень понравились, а потому мысль, что он будет валяться бесхозным меня не устраивала. Короче, из всего доступного для данного МК софта, оставалась не тронутой только Ардуиноподная среда Energia.
Поставил, помигал светодиодиком – работает. А потому, на данном МК решено было немедленно собрать какой-нибудь простой проект. Хорошим кандидатом для данного проекта оказалась домашняя метеостанция (ну не часы же :-)). Для чего из закромов были извлечены SHT21(датчик влажности/температуры),BMP085(датчик давления), DS18B20 в качестве выносного датчика температуры. Ну и выводить все это предполагалось на экран HD44780. Все просто, никаких изысков и даже кнопок, просто читаем и выводим. А ну еще питание от батареек.

Короче на основе первых впечатлений, и гугла, подсказывающего, что в среде Ардуинщиков выше названная троица датчиков не пустой звук, я сделал смелое предположение что написание кода займет 2-3 дня. Ну что же, поехали.

Первые впечатления

Итак, помигав светодиодом, я начал более плотное знакомство с IDE тренируясь с выводом данных на экран. Да она действительно простая, прям как блокнот, только с подсветкой синтаксиса. Но где же автодополнение кода, дерево проекта, настройки оптимизации ведь это все полезные фичи? Хотя тут же вспомнил, что это же для новичков, да и без автодополнения как то раньше жил. И принялся дальше разбираться, так что не заметил что в тестовом коде допустил опечатку, ну что то вроде ldcwrite, вместо lcdwrite.
Код, конечно, не скомпилировался и IDE выдала ошибку. Я по привычке на нее кликнул, что бы перейти к месту ошибки. И…, ничего. То есть сообщение об ошибке есть, а как узнать где она нельзя, ни тебе номера строки с ошибкой (как в Basic еще бородатых версий), ни подсветки места ошибки (справливости ради в «родной» версии Arduino IDE подная урезанная функция есть).
Конечно, когда кода 20 строк, найти ошибку и визуально не проблема. А если его куда больше, или ошибка где то в библиотеке, да не одна. Лично я не вижу тут никакого упрощения для новичка.
Ну да ладно у меня то код, точнее скетч будет не большой переживу.

Знание архитектуры не требуется

Еще одним плюсом Ардуино есть отсутствие необходимости лезть в регистры. Отчасти это тоже было для меня мотивацией обратится к IDE Energia, и бросить мучить программы от TI. Да и зачем разбираться в регистрах, если на MSP430 я вряд ли перейду ввиду их розничной цены.
Следующим пунктом программы был датчик SHT21. Соответствующая библиотека довольно быстро нагуглилась и я собрал тестовый проект. Ура, все скомпилилось без ошибок, я быстренько нажал кнопку Upload. Программа запустилась, но на экране дисплея пусто :-(. И что тут должен делать новичок?
Я, конечно, не расстроился и начал лепить, то там, то тут, сначала в своем коде, потом в библиотеке Serial.Write. И убив весь вечер таки понял, что у меня не работает модуль I2C. Пришлось лезть в гугль, и таки через некоторое время ответ нашелся на профильном форуме forum.43oh.com. Причем проблема оказалась, не столь сложной, сколь недружелюбной к новичку. Короче, в «встроенной» библиотеке twi была не правильно прописана конфигурация модуля USI контроллера, а решение так вообще порадовало. Открыть библиотечный файл, найти сроки (например 203-207, ну то есть вручную посчитаете, ведь в IDE нет нумерации строк), и заменить в них следующий код*:

    UCB0CTL1 = UCSWRST;                      // Enable SW reset
    UCB0CTL1 |= UCSSEL_2;                    // SMCLK
    UCB0CTL0 |= (UCMST | UCMODE_3 | UCSYNC); // I2C Master, synchronous mode
    UCB0CTL1 |= UCTR;                        // Configure in transmit mode
    UCB0I2CSA = address;                     // Set Slave Address
    UCB0CTL1 &= ~UCSWRST;                    // Clear SW reset, resume operation
    UCB0I2CIE |= (UCALIE|UCNACKIE|UCSTPIE);  // Enable I2C interrupts
    UC0IE |= UCB0TXIE;                     // Enable I2C interrupts

Вот так, вот не успел я сделать шаг влево, от папки Example как опять вернулся к регистрам. Да, может в AVR Arduino ситуация лучше, да и саму эту ошибку исправили в новых версиях. Но, меня не покидаем мысль: «А что бы я (новичок) делал, если бы на форуме не нашлось гуру?». Ну и другая: “А вот если бы у меня был Avr Симулятор…”.
Нет, действительно, digital write спасет новичка, от вывода мусора на целый порт, но никак не ограничит его от ошибки в программе (например, не тот PIN в функции указал) в результате которой сгорит, например, Н мост. А так хоть симулятором по выводу предварительно пройтись можно. Ниже на картинке, для примера, можно убедится что PORTB2 действительно перейдет в 1 на отмеченной строке кода:


Отладка

После того как проблемы SHT21 были побеждены, настало время BMP085. Тут все обещало быть еще проще, I2C работает, сама либа BMP085, в отличии от предыдущей имеет #define Debug, и облеплена тестовым выводом в UART. Однако и тут я умудрился застопорится. Все вроде работает, но на выходе какая то ерунда, а не нужное значение. Тут уж я оказался виноват, при копировании кода не правильно вписал константу в формулу. Ну что ж бывает. Но, опять я вылавливал проблему «туплением» в код, а ведь в плату LaunchPad встроен отладчик, который позволяет ставить BreakPoint (точки останова), и посмотреть значение переменных, что называется в реальной работе. Опять же, на картинке ниже, можно увидеть «прямо в чипе», что переменная с действительно принимает правильное значение:

Неужели концепция debugger так сложна для новичка, что ее не захотели встроить в IDE? Ну ладно с AVR исторически с этим была проблема. А тут…

Понимание

Таким образом, пробиваясь через преграды, я наконец то добрался до датчика DS18B20. Не на что уже не надеясь, я загрузил тестовый код. Ура все заработало как надо… пока я не засунул датчик в морозиловку холодильника. Чудесным образом датчик отказывался работать при -14 градусов. Искал проблему долго, и датчик менял, и в код тупил. Пока наконец не прицепил к датчику простенький логический анализатор от Saleae. Ситуация тут же прояснилась, тайминги 1-wire жили своей жизнью от посылки к посылке. А потому пришлось пристальнее глянуть на код.
Проблема оказалось в том, что автор либы сделал задержки вот так:

time1=micros();
while (micros()-time1 < 500){};

Кто не знает, функция micros() показывает время в микросекундах сначала старта системы. То есть код предельно ясен. Берем текущее значение и грузим в time1. И дальше ждем пока разница между micros() и time1 не станет больше 500. Все правильно, если вы программист компьютера, то ваше обращение к системному таймеру логично. Но давайте глянем на код этой функции:


unsigned long micros()
{
    return (1000 * wdtCounter) / WDT_TICKS_PER_MILISECOND;
}


Программисту МК не надо даже разбираться, что это за переменная wdtCounter, и константа WDT_TICKS_PER_MILISECOND. Что бы в голове прикинуть, что при 16МГц тактовой частоты у нас на 1us, всего-навсего 16 тактов, и что бы добиться микросекундой точности, строка выше должна за это время выполнятся. Но тут умножение, и деление (которое не аппаратное) :'(.
Реальность еще печальнее, так как wdtCounter обновляется раз в 500 мк секунд. Теперь все стало на места, конечный автомат датчика при низких температурах также начинал работать чуть хуже, и уже не справлялся с таким ужасными таймингами. Конечно, код выше прекрасно работал для 70МГц платы Stellaris (тоже отладка TI), но не понимание программистом поведения МК привело, вот к такой проблеме.
Короче заменил на библиотечную же delayMicroseconds(), которая суть ассемблерные вставки пустых циклов.
Интересно а у него, оно работало при минусовых температурах...

Гибкость

В процессе написания этого скетча, я таки созрел до того что, неплохо бы не только на экранчик выводить инфу, но и куда-то пересылать или хранить. Но, тут меня ожидал облом, мой скетч на 20-30 строк уже занимал в памяти 10К из 16, и попытка добавить еще какую-то функциональность тут же раздувала прошивку за 16 килобайт. Тут бы вспомнить про настройки оптимизации, линковщика, компилятора и т.д., но к стыду своему работу с make файлом я так и не освоил, а все советы с интернета по правке файлов настроек IDE, тоже не сработали. Тем же завершилась попытка сменить частоту на более низкую, дабы уменьшить потребление энергии. Но увы, код не компилировался, а ошибки вели куда-то в глубины стандартных библиотек, и от этого пришлось отказаться.

Возможности

Вам уже наверное надоело читать эти много букав? А представьте, как мне было, когда я понял что добрался до этого места спустя неделю отладки кода. Прогресс прямо скажем не очень.
Но ладно, код написан и работает, вроде все? Ан нет, я ж забыл про батарейное питание. Негоже вот так вот миллиампер часами раскидываться. Ничего, подумал я сейчас допишу какой ни будь sleep_ms() и дело в шляпе. Или нет? Нет такой функции** ни в Energia, ни в Arduino. Вот как так, а как же классная брошюра от TI про 6 режимов сна на данном контроллере, и вообще позиционирование его как low energy. Опять за советами пришлось лезть на форум, которые снова советовали магические вставки в библиотеки, так что пришлось в них зарыться. Давайте обратим внимание на функцию delay:


/* (ab)use the WDT */
void delay(uint32_t milliseconds)
{
	uint32_t wakeTime = wdtCounter + (milliseconds * WDT_TICKS_PER_MILISECOND);
        while(wdtCounter < wakeTime)
                /* Wait for WDT interrupt in LMP0 */
                __bis_status_register(LPM0_bits+GIE);
}

В частности на последнюю строчку. Вот за это не могу не похвалить разработчиков. Вместо того что бы долбить новичкам, что delay это плохо – используйте режимы сна. Они просто взяли и встроили режим сна в функцию delay. Так что, вызывая ее, вы фактически переводите МК в сон.
Правда режим выбран самый простой, чтобы остальные функции других библиотек работали, и экономии потребления почти не дает. Пришлось написать свою функцию для более глубоко режима сна:

void delay_m()// сон порядка 30 сек
{
  
                /* Wait for WDT interrupt in LMP3 */
                 BCSCTL1 |= DIVA_2;
                 WDTCTL = WDT_ADLY_1000;
                __bis_status_register(LPM3_bits+GIE);
                enableWatchDog();
}


Выводы:
Начну, пожалуй, с плюсов. Не смотря ни на что, некий HAL-подход и библиотеки устройств мне понравились. Так как он больше структурирует программу и разделяет ее на уровни абстракции. Особенно понравился финт с delay. Однозначно такой подход будет развиваться и расширять свою нишу.
Но, теперь минусы. Честно говоря, никакого упрощения входа в программирование контроллеров я не заметил. Современные IDE тоже user friendly, а их quickstart (коих полно в интернете) не больше этой статьи, и при этом они дают такие удобные функции как debugger или симулятор. Так зачем себя ограничивать блокнотом? А еще у меня сложилось впечатление, что библиотеки (особенно стандартные) писаны с применением «взрослых IDE», что как бы намекает…
Более того потратил я времени на написание программы не меньше, чем я бы делал это в профессиональной среде. Опять же зачем откладывать, если к ней все равно рано или поздно придется обратится.
Да, несколько упрощенный подход функций типа digitalwrite(), дает быстрый результат, но если нужно сделать что то посложнее, вам таки придется заглянуть в даташит, и разобраться с регистрами как получилось у меня выше.
Вообщем, пожелание к разработчикаv arduino только одно. Раз аудитории уже не 1 год, то пора бы ей дать нормальные инструменты. Ведь arduino пишется на С++, что позволяет перегружать функции и конструкторы, то почему бы их не сделать 2 уровней, для совсем новичков и опытных.
А то получается, что кусок важного функционала МК может быть просто «зарезан» как с функциями сна выше.

Прекрасный пример, кстати, в этом плане кодогенератор Grace от TI: вы можете наклацать настройки графически из ограниченного набора функций (basic user), либо графически но с тонкой настройкой (power user), а то и вовсе по харкору править регистры.

В качестве эпилога

Использую ли я ардуино? Да, вот пришла серва с алиекспресс, разбираться некогда, а отзыв поставить надо. Взял ардуино запустил скетч – работает. Но вот что то более серьезное я на ней вряд ли снова буду делать.

*Само решение сейчас я уже не нашел, так что код для примера.
** Сейчас такая функция уже появилась.

Комментарии (79)

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

Например, нужна была библиотека для работы с Modbus, взял первую из гугла. Весь код запихан в хедер — уже хорошо… Обработка ошибок невнятная, понять что произошла ошибка можно только вызывая getErrCnt и сравнивая с запомненным значением. Код ошибки то записывается в lastError, то возвращается как результат выполнения функции и т.п., короче узнать какая была ошибка почти нереально. Вот здесь, например, при получении пакетов выбрасывает без обработки всё что короче 7 байт, при этом само отправляет, скажем, пакеты эксепшенов длиной в 5 байт. И т.д. И, похоже, что таких библиотек для ардуйни — примерно каждая первая.

«IDE» в кавычках. Если, например, создаёшь вкладок, больше чем влезает в ширину окна — они тупо обрезаются без намёков на прокрутку. При нажатии кнопки Tab вместо символа табуляции вставляется рандомное число пробелов. Куча мелких косяков. При каждом запуске долбится в инет, и пока не получит ответа от сервера поганой метлой от фаервола, не запускается. Да и вообще, поскольку «IDE» наговнокожена на жабьем языке — тормозит и очень часто крэшится, выжрав память (жабий язык не умеет возвращать память системе, поэтому при запуске жабоговнопроги у системы статически отжирается кусок в N мегабайт памяти под «хип», кроме того в жабе также нету функции free, и хвалёный гц — не более чем бутафория, потому засрав эти N метров прога неминуемо крэшится).

Идущий в комплекте gcc. Не знаю, то ли сам по себе гцц в режиме С++ такой, то ли авторы ардуйни что-то намудрили, но и оно периодически отказывается компилировать, либо крэшится. Если отказывается компилировать — вываливает кучу мессаг, не несущих никакого смысла. Обычно помгает переключение между разными версиями ld.exe. Так или иначе, с нормальным avr-gcc в режиме Си подобные проблемы отсутствуют.

Тащемта, с чем я не спорю, те кто хвалит ардуйню — заслуживают всего этого. Проблема лишь в том, что им пофигу — всё равно ни на что кроме мигания диодом и запуска стандартного говна из примеров они не способны. И ещё смешно, когда ардуйнисты упоминают в пользу ардуйни «проверенные библиотеки» Проверенные кем? кучкой ламеров-дебилов, т.н. «сообществом ардуйни»? В то время, как вне собщества ардуйни популярные библиотеки действительно проверяются профессионалами и применяются в настоящих проектах.
+6
О, я думал что это мне так свезло глюков собрать. Кстати, ингода в сети проскакивают довольно сложные проекты на ней ( типа куча графики ). Меня вот мучают смутный сомнения как оно влазит в туже мегу и вообще компилируется.
0
компилятор постоянно крэшится или отказывается компилировать корректный код
Это GCC-то? Не замечал за ним такого.
И, похоже, что таких библиотек для ардуйни — примерно каждая первая.
А вот когда я ковырял первую попавшуюся библиотеку — она мне очень понравилась. Правда, это была библиотека из стандартной поставки. Среди сторонних шлака должно хватать (хотя это верно для любого языка, и чем ниже порог вхождения, тем больше шлака в user-generated content).
В то время, как вне собщества ардуйни популярные библиотеки действительно проверяются профессионалами и применяются в настоящих проектах.
Ключевое слово «популярные». Базовые библиотеки ардуино тоже довольно неплохо вылизаны.

Про IDE — все так, разве что не замечал за ней, чтобы оно крешилось. Но она даже самим ардуинщикам не нравится, некоторые свои пишут.
+1
мигания диодом
Света? Диодом? Для мигания диодом мощности маловато. :)
«проверенные библиотеки»

Это вообще цирк. Оно работает в одном потоке, но пока работает ОНО, не работает больше ничего. Прерывания, FreeRTOS? Не, не слышали!
0
Не обязательно гонять какую либо ртось чтоб жалкое подобие потоков замутить=)) главное желание
0
на гиктаймся есть серия статей про некий arduino mega server. там в районе нг была статья, в которой описан простенький, но весьма критичный баг одной из библиотек (не разбираюсь в их названиях, что то для ethernet вроде).
0
наврал слегка. вот статья про ethernet geektimes.ru/post/259898/
но тут тоже интересно geektimes.ru/post/268522/
0
Весь код запихан в хедер — уже хорошо…
Так это ж описание класса в плюсах — обычное дело.
0
Нет, там ведь в хедере не только декларация класса а и вся реализация. Насколько я знаю, пихать все в хедер — обычна практика для Ардуино, сделано это для упрощения (убиваем раздельную компиляцию, зато для целевой аудитории так проще: для подключения зависимостей достаточно подключить хедер).
0
Ардуино же все равно не поддерживает более одного файла в проекте (не считая библиотек), так что без разницы. А по скорости компиляции даже выигрыш может быть — не надо по десять раз одни и те же системные инклюды компилировать.
+1
Да я вообще сомневаюсь, что на данной платформе кто-то создает действительно большие проекты, для которых есть смысл заморачиваться с оптимизацией времени компиляции. В этом смысле отказ от раздельной компиляции (и связанных с этим вещей) в пользу упрощения выглядит вполне логичным.
0
Ну, как раз компилирует ардуино убийственно долго, особенно первая сборка за сессию. Я, правда, дельфями избалован)
0
Ну не знаю, я особо не замечал тормозов (правда я с Ардуино пересекался достаточно редко, а по работе привык к тому, что проект может собираться долго)
Я, правда, дельфями избалован

Я с делфями не работал, но вот (ИМХО) Borland C++ Builder (пятый и шестой) был очень тормознутый в плане компиляции (хоть он и умел в «precompiled header» но сильно уступал MSVC)
0
У дельфи ситуация примерно описывается «если при полном ребилде проекта вы успеваете заметить окошко компилятора — у вас действительно большой проект!». Одиночный юнит компилится с такой скоростью, что можно жать «скомпилировать» для перехода к следующей ошибке синтаксиса…
+1
какой версией балуетесь?
0
Седьмой. Тыкался и с другими, но эта любимая.
0
в том то и беда что ппц какие навороченные проекты иногда встречаются >_<
\
0
Спорное утверждение. Можно распилить скетч на несколько файлов. Там главное, чтобы основной скетч имел имя каталога и расширение ino, остальные файлы .cpp, их может быть несколько. Скриншот прилагаю:
Множество файлов в одном проекте
0
Вот как. Не знал. А чего тогда сами ардуинщики, которые пилят свои среды, в первую очередь указывают на избавление от «однофайловых скетчей»?
0
Там есть такой гемор с тем, что среда перед компиляцией «собирает» (формирует) временный .cpp файл, который формирует особым образом (пример ниже) и его компилирует. В крайней версии (v1.6.7) я посмотрел, там каждый файл компилируется раздельно (т.е. есть cpp1_file.o, cpp2_file.o, tester_many_files.ino.cpp.o).
Однако «главный» файл для компиляции формируют из главного скетча:

#include "hpp1_file.hpp"
#include "hpp2_file.hpp"

void setup() {
  Serial.begin(57600);
}

void loop() {
  LED_ON();
  delay(1000);
  LED_OFF();
  delay(1000);
}

вот такую бяку получают:

#include <Arduino.h>
#line 1
#line 1 "D:\\Devel\\ARDUINO\\tester_many_files\\tester_many_files.ino"
#include "hpp1_file.hpp"
#include "hpp2_file.hpp"

#line 4 "D:\\Devel\\ARDUINO\\tester_many_files\\tester_many_files.ino"
void setup();
#line 8 "D:\\Devel\\ARDUINO\\tester_many_files\\tester_many_files.ino"
void loop();
#line 4
void setup() {
  Serial.begin(57600);
}

void loop() {
  LED_ON();
  delay(1000);
  LED_OFF();
  delay(1000);
}

и полученный файл компилируют, что приводит к разным глюкам (выдает ошибку, которую достаточно сложно новичку выловить. Но те, кто знает, обходят. В этом примере такого глюка нет.).
Если очень интересно, могу попробовать поставить версию 1.0.6, например, собрать этот же пример и посмотреть, что получится, свалит ли она ВСЕ файлы проекта (.ino, .cpp) в один файл перед компиляцией или нет.
Сейчас разработчики среды сделали возможность добавлять ключики для компилятора, линкера и т.п., однако не всё так радужно, потому что я смотрел исходники, там кое где еще есть хардкод, который кладет на эти новые ключи, точнее далеко не все ключи можно использовать.
0
ИМХО, для плюсов вообще это обычная практика. Классы в инклудах, объявление экземпляров и использование — в cpp
0
Да нет, обычно реализацию методов выносят в срр (за редким исключением, как и в С). Обычно код в С++ состоит из классов чуть менее чем полностью. Представьте себе, например, Qt, у котрого вся реализация в хедерах – при компиляции каждый раз пересобиралась бы огромная часть фреймворка.
0
Ну, не таким уж и редким. В хедере реализуют те методы, которые должны инлайниться, обычно короткие, до 3 строк. В основном это геттеры и сеттеры.

У кого-то в гитхабе видел забавный подход к написанию библиотек. Вся библиотека из одного хедера, но инклудить его надо два раза — сперва как хедер, затем (только в одном файле) — как реализацию, предварив соответствующим дефайном.
0
Есть такое, но реализация в хедерах все же исключение а не «обычная практика»

но инклудить его надо два раза — сперва как хедер, затем (только в одном файле) — как реализацию
Это не «забавный», это «очень извращенный» поход, :)

+3
Есть такое, но реализация в хедерах все же исключение а не «обычная практика»
Если это относится к первой части моего коммента, то реализация в хедере коротких методов — как раз обычная практика. Реализация целиком, включая длинные методы — это да, это уже изврат)
Это не «забавный», это «очень извращенный» поход, :)
Что-то вроде того. Автор поклонник «однофайловых библиотек».
0
Если это относится к первой части моего коммента
Нет, я имел ввиду именно «реализацию целиком», в контексте комментария коллеги MrYuran.

то реализация в хедере коротких методов — как раз обычная практика

Тут есть нюансы, не всегда хорошо, когда такие методы инлайнятся. Например, плохо, когда API, который торчит из динамической библиотеки, несет в хедерах какой-то (пусть даже на 3 строки) код, который будет заинлайнен.
0
Экспортировать классы из динамической библиотеки вообще не слишком хорошая идея.
0
Полностью согласен (там помимо озвученного еще куча других проблем, бинарная совместимость у С++ сильно хромает), но что делать сели нужно предоставить именно С++ API?
0
Помимо экспорта классов (некоторые проекты так и делают — например, Audiere, 3dsmax) есть еще как минимум два пути — путь GDI+ (dll экспортирует кучу врапперов, известных как GDI+ Flat API, а импортирующая библиотека вновь оборачивает их в классы) и COM.
Проиллюстрирую вариант GDI+:
DLL:
type
  TFoo = class
  public
    function Bar: Integer;
  end;

function TFoo.Bar: Integer;
begin
  Result := 42;
end;

function TFoo_Create: Pointer;
begin
  Result := TFoo.Create;
end;

procedure TFoo_Free(Self: Pointer);
begin
  TFoo(Self).Free;
end;

function TFoo_Bar(Self: Pointer): Integer;
begin
  Result := TFoo(Self).Bar;
end;

exports TFoo_Create, TFoo_Free, TFoo_Bar;

Импорт:
function TFoo_Create: Pointer; external 'foo.dll';
procedure TFoo_Free(Self: Pointer); external 'foo.dll';
function TFoo_Bar(Self: Pointer): Integer; external 'foo.dll';

type
  TFoo = class
  private
    FSelf: Pointer;
  public
    constructor Create;
    destructor Destroy; override;
    function Foo: Integer;
  end;

constructor TFoo.Create;
begin
  FSelf := TFoo_Create;
end;

destructor TFoo.Destroy;
begin
  TFoo_Destroy(FSelf);
  inherited;
end;

function TFoo.Bar: Integer;
begin
  Result := TFoo_Bar(FSelf);
end;
0
Ну, у нас есть куча способов реализовать взаимодействия между компонентами (помимо нативных вызовов): COM/DCOM/COM+, всякие CORBA, SOAP и прочие WCF…

Но это накладывает много специфических ограничений и создает кучу дополнительных прослоек в виде прокси-классов и прочих оберток.

ИМХО, нативный С++ API хоть и имеет много минусов, но вполне юзабельен и часто более предпочтителен, если речь идет о связи компонетов написаных на С++.
0
Ну, при тех ограничениях, что наложит применение такого апи — не страшно и если одна библиотека будет лезть в экземпляр объекта из другой инлайнутым кодом. Чтобы работал упомянутый 3dsmax API, ЕМНИП, для написания плагинов требуется конкретный компилятор конкретной версии (и, вероятно, с конкретными настройками), а собранные плагины работают только с той версией макса, под какую собраны.
0
P.S. COM, опять же, при игнорировании некоторых правил хорошего тона, слабо отличается от C++ API, но при этом более кроссязычен (но менее, чем COM с соблюдением всех правил — например, C# не любит COM-интерфейсы, разработанные не по правилам).
0
Да я в принципе с Вами согласен. Хотя не всегда все так плохо как в описанном случае с 3dsmax. Например не все так плохо в том же Qt, правда для этого они многое сделали, например сделали API самодостаточным, чтобы не зависть от реализации STL.

Касательно COM – мое личное мнение, что это далеко не самая удачная технология в силу ее сложности. Притом сложность не в самой идеологии, а в том, что там есть просто море очень специфический моментов которые позволяют выстрелить себе в ногу. По крайней мере если реализовывать СОМ объект на MSVC/ATL, возможно в других ЯП и фреймворках с этим проще.
0
В COM можно забить на большую часть технологии и использовать только интерфейсы как кроссязычные классы. Примерно как сделано в этом проекте. Не скажу, что подход без недостатков...)
Например не все так плохо в том же Qt
Гм, насколько я помню, оно юзается из того же компилятора, в котором собрано. По крайней мере под винду точно сборки под каждый компилятор отдельно.
Хотя, в принципе, есть Audiere, который экспортирует классы С++, но вполне импортируется из дельфи за счет того, что бинарно классы в нем реализуются идентично.
0
"… Экспортировать классы из динамической библиотеки..." Не хочется показывать себя неучем, но хотелось бы знать, что означает эта фраза. Спасибо.
0
Имеется ввиду, что библиотека экспортирует интерфейс для С++. Для каждого метода класса экспортируется функция, имя которой кодируется по стандарту описанному в С++. Например ??0CKernel@Kernel@@QAE@XZ это конструктор Kernel::CKernel::CKernel(void)
0
Бывают и другие варианты. Скажем, виртуальные функции незачем экспортировать. ЕМНИП, Audiere как раз экспортирует классы с исключительно виртуальными функциями, а из нормальных экспортов там только функция вида CAudiere GetAudiere().
0
Да, такой вариант довольно часто встречается.
0
Хорошим кандидатом для данного проекта оказалась домашняя метеостанция (ну не часы же :-)).
Как по мне, то в таких штуках самое интересное это прогноз на основе полученных показаний с датчиков. Как прогнозировать погоду будете?
0
нетребуется
Исправьте, очень в глаза режет.
0

Пилять=)) Вот оно! Гайд ребятушки по холиварим=)) То я уже соскучился за годными срачами!

З.Ы. TI — плюс, энергия — минус!
ардуйня — говно! встопятсотый раз повторюсь что только шилды достойны внимания в этой концепции все остальное (IDE, либыб ардуиншики, скетчи, и т.д.) гуано полнейшее!
0
Ок, спасибо
0
пишу под мсп430 в код композере через регистры все) удобно, простые контроллеры, хорошо работают, замена 8 биткам отличная. Насчет энергии — мне лично не понравилось.
+1
Я вчера поработал с электроконструктором.



Что могу сказать, комплектация очень бедная, есть 2 номинала индуктивностей, конденсатов в комплекте нет, резистов нет (я уже не говорю о полупроводниковых элементах). Из того что есть можно собрать ДПТ, но коллеги, это дрянь а не ДПТ, он очень слабый и т. к. частотника в комплекте нет, непонятно как этот привод можно использовать в АСУ ТП. Резюмируя — я не вижу смысла использовать его детали в серьезных проектах.

:)

Вот как-то так у нас и с Ардуино получается. Это именно аналогичный конструктор рассчитанный на людей, которые хотят попробовать сами что-то собрать. Нет ну бывают конечно странные люди, но неадекватов везде хватает.
Поэтому я не вижу смысла обсуждать Ардуино в контексте профессиональной разработки, он для этого не предназначен и никогда для этого не позиционировался. Хотя иногда встречаются удобные и дешевые «шиды» (которые вполне можно поиспользовать), сама Ардуино может использоваться в качестве макетки (хотя есть и намного более удобные), в скетчах можно иногда что-то подсмотреть при написании своей программы и т. д.

Но, повторюсь, Ардуино — это такая игрушка для детей и взрослых, которые до этого не сталкивались с электроникой и программированием МК. И в качестве игрушки (заинтересовать человека, дать ему первый практический опыт в электронике) она свою функцию выполняет. Кто захочет — тот пойдет изучать дальше, что не захочет — так и останется играться конструктором, не вижу в этом ничего плохого.
+2
Скажем так: не то, чтобы совсем уж игрушка. Но со своими ограничениями, аудиториями пользователей (не аудиторией, а аудиториями) и пр.
-1
Ок, возможно «игрушка» не совсем точно, пусть будет «конструктор» или «набор для творчества». Из него можно собрать вполне функциональные вещи, типа «регулятор освещения для аквариума», «метеостанции», «робота» и т. д. чем многие и занимаются (и это хорошо, что занимаются).

Основной мой посыл — нет особого смысла рассматривать Ардуино в контексте профессиональной разработки встраиваемых систем т. к. эта штука для совсем других целей и для другой аудитории.
+3
У меня тоже в лет 12 был такой конструктор как на картинке(ну похожий, если точно). Вот только отец, прежде чем мне его передать, таки заставил прочитать «Электротехнику для чайников солдат СА». И, естественно, одна из моделей у меня не заработала. Тогда отец сел, и на практике мне показал, что «Электроника — наука о контактах». Осознав проблему, в тот же день я начал откладывать на свой первый мультиметр.
***
И если отойти от аллегории (хотя для многих ардуинщиков она актуальна в неизменном виде), то возникает вопрос:
Зачем ограничивать себя в инструментах (я имею ввиду IDE), если в них ничего сложного нет?
Если, ардуино конструктор и отгораживает новичка от основ, то вот пожалуйста пример в статье, все равно к ним придется обратится.
+1
Зачем ограничивать себя в инструментах (я имею ввиду IDE), если в них ничего сложного нет?

Это для Вас ничего сложного. Поставьте себя на место человека, который первый раз решил попробовать что-то сделать. Он даже пока не до конца уверен стоит ли с этим связываться. Он запускает IDE – десяток меню с кучей подменю, и тулбар с кучей непонятных кнопок. А если он зайдет в что-то типа «свойства проекта» — он вообще выпадет в осадок и решит что это все слишком сложно и он никогда с этим не разберется.

На начальной стадии обучения есть свои плюсы в минимализации IDE – там всего 4 кнопки и это не выглядит сложным :)
А потом, если у человека будет желание развиваться — он перейдет на более профессиональные инструменты. Если не будет — ну что же, забросит это дело или так и будет мигать светодиодом из стандартного IDE, тоже ничего особо плохого. Понятное дело, что не из всех, кто собрал что-то на Ардуино, получится профессиональный разработчик (да многие к этому и не стремятся).
+2
Ну вот еще пример: Белов А.В. Микроконтроллеры AVR в радиолюбительской практике.
Описание AvrStudio ст.232-244 (половина из них картинки), я до этой книги (и собственно Avrstudio) вообще ни разу МК не программил, и спросить было некого.
10 страниц это через чур сложно?
+1
Чуть ошибся, вот эта книга Белов А.В. Создаем устройства на микроконтроллерах.
0
Белов А.В. Микроконтроллеры AVR в радиолюбительской практике.
 

Коллега, еще раз прошу, поставе себя на место человека, который первый раз решил попробовать что-то сделать. Да уже само название книги и количество страниц звучит «страшно» :) Я почему-то думаю, что до чтения этой книги Вы были знакомы с основами электроники.

Я приведу пример из моей жизни: хороший знакомый попросил помочь разобраться его сыну с его поделкой на Ардуино («у него там что-то не получается, помоги, тыж программист»). В процессе общения с сыном я ознакомился с ТЗ которое сводилось к «сигнализация», «пересечение лазерного луча как в фильмах», «должна быть именно такая сирена а не просто писк». Притом, многое он уже освоил сам (пусть даже методом тыка, частично не понимая «как это работает»). За пару часов мы с ним выполнили ТЗ, пришлось объяснить как работает ШИМ, подсказать пару моментов по коду и т. д.). Зато какая была радость у человека когда он «сам» все сделал, для него было очень важно, что у него получилось сделать именно то, что он хотел. Судя по поступающим от него вопросам — интерес не угас, он развивается в правильном направлении….

Дык вот, я не рассказывал ему о том, что это плохая «IDE», что нужно сразу переходить на, например, AvrStusio. Боюсь, если бы я начал академически правильно рассказывать о программировании, С++, алгоритмах и структурах данных — парень просто бы забил на идею «сигнализации» и пошел бы «шпилить в Дотку».

ИМХО, именно в этом и фича Ардуино, что можно сразу получить что-то работающее (пусть пока без понимания принципа) — это завлекает. Академический подход к изучению (от теории к практике) может и более «правильный», но он такой скучный, что пройти его может только человек, который уже мотивирован. Чтобы завлечь человека — нужен именно простой электро-конструктор, а не трехтомник Савельева (если человек заинтересуется, он сам дойдет до Савельева)
+4
Я не призываю отказатся от Ардуино совсем. Просто мне их подход с " огораживанием" пользователя не понравился. Может действительно когда-нибудь сделают где-то галочку " режим профи".
А пока, я все же для себя не решил, что бы я советовал для начала новичку.
0
 галочку " режим профи"

Дык ведь сама Ардуино не рассчитана на профи — зачем там эта галочка? Зачем профи нужно связываться «прокачанной» версией IDE от Ардуино? Для меня это звучит как «версия конструктора Лего, специально для профессиональных инженеров» :)

Для профи и так есть куча специализированных IDE на любой вкус и цвет, специализированные системы управления сборкой, системы управления версионностью и прочие профессиональные инструменты.
+1
их подход с " огораживанием" пользователя

В этом есть здравое зерно. В классическом говнокодировании на Си (особенно под ARM MCU) жутко утомляет вначале ползанье по куче файлов станд.библиотеки и особенно по бесконечной портянке хедера с описанием всех регистров и битов периферии. С этим безобразием что-то надо делать.
-4
Основной мой посыл — нет особого смысла рассматривать Ардуино в контексте профессиональной разработки встраиваемых систем т. к. эта штука для совсем других целей и для другой аудитории.
Согласен
-1
как будто у стм библиотеки без глюков
вот только пишут их быдлокодеры от самого производителя
вот где позор
-2
Чет не интересно вообще, походу бомболейло не всплыло… эх
0
  • avatar
  • kalik
  • 01 февраля 2016, 00:51
Надо было на гик запостить
0
Просто все наверное тут Атмел купили...
0
та пофиг… я чет не атмел, ни пик, ни кряк не люблю… пусть хоть перекупятся да обанкротятся… сами себя лишают рынка, сами потом воют… ав олдфагоскулодрочеры ноют о том что ж типерь делать, эта жи светадиодикам не памигать… православноправильный атмелишку купил пик и банкротить буит теперь! какнкуренция!
0
Да это я к тому, что как сказал один форумчанин:" Если на форуме тишина, то значит в какой-то уютной теме ведётся срачь".
0
та хз… мне кажется все намного хуже: политота не интересна, ардуйня стухла тоже, покупка кем-то чего-то ЛОЛ! пингвин против окна? — чет не актуально! Жаба или плюсы (шарп) туда же скатилось мож пора свежие темы для срачей искать? Ау! народ, пора освежить поля боя! что свеженького может взбудоражить люд, как пачка дрожжей в сельском туалете?
0
Да, ладно, просто один и тот-же контингент на ресурсе, и все предложенные вами темы для холивара давно обсудили, и по нескольку раз.

З.Ы. А я вот утверждаю, что бога нет! :)
0
тю, так я того… склонен к буддизму больше чем к христианству=))
0
тю, так я того… склонен к буддизму больше чем к христианству=))
Не, ну коллега, так у нас точно срач не получится. Вы должны были развить (а не замять) конфликт :)
0
Ок! Вы че? не уважаете православие? Тоесть когда Владимир Святославович крестил Русь для того чтоб Вы жили в мире и достатке… и т.д. и т.п. а тут такие заявы… не не не… патриарх Кирил не для того себе яхту покупал… окститесь или будете преданы анафеме!!! И не будет пути назад… ну и про ад все слышали…
Короч! не для того о великие и святые Сталин с Члениным церкви самолично разрушали!!!
0
надеюсь не переборщил)))
0
Да не, теперь уже выглядит ненатурально и наигранно. Расходимся, уже срача не будет :)
0
бля(((
0
А я вот утверждаю, что бога нет!
Какого БОГА нет, у КОГО?

Может нет БОГА у подлых, аморальных и продажных латинян (католиков/протестантов), т.е. у Запада?

Аллаха(C) давайте пропустим, ибо… «как-то не принято ныне» оскорблять религиозные чувства верующих мусульман.

А может лучше нанесем удар по пиндосским богам, т.е. по всем этим сектам и их пасторам, поющим с микрофоном — баптистам, мормонам и прочим «Сторожевым башням»?

Кого будем чморить? Где и что расшатывать? А? А я знаю уже наперед, кого и где…

ВНЕЗАПНО, а может Б-ГА нет у жидов (прости меня Господи, грешного) евреев/израильтян, т.е. Авраамов, которые и замутили когда-то очень давно все эти 3-4 основные мегатемы? Израиль итак живет буквально на пороховой бочке, там тотальная мобилизация и даже 18-летние девушки служат положенные 2 года танкистами или автоматчиками. Как Вам не стыдно, e_mc2! Вы, кстати, служили танкистом или автоматчиком?

P.S. Поморщив интеллехентский лоб и нацепив пенсне на яйцеголовое чело, можно потеоретизировать и на «научные» темы: был ли Создатель, есть ли Всевышний Разум и т.п.

Гы-ы, только вот даже сам Альберт Германович на склоне лет вроде бы сильно сомневался в абсолютной правильности тезиса о том, что «Бога — нет». Кроме того, это просто еще не доказано наукой, т.е. средствами математики, физики и философии.
-3
Кажись у х*ёman-а да бомбануло=)) даже долго не было подобного высера=))
Можно считать срач удался!
+2
Energia даже со многими «родными» примерами работает некорректно.
Все-таки, чтобы получить реальные впечатления, надо не пожалеть 300-400р на китайскую Uno.
Я не пожалел. Во всех смыслах. Как время появится, напишу ответ ардуино-хейтерам :)
0
Если, что это статья не для хейтерства. Если бы у меня все заработало, я бы ее не писал (и пофиг на говнокод и тому подобные претензии). Основной посыл — время потраченное на ардуино, не меньше чем для нормальной IDE.
0
А у меня было так: воткнул плату ESP8266, по инструкции скачал расширение для платы (кстати, чумовая фича), запустил пример веб-сервера, и через 5 минут увидел в браузере «HELLoWorld» :)
через Wi-Fi.
Потом пришел набор с Uno, и я до часу ночи зажигал с RGB светодиодом :)
а статейку хочу забацать в стиле
1. Разрушение мифов
2. Заглядываем «под капот»
3. Запуск ардуино «по-человечески»Ж IDE, makefile и все дела.
Времени катастрофически не хватает, но может выкрою пару зимних вечеров.
Тема того стоит.
0
Кстати, начал я тоже с ланчпада и енерджии, поскольку MSP мне ближе.
И уже тогда показалось интересным.
0
А может подкажите тогда по ESP. Вроде все делал то же по инструкциям, грузит прошивку, но в конце
warning: espcomm_send_command: wrong direction/command: 0xD1 0x0D, expected 0x01 0x08

И все плата окукливается (в ком порте мусор). И что делать ХЗ.
ЗЫ Справедливости ради, даже родным даунлодером прошивка шьется через раз, и то не во все сектора. Не знаю может флеш с браком.
0
А версии все последние? У меня прямо на ура, воткнул-залил-работает.
Я бы иначе и заморачиваться с ошибками не стал, не до этого сейчас
0
Та вроде да. Просто думаю, раз родной флешер, даже дефолтную прошивку не во все адреса пишет, может действительно китайцы брак подсунули.
0
воткнул плату ESP8266, по инструкции скачал расширение для платы (кстати, чумовая фича), запустил пример веб-сервера, и через 5 минут увидел в браузере «HELLoWorld»

Юзали и 8266 тоже. На первый взгляд работает, отвечает на запросы быстро, только вот уже после ответа на запрос возникает странная задержка в ~500 мс, хрен знает откуда. Не исключаю, что китаец просто решил ограничить доступную частоту запросов по каким-либо своим причинам. В таких вот моментах и есть вся суть ваших «5 минут».
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.