Pull to refresh

Comments 27

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

Если стоит задача уложиться в 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 landed and left these words here
clion пока поддерживает только cmake.

В принципе, ничего не мешает сделать сборку под avr на cmake, по аналогии с stm32, например.
Занимался чем-то подобным с 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.
Огромное спасибо за пост, спустя столько лет он очень полезен!
Only those users with full accounts are able to leave comments. Log in, please.