суббота, 27 октября 2018 г.

Мультитаргет в platformio

Заметка будуЮщему себе (я то точно знаю, что разобравшись сейчас через 2 недели я не буду помнить ни-фи-га)

Итак, я сделал проект в platformio, для esp8266, все более-менее работает; плату выбрал не потому, что нужно было, а потому, что была; и вот теперь хочется сделать "финальный" вариант железки, для которой вполне достаточно "обычной" ардуины, которую как раз китайская + укр почты привезли. Вариант "в лоб" очень уж мне не нравится - сделать еще один проект, перенести туда все файлы и код, поправить код, ну фигня же - в конце концов синьор я программист или так, с улицы зашел? :)

Поэтому мне нужно как-то сделать так, чтобы с минимальными изменениями работающий код работал на другой железке.

Шаг 1: в существующий проект надо как-то добавить новую плату. Делается это не то, чтоб очевидно, но просто: делаем новый проект, выбираем в списке нужную плату, даем ему имя существующего уже проекта и сохраняем в папку, в которой лежит сужествующий проект; и все, ide достаточно сообразительное, чтобы подокачивать если нужно файлы нехватающие и добавить в настройку проекта новый "таргет"; настройки хранятся в файле platformio.ini в папке с проектом и после всего там появляется что-то типа:

[env:esp8285]
platform = espressif8266
board = esp8285
framework = arduino

[env:nanoatmega328]
platform = atmelavr
board = nanoatmega328
framework = arduino

Шаг 2: если сейчас запустить сборку, то соберуться оба таргета, что очевидно не совсем то, что нужно. А нужно как-то переключаться между ними - так как делать это скорее всего придется совсем редко, я не углублялся в гугление и остановился на следующем: в тот же platformio.ini добавляется еще одна секция:

[platformio]
#env_default = esp8285
env_default = nanoatmega328

Раскоментиваем нужный таргет - вуаля, теперь собирается и заливается именно он. Но железо то скорее всего немного, но разное, поэтому

Шаг 3: секции с описанием таргетов модифицируются вот так:

[env:esp8285]
platform = espressif8266
build_flags = -D TARGET_ESP8266
board = esp8285
framework = arduino

[env:nanoatmega328]
platform = atmelavr
build_flags = -D TARGET_AVR -D DEBUG
board = nanoatmega328
framework = arduino

теперь в коде можно использовать директивы компилятора, по которым можно отличать - какая плата сейчас используется (ну или вон отладку включить), что-то типа такого (причем получилось вообще хорошо, в одном месте вся инициализация железячная):


#ifdef TARGET_ESP8266
static const int audioAlarmPin = 14; // D5
static const int buttonPin = 16;
#warning BUILDING for esp
#endif

#ifdef TARGET_AVR
static const int audioAlarmPin = 12;
static const int buttonPin = 4;
#warning BUILDING for avr
#endif

и это все

Надеюсь это мне пригодится когда-нибудь еще :)

Комментариев нет:

Отправить комментарий