Комментарии 40
А stm32f4discovery на картинке про поддерживаемые платы просто для смеха размещена, или ее тоже можно прошить и использовать с Espruino? А то я бы достал ее с полки чтоб попрообовать.
Что имеет значение, так это то, что C++ — сложный и деревянный. Да, он близок к железу, но именно поэтому требует глубокого понимания этого железа и информатики.
Скажу как человек, который любит высокоуровневые языки и которому лень изучать что то другое.
Когда только начал смотреть в сторону arduino много гуглил, можно ли под него взять какой нибудь питон и не париться. Но когда все же попробовал писать на С++ (знаю знаю, arduino ide добавляет очень много сахара), никаких проблем не возникло. Если не лезть в дебри, то можно обойтись обычным официальным мануалом. Это не сложнее, чем JavaScript.
Сложно написать большую программу, а причин две: 1) отсутствие неявного преобразования типов и как следствие — выходящие из под контроля монструозные функции и 2) погруженность в единый loop(), от которого, как ни крутись, не избавишься.
2) погруженность в единый loop(), от которого, как ни крутись, не избавишься
Вы не поверите, но с этим никаких проблем!
Вам никто и ничто не мешает написать типичное "int main(){...}".
Ну тут как посмотреть. Я бы сказал, что тут у медали, как водится, две стороны
Извините за каламбур, но плюсы плюсов:
1) отстутствие неявного преобразования типов, и, следовательно, упрощение разработки в IDE и меньшее количество багов на этапе отладки
и
2) явная погруженность в единый loop(), что позволяет намного точнее управлять происходящим, нежели некий абстрактный setInterval()
p.s: код, чтобы гонять туда-сюда массивы на любом языке плюс/минус одинаков
Извините за каламбур, но плюсы плюсов:
1) отстутствие неявного преобразования типов, и, следовательно, упрощение разработки в IDE и меньшее количество багов на этапе отладки
и
2) явная погруженность в единый loop(), что позволяет намного точнее управлять происходящим, нежели некий абстрактный setInterval()
p.s: код, чтобы гонять туда-сюда массивы на любом языке плюс/минус одинаков
«код, чтобы гонять туда-сюда массивы на любом языке плюс/минус одинаков»
вот только почему то изредка попадаются вакансии на то чтоб гонять туда сюда массивы байт в сыром виде,
и начинаются они с 150-200тр.
совсем недавно мужик искал спеца по передаче данных для мед техники и томографов с «простой» задачей — достигнуть 50% полосы пропускания USB 2.0 HS (480 МГц) на фтди. Сфейлилась вся очередь желающих и соискателей.
вот только почему то изредка попадаются вакансии на то чтоб гонять туда сюда массивы байт в сыром виде,
и начинаются они с 150-200тр.
совсем недавно мужик искал спеца по передаче данных для мед техники и томографов с «простой» задачей — достигнуть 50% полосы пропускания USB 2.0 HS (480 МГц) на фтди. Сфейлилась вся очередь желающих и соискателей.
Хм, я, например, в js как раз больше всего и не перевариваю это неявное приведение типа.
Не смотря на то, что старенькая STM32VLDISCOVERY в списке поддерживаемых, после прошивки бутлоадера по ману с их сайта — дискавери отвалилась навсегда. Теперь она не определяется в системе и прошить ее штатно невозможно. Ну а поскольку отдельного STLink-а под руками нет — пришлось на все это забить. Вот такая печаль-беда. Теперь есть дискавери-сувенир =(.
Именно версию VL не пробовал, пробовал F4. Если что-то пошло не так, на плате должен быть пин BOOT0. Замыкаете его на 3.3V, ресетите и вы в DFU — сможете заново залить нужную прошивку.
СТМ32 можно навсегда ушатать, только прошив Level 2 защиту. Из всех остальных состояний они поднимаются через бутлоадер, жытаг и даже СВД с пре-ресетом
Эти Espruino стоят практически как полноценные мини-пк вроде raspberry, ну и зачем они тогда?
Это разные вещи. Каждой — своя задача. RPi стартует дольше минуты, опустошает батарейку моментально и не имеет аппаратных средств для работы с большей частью хоббийной периферии, зато мощи хоть отбавляй: Linux, мультимедиа, все дела. Espruino из другого лагеря: лёгкая, энергоэффективная, коммуникабельная.
----Программирование похоже на… JavaScript.
то что написали практически один в один С++
то что написали практически один в один С++
Если имплементированы необходимые библиотеки, то ваш код будет работать без изменений на C++.
Я понимаю если бы вы писали про голимый С — там с архитектурной точки зрения все плохо, но java-script — это полный кошмар среди языков, хуже наверное тока VB.
Современный С++ обладает большинством фишек функциональных языков.
А уж с архитектурой приложений на нем всегда было в порядке.
Я понимаю если бы вы писали про голимый С — там с архитектурной точки зрения все плохо, но java-script — это полный кошмар среди языков, хуже наверное тока VB.
Современный С++ обладает большинством фишек функциональных языков.
А уж с архитектурой приложений на нем всегда было в порядке.
Ну а всё же, смску разберёте на C++?
Мне кажется, вы лукавите, судя по документации, с вашем примере просто использована встроенная функциональность: http://www.espruino.com/SIM900
На C++ при наличии готовой библиотеки было бы что-то типа такого (не ручаюсь за синтаксис, я на С++ не писал давольно давно, а профессионально, в общем, никогда):
#include <stdio.h>
#include <sim900.h>
void SMSHandler(char* text) {
int r,g,b;
sscanf(text, "%i %i %i", &r, &g, &b);
if(r && g && b) fadeTo(r,g,b);
}
sim900 *sim = new sim900();
sim->powerOn();
sim->addHandler(sim900::EVENT_SMS, &SMSHandler);
На C++ при наличии готовой библиотеки было бы что-то типа такого (не ручаюсь за синтаксис, я на С++ не писал давольно давно, а профессионально, в общем, никогда):
#include <stdio.h>
#include <sim900.h>
void SMSHandler(char* text) {
int r,g,b;
sscanf(text, "%i %i %i", &r, &g, &b);
if(r && g && b) fadeTo(r,g,b);
}
sim900 *sim = new sim900();
sim->powerOn();
sim->addHandler(sim900::EVENT_SMS, &SMSHandler);
А хорошо :) Речь не о библиотеке шла, а о скорее банальных вещах. Вот в вашем примере: кто хозяин строки текста СМС, т.е. кто должен освободить память? Кто-то как-то должен и для этого должен быть дополнительный код или вызов. Аналогично, addHandler мы сделали, но где-то нужно давать шанс этому хендлеру вызываться. Ничего сложного, но мелочей много и что-то обычно уходит из виду.
>> кто хозяин строки текста СМС, т.е. кто должен освободить память
класс sim900, он нам ее передает, так что это его проблемы.
>> нужно давать шанс этому хендлеру вызываться
опять же, sim900 его и вызовет
Для нас все будет точно так же, на нашем уровне абстракции нам только надо написать обработчик с прототипом, указанным в документации («SMSHandler») и зарегистрировать его («sim->addHandler(sim900::EVENT_SMS, &SMSHandler);»).
Я понимаю, к чему вы клоните :) Да, многие вещи на JS делать приятнее и можно чуть дольше оставаться в зоне комфорта, не отвлекаясь на какие-то низкоуровневые моменты. Но если проект хоть немного сложный, думать и разбираться придется и там и там. Причем, на JS борьба, например, с утечкой памяти, едва ли не сложнее, чем в С.
Я просто хотел сказать, что C++ позволяет при желании писать точно в таком же стиле. А то, что многие примеры «как сделать XXX на МК» в интернете представляют собой лапшу из бизнес-логики и двоичных операций над регистрами — это не вина языка.
класс sim900, он нам ее передает, так что это его проблемы.
>> нужно давать шанс этому хендлеру вызываться
опять же, sim900 его и вызовет
Для нас все будет точно так же, на нашем уровне абстракции нам только надо написать обработчик с прототипом, указанным в документации («SMSHandler») и зарегистрировать его («sim->addHandler(sim900::EVENT_SMS, &SMSHandler);»).
Я понимаю, к чему вы клоните :) Да, многие вещи на JS делать приятнее и можно чуть дольше оставаться в зоне комфорта, не отвлекаясь на какие-то низкоуровневые моменты. Но если проект хоть немного сложный, думать и разбираться придется и там и там. Причем, на JS борьба, например, с утечкой памяти, едва ли не сложнее, чем в С.
Я просто хотел сказать, что C++ позволяет при желании писать точно в таком же стиле. А то, что многие примеры «как сделать XXX на МК» в интернете представляют собой лапшу из бизнес-логики и двоичных операций над регистрами — это не вина языка.
>java-script — это полный кошмар
Ну ужас. Но не УЖАС УЖАС! (с)
На js можно транспилить что то вроде больше сотни языков https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js
Берете любой по своим понятиям и пишите — в чем проблема?
PS авторам — может действительно стоило бы разобрать пример с каким нибудь питоном?
Ну ужас. Но не УЖАС УЖАС! (с)
На js можно транспилить что то вроде больше сотни языков https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js
Берете любой по своим понятиям и пишите — в чем проблема?
PS авторам — может действительно стоило бы разобрать пример с каким нибудь питоном?
… а теперь мы попробуем запустить майнкрафт на AtTiny48!
А кстати, что у Espruino с генерацией точной частоты?
Чтобы сделать музыкальный синтезатор на Arduino, я выводил tone() на пин, затем железно соединял его с прерыванием, по которому выполнялся код, который обрабатывал короткий Калман-фильтр с клавиатуры и мог выставить новое значение tone().
SetInterval(), как я понимаю, не гарантирует микросекундную точность?
С другой стороны, digitalPulse не дает последовательной пульсации.
Чтобы сделать музыкальный синтезатор на Arduino, я выводил tone() на пин, затем железно соединял его с прерыванием, по которому выполнялся код, который обрабатывал короткий Калман-фильтр с клавиатуры и мог выставить новое значение tone().
SetInterval(), как я понимаю, не гарантирует микросекундную точность?
С другой стороны, digitalPulse не дает последовательной пульсации.
Задача tone — генерация ШИМ с 50% скважностью, но с заданной частотой, которая отличается от «жёстко-установленной» для analogWrite.
На Espruino всё проще, analogWrite сама принимает параметр частоты. Вот, например, 3 кГц:
Или вот сигнал для серво:
На Espruino всё проще, analogWrite сама принимает параметр частоты. Вот, например, 3 кГц:
analogWrite(P2, 0.5, {freq: 3000});
Или вот сигнал для серво:
analogWrite(P2, 0.05 /* 1000 us */, {freq: 50});
Спасибо, это хороший вариант.
Обратно также через прерывания заводить?
Обратно также через прерывания заводить?
Да, через
Настоящие прерывания всё равно возможны, только они сложнее: обработчик обязан быть написан на нативном Си.
setWatch
. Это не совсем настоящее прерывание: при возникновении события ставится лишь флаг на исполнение, а настоящее исполнение происходит в основном event-loop’е, но его будет вполне достаточно, если в event-loop’е нет других задач.Настоящие прерывания всё равно возможны, только они сложнее: обработчик обязан быть написан на нативном Си.
Подробнее про ESP8266 можете рассказать? Интересно использование Espuino с дешевым железом
Вся информация по ESP вот здесь собрана: http://www.espruino.com/EspruinoESP8266
C++ тоже далек от железа. Как, например, на нём сделать циклический сдвиг через флаг переноса? И как вообще работать с флагами? Всякие прикольные инструкции не поиспользуешь. Код, для которого нужны жесткие тайминги, тоже непонятно как писать. Кто его знает во что C++ код будет откомпилирован и сколько тактов это будет выполняться.
С другой стороны, для большинства задач это наверное не важно.
С другой стороны, для большинства задач это наверное не важно.
_asm(...)
#asm(«sei»);
Еспруино это ладно. Меня вчера матерый электронщик, дед с окладистой бородой, спрашивал — вот смотри, раньше в электронике-60 системах была команда Halt, меня интересует, а сейчас на коре2дуо я такой же фокус повторить смогу? Тырить осциллографом уровни при адресации… Ну, я ему обьяснил, как устроена материнка.
Я его огорчил. Сильно. Потому что нижнего уровня почти не осталось. А если еще контроллеры начнут на яваскрипте запускать — то всё, тут даже всей лабораторией с кучей навороченных приборов уже мало что поймёшь. Утрирую, но нынешние SOC — кошмар в плане ремонта и отладки, если ты не подписал NDA.
Еспруино это ладно. Меня вчера матерый электронщик, дед с окладистой бородой, спрашивал — вот смотри, раньше в электронике-60 системах была команда Halt, меня интересует, а сейчас на коре2дуо я такой же фокус повторить смогу? Тырить осциллографом уровни при адресации… Ну, я ему обьяснил, как устроена материнка.
Я его огорчил. Сильно. Потому что нижнего уровня почти не осталось. А если еще контроллеры начнут на яваскрипте запускать — то всё, тут даже всей лабораторией с кучей навороченных приборов уже мало что поймёшь. Утрирую, но нынешние SOC — кошмар в плане ремонта и отладки, если ты не подписал NDA.
Здесь WebAssembly был бы в тему, чтобы заливать в железку байт-код, а не текст JavaScript.
Главная проблема любого фрэймворка и высокоуровнего языка — это документация. О многих имеющихся функциях не узнаешь, пока на stackoverflow кто-нибудь не упомянуть. Откуда информацию берут тамошние обитатели — для меня загадка. Пока что единственный пример, который меня в этом плане устроил — это док на unity3d. Каждый метод, каждое свойство идут здоровенным списком и, как минимум, дают знать о том что они существуют. А примеры уже внутри, не снаружи. Обратный пример — Qt: сначала читаете примеры, в которых есть не всё, а потом ищем класс в доке. Наоборот не получится: классификация их по разделам угробищная и не привязана к решаемой задаче, как в U3D. Или stackoverflow. Вашу доку сейчас посмотреть не могу, но вы можете сделать это сами и оценить к какому из примеров она ближе. Если к юнити — молодцы, не считая того, что в принципе сделали ересь.
Ардуинщики в большинстве своём не станут профессионалами в отличие от тех, кто в изучал своё хобби на примере 2313 и ассемблерных уроков с радиокота и им подобных. Зато первые хороши тем, что им можно что нибудь продать, это да.
Ардуинщики в большинстве своём не станут профессионалами в отличие от тех, кто в изучал своё хобби на примере 2313 и ассемблерных уроков с радиокота и им подобных. Зато первые хороши тем, что им можно что нибудь продать, это да.
Насчет языка не соглашусь. Узнавание функции на stackoverflow часто никак не связано, задокументирована эта функция или нет, а часто связана с тем, что всеми любимую документацию не удосужились прочитать от корки до корки. По JS есть MDN и я не видел еще не одной функции, которая бы работала, но не была задокументирована. Да, конечно есть плохо задокументированые места, но как показывает практика, они никому не сдались.
Что касается доки Unity3D… С одной стороны, это лучше Qt, с другой стороны найти в 100500 классах нужный, а еще лучше найти его в другом неймспейсе через гугл… В общем, легко превратить свою жизнь в адъ. ИМХО, дока той же Node.js горазда приятнее
Что касается доки Unity3D… С одной стороны, это лучше Qt, с другой стороны найти в 100500 классах нужный, а еще лучше найти его в другом неймспейсе через гугл… В общем, легко превратить свою жизнь в адъ. ИМХО, дока той же Node.js горазда приятнее
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Espruino: JavaScript в микроконтроллере