Pull to refresh

Comments 29

но разве ардуино-язык не си-подобный? зачем программировать на си, когда можно программировать на си?
Он не с-подобный, а чистейший с++

Если стоит задача уложиться в 180 байт, может и есть смысл перейти на си. А так — непонятно.
Единственное, с чем соглашусь, что под ардуиновой «оболочкой» невозможно работать в принципе.
Проблема не столько в байтах, сколько в реалтайме. При внезапной перезагрузке по питанию тратится некоторое время на бутлоадер ардуины, иногда это может быть критично.
Вот как выглядит main.cpp (папка cores)

#include <WProgram.h>

int main(void)
{
	init();

	setup();
    
	for (;;)
		loop();
        
	return 0;
}


Переопределите функцию init() и будет, как говорится, счастье
Если нужна экономия — достаточно перейти на C++ без «тяжеловесных» конструкций вроде исключений. Если ограничиться расширенным синтаксисом, классами, виртуальными/шаблонными функциями и т.п., gcc даст код того же объема, что и аналогичный на чистом C.
gcc даст код того же объема, что и аналогичный на чистом C

Да не того же, проверяли. Издержки есть. Ну или надо быть гуру C++ и gcc
Для большинства задач обычный C подходит лучше всего. И даже там компилятор умудряется налажать в некоторых конструкциях, вставляя бессмысленный код, но как правило небольшой рефакторинг помогает ему связать всё более эффективно.
Я тоже проверял — даст. :) Гуру быть не нужно, достаточно общего понимания кодогенерации и оптимизации в C++.

Для простейших задач, разумеется, C++ особого смысла не имеет, хотя удобно использовать файлы .cpp просто для написания в расширенном плюсовом синтаксисе, без довольно глупых ограничений традиционного C.
Ардуино-проекты и так использует -fno-exceptions при сборке. Всё-таки на avr (особенно на attiny) места не слишком много
Угу, я как раз для ATTiny13 и сравнивал плюсовый код с неплюсовым.
Почему бы не использовать полноценные IDE? Например Eclipse с плагином AVR — так же работает с avrdude, полностью создаёт проект, где не надо возиться с makefile и т.д. Открыл, пощёлкал диалог, и вперёд писать код.
Как раз таки лучше makefile, все под контролем.
И тогда по большому счету без разницы, какая оболочка. А в крайнем случае можно собрать проект из голой консоли
Может потому что эклипс — эпический тормоз, и кому-то нравится писать по-олдскульному практически в блокноте. К примеру я с удовольствием последую этому мануалу чтобы не нагружать бедный слабенький нетбук atmel studio или тем же самым эклипсом.
Вполне вариант имеющий право на жизнь.
Вариант, не спорю, да и сам эклипс не люблю. Просто предложил его как способ быстро получить результат.
А ещё можно использовать Sublime Text с плагином Arduino-like IDE и получить удобную среду с автодополнением и прочими радостями. Пока этого плагина не было сам использовал makefile для сборки программ под чистый AVR и Arduino из-под саблайма. Кстати, в менюшке этого плагина есть пункт «Bare GCC Build» для сборки программы без использования duino-библиотек.
Подтверждаю, плагин удобный! Можно не только красиво выравнивать программы, но и более удобно работать с выводом.
AVR Studio версии 4, то есть до разжирения, хорошо работала на Pentium II со 128 мегабайтами оперативки. Она по прежнему доступна для скачивания на официальном сайте вместе с AVR-GCC.

Или Code::blocks Он и Makefile генерировать умеет.
Ну это Вы про эклипсу зря.
по-олдскульному практически в блокноте
попробуйте IAR. Вам тогда Eclipse манной небесной покажется.
Хотя у каждой IDE есть свои плюсы.
UFO just landed and posted this here
clion пока поддерживает только cmake.

В принципе, ничего не мешает сделать сборку под avr на cmake, по аналогии с stm32, например.

Макеfile полезно писать самому. Это ключевой момент для переиспользования конфигов при devops.

Make не дураки придумали.

Если же передавать конфиги через gui eclipse ,то конфиги будут инкапсулироваться в xml для каждой сборки. Будет очень много дублирования конфигов, и как следствие мышковозни.

Занимался чем-то подобным с TI LaunchPad (отладочная плата с mcu семейства msp430). Многие называют эту вещь альтернативой Arduino. Наверное по причине наличия среды Energia c кучей скетчей, как в Arduino. Если же хочется программировать его на «чистом C», то есть проприетарная среда от TI: Code Composer Studio и открытый проект “GCC toolchain for MSP430”, который представляет собой набор патчей для соответствующих утилит (gcc, gdb), добавляющих возможность разработки под архитектуру msp430.
Для программирования памяти микроконтроллера и отладки есть утилита “mspdebug”, предоставляющая возможность взаимодействия с различными программаторами. В mspdebug есть возможность запустить gdb-сервер и подключиться к нему из пропатченного gdb — можно дебажить «чистый С'шный код на железке».
Забавно, что Makefile у вас для мака, судя по путям. В XCode писать под ардуинки не пробовали? Довольно удобно.
P.S. ну и когда avrdude «не может найти плату», у меня обычно достаточно просто запустить еще раз, кабель передергивать не требуется.
Я недавно узнал о надстройке, теперь пользуюсь — великолепная среда разработки, очень рекомендую!
В XCode пока не пробовал, спасибо за ссылку. Вместо передергивания кабеля нашел другой способ: нажать на reset ардуинки, потом запустить make flash, потом отпустить reset и заливка пойдет.
Код файла main.c стоило бы прокомментировать. И чем подробнее, тем лучше. Пускай даже там ерунда какая-нибудь, а всё равно — вы хотите чтобы человек с ардуины, который писал «пин 5 гори!» сразу с ходу понял этот конструктивизм PORTB &= ~(1 << LED_PIN);
Конечно тут можно послать изучать C и тому подобное, но всё же — почему именно так, а не по другому? Всё же статья носит обучающий характер. Спасибо.
Это такие почти стандартные конструкции по управлению и опросу портов :)

В конечном итоге это превращается в что-то типа
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
Посмотрите на platformio.org. Нет зависимостей по Arduino IDE, Makefiles или tool chains… Поведение одно и тоже в независимости от ОС (работает на всех популярных ОС). Есть Library Manager. Легко интегрируется в любимые IDE.

Для Вашего примера с «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.
Огромное спасибо за пост, спустя столько лет он очень полезен!

Как на плате Arduino uno настроить пошаговую отладку прошивки?

Sign up to leave a comment.

Articles