Комментарии 29
но разве ардуино-язык не си-подобный? зачем программировать на си, когда можно программировать на си?
-1
Он не с-подобный, а чистейший с++
Если стоит задача уложиться в 180 байт, может и есть смысл перейти на си. А так — непонятно.
Единственное, с чем соглашусь, что под ардуиновой «оболочкой» невозможно работать в принципе.
Если стоит задача уложиться в 180 байт, может и есть смысл перейти на си. А так — непонятно.
Единственное, с чем соглашусь, что под ардуиновой «оболочкой» невозможно работать в принципе.
+3
Проблема не столько в байтах, сколько в реалтайме. При внезапной перезагрузке по питанию тратится некоторое время на бутлоадер ардуины, иногда это может быть критично.
+1
Если нужна экономия — достаточно перейти на C++ без «тяжеловесных» конструкций вроде исключений. Если ограничиться расширенным синтаксисом, классами, виртуальными/шаблонными функциями и т.п., gcc даст код того же объема, что и аналогичный на чистом C.
0
gcc даст код того же объема, что и аналогичный на чистом C
Да не того же, проверяли. Издержки есть. Ну или надо быть гуру C++ и gcc
Для большинства задач обычный C подходит лучше всего. И даже там компилятор умудряется налажать в некоторых конструкциях, вставляя бессмысленный код, но как правило небольшой рефакторинг помогает ему связать всё более эффективно.
0
Я тоже проверял — даст. :) Гуру быть не нужно, достаточно общего понимания кодогенерации и оптимизации в C++.
Для простейших задач, разумеется, C++ особого смысла не имеет, хотя удобно использовать файлы .cpp просто для написания в расширенном плюсовом синтаксисе, без довольно глупых ограничений традиционного C.
Для простейших задач, разумеется, C++ особого смысла не имеет, хотя удобно использовать файлы .cpp просто для написания в расширенном плюсовом синтаксисе, без довольно глупых ограничений традиционного C.
+1
Ардуино-проекты и так использует
-fno-exceptions
при сборке. Всё-таки на avr (особенно на attiny) места не слишком много0
Почему бы не использовать полноценные IDE? Например Eclipse с плагином AVR — так же работает с avrdude, полностью создаёт проект, где не надо возиться с makefile и т.д. Открыл, пощёлкал диалог, и вперёд писать код.
+2
Как раз таки лучше makefile, все под контролем.
И тогда по большому счету без разницы, какая оболочка. А в крайнем случае можно собрать проект из голой консоли
И тогда по большому счету без разницы, какая оболочка. А в крайнем случае можно собрать проект из голой консоли
+2
Может потому что эклипс — эпический тормоз, и кому-то нравится писать по-олдскульному практически в блокноте. К примеру я с удовольствием последую этому мануалу чтобы не нагружать бедный слабенький нетбук atmel studio или тем же самым эклипсом.
Вполне вариант имеющий право на жизнь.
Вполне вариант имеющий право на жизнь.
+2
Вариант, не спорю, да и сам эклипс не люблю. Просто предложил его как способ быстро получить результат.
0
А ещё можно использовать Sublime Text с плагином Arduino-like IDE и получить удобную среду с автодополнением и прочими радостями. Пока этого плагина не было сам использовал makefile для сборки программ под чистый AVR и Arduino из-под саблайма. Кстати, в менюшке этого плагина есть пункт «Bare GCC Build» для сборки программы без использования duino-библиотек.
+1
AVR Studio версии 4, то есть до разжирения, хорошо работала на Pentium II со 128 мегабайтами оперативки. Она по прежнему доступна для скачивания на официальном сайте вместе с AVR-GCC.
Или Code::blocks Он и Makefile генерировать умеет.
Или Code::blocks Он и Makefile генерировать умеет.
0
Ну это Вы про эклипсу зря.
Хотя у каждой IDE есть свои плюсы.
по-олдскульному практически в блокнотепопробуйте IAR. Вам тогда Eclipse манной небесной покажется.
Хотя у каждой IDE есть свои плюсы.
0
НЛО прилетело и опубликовало эту надпись здесь
Макеfile полезно писать самому. Это ключевой момент для переиспользования конфигов при devops.
Make не дураки придумали.
Если же передавать конфиги через gui eclipse ,то конфиги будут инкапсулироваться в xml для каждой сборки. Будет очень много дублирования конфигов, и как следствие мышковозни.
0
Занимался чем-то подобным с TI LaunchPad (отладочная плата с mcu семейства msp430). Многие называют эту вещь альтернативой Arduino. Наверное по причине наличия среды Energia c кучей скетчей, как в Arduino. Если же хочется программировать его на «чистом C», то есть проприетарная среда от TI: Code Composer Studio и открытый проект “GCC toolchain for MSP430”, который представляет собой набор патчей для соответствующих утилит (gcc, gdb), добавляющих возможность разработки под архитектуру msp430.
Для программирования памяти микроконтроллера и отладки есть утилита “mspdebug”, предоставляющая возможность взаимодействия с различными программаторами. В mspdebug есть возможность запустить gdb-сервер и подключиться к нему из пропатченного gdb — можно дебажить «чистый С'шный код на железке».
Для программирования памяти микроконтроллера и отладки есть утилита “mspdebug”, предоставляющая возможность взаимодействия с различными программаторами. В mspdebug есть возможность запустить gdb-сервер и подключиться к нему из пропатченного gdb — можно дебажить «чистый С'шный код на железке».
0
Забавно, что Makefile у вас для мака, судя по путям. В XCode писать под ардуинки не пробовали? Довольно удобно.
P.S. ну и когда avrdude «не может найти плату», у меня обычно достаточно просто запустить еще раз, кабель передергивать не требуется.
P.S. ну и когда avrdude «не может найти плату», у меня обычно достаточно просто запустить еще раз, кабель передергивать не требуется.
0
Код файла main.c стоило бы прокомментировать. И чем подробнее, тем лучше. Пускай даже там ерунда какая-нибудь, а всё равно — вы хотите чтобы человек с ардуины, который писал «пин 5 гори!» сразу с ходу понял этот конструктивизм PORTB &= ~(1 << LED_PIN);
Конечно тут можно послать изучать C и тому подобное, но всё же — почему именно так, а не по другому? Всё же статья носит обучающий характер. Спасибо.
Конечно тут можно послать изучать C и тому подобное, но всё же — почему именно так, а не по другому? Всё же статья носит обучающий характер. Спасибо.
+1
Это такие почти стандартные конструкции по управлению и опросу портов :)
В конечном итоге это превращается в что-то типа
А если расписать это по действиям, то получается:
PORT_LED &= ~(1<<LED1); — установить состояние порта — 0
взять число 1, сдвинуть его на номер бита (в хедерах так же описаны специальные биты специальных регистров), проинвертировать его побитово (получив «0» в нужном нам месте) а затем произвести побитовое «И» с содержимым регистра нужного нам порта.
PORT_LED |= (1<<LED1); — установить состояние порта — 1
взять число 1, сдвинуть его на номер бита, а затем произвести побитовое «ИЛИ» с содержимым регистра нужного нам порта.
Похожей «замудренности» конструкции применяются и для проверки состояния портов
В конечном итоге это превращается в что-то типа
void Led1On(void){PORT_LED &= ~(1<<LED1);}
Led1On:
00015C 9893 CBI 0x12,3
void Led1On(void){PORT_LED &= ~(1<<LED1);}
00015E 9508 RET
void Led1Off(void){PORT_LED |= (1<<LED1);}
Led1Off:
000160 9A93 SBI 0x12,3
void Led1Off(void){PORT_LED |= (1<<LED1);}
000162 9508 RET
А если расписать это по действиям, то получается:
PORT_LED &= ~(1<<LED1); — установить состояние порта — 0
взять число 1, сдвинуть его на номер бита (в хедерах так же описаны специальные биты специальных регистров), проинвертировать его побитово (получив «0» в нужном нам месте) а затем произвести побитовое «И» с содержимым регистра нужного нам порта.
PORT_LED |= (1<<LED1); — установить состояние порта — 1
взять число 1, сдвинуть его на номер бита, а затем произвести побитовое «ИЛИ» с содержимым регистра нужного нам порта.
Похожей «замудренности» конструкции применяются и для проверки состояния портов
if (!(PIN_KEY & (1<<K2))) // проверка состояния пина, активный «0»
000D84 99CD SBIC 0x19,5
000D86 C006 RJMP 0xD94
+3
Посмотрите на platformio.org. Нет зависимостей по Arduino IDE, Makefiles или tool chains… Поведение одно и тоже в независимости от ОС (работает на всех популярных ОС). Есть Library Manager. Легко интегрируется в любимые IDE.
Для Вашего примера с «atmega168»
Пример проекта ATmel AVR Native Blink.
Для Вашего примера с «atmega168»
platformio.ini
будет смотреться так:[env:test_atmega168]
platform = atmelavr
board_mcu = atmega168
board_f_cpu = 16000000L
upload_protocol = arduino
upload_speed = 19200
targets = upload
Пример проекта ATmel AVR Native Blink.
0
Огромное спасибо за пост, спустя столько лет он очень полезен!
0
Как на плате Arduino uno настроить пошаговую отладку прошивки?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Программируем Arduino на чистом Си