Настало время собрать и запустить на Galileo свой «Hello, world!» (и не только), изучив в процессе, как сделать это наиболее техничным образом.
Для создания программ для Intel Galileo можно вообще не пользоваться какими-либо средами разработки. В образе Yocto, который мы подготовили и установили в предыдущей части «практикума» – есть всё необходимое:
Поэтому приступим:
1. Подключаемся к нашей целевой системе через SSH (при этом по умолчанию текущая папка – /home/root/)
2. Запускаем текстовый редактор с создаваемым файлом:
3. Вводим следующий код:
Выходим (Ctrl+X) и подтверждаем сохранение.
4. Компилируем:
Если всё хорошо, то никаких сообщений об ошибках не будет.
5. Запустим приложение:
После этого встроенный светодиод на плате ожидаемо заморгает.
Приведённый выше код требует пояснений: для такого простого манипулирования пинами используется библиотека libmraa.
Как уже писалось ранее, это «велосипед», который изобрели в Intel для того, чтобы обеспечить максимально простой доступ до пинов, присутствующих на отладочных платформах Galileo (и Edison). Библиотека является «обёрткой» для конфигурирования и управления этими пинами.
Это максимально упрощает «вход» в разработку для «бывших ардуинщиков» или новичков. Библиотека libmraa позволяет сконфигурировать пины как GPIO, ADC, PWM, I2C, SPI и RS232. Очень помогает то, что библиотека хорошо документирована.
Это хорошо (для платформы Intel), но платформа Arduino ещё очень привлекательна для простых пользователей (особенно, новичков) тем, что существует огромное количество различных библиотек, реализующих максимально простое взаимодействие с различными датчиками/дисплеями/«исполнителями» и т.п. Intel решили предложить своё решение и в данном вопросе:
UPM работает поверх libmraa и ничего не знает о «железячной» составляющей платформы. Эта библиотека реализует логику работы с подключенными устройствами. К сожалению, список совместимых устройств, с которыми можно работать через UPM пока довольно скромен, но, уверен, что это временное явление.
Библиотека UPM тоже с открытым кодом – при желании можно разобраться и дописать поддержку недостающего устройства.
Но вернёмся непосредственно к процессу программирования. Писать код в консольном редакторе – удовольствие не самое большое и подходит только для «настоящих джедаев», большинство же разработчиков предпочитают использовать удобные инструменты разработки с подсвечиванием кода, автодополнением и прочими плюшками, и один из таких инструментов – Eclipse. Ребята из Intel позаботились и подготовили эту среду для работы с отладочными платами Galileo (и Edison).
Установка максимально упрощена для всех платформ – достаточно загрузить соответствующий файл с архивом преднастроенной среды разработки (включает в себя непосредственно Eclipse, библиотеки и примеры) и распаковать его в любое удобное место на диске.
Внешний вид среды разработки при первом запуске
Поскольку мы планируем вести разработку для Intel Galileo Gen2 – необходимо среде указать на это. Для этого нужно перейти на вкладку Remote System Explorer (в правом верхнем углу интерфейса Eclipse). Поскольку в Intel уже почти всё подготовили, в открывшемся дереве удалённых систем уже есть узел «galileo» – остаётся только указать IP-адрес целевой системы (как узнать IP-адрес Intel Galileo Gen2 описывал в предыдущей части «практикума»). После этого можно к узлу подключиться (контекстное меню на узле «galileo» –> «Connect»). Если всё сделано правильно, будет запрос пароля:
После успешного соединения с Intel Galileo Gen2 у каждого элемента узла «galileo» появятся зелёные «плюсики», показывающие, что всё в порядке и можно работать.
Дальше привычно делаем Build. Поскольку всё уже настроено – проект из примера «соберётся» без ошибок (смотрим сообщения в консоли снизу и там же – поглядываем в раздел «Problems»). Готово, запускаем проект (Run) – в нижней части видим данные с отладочной платы (как если бы приложение запускали непосредственно через консоль SSH):
Готово. Теперь можно поэкспериментировать с уже подготовленными примерами.
При изучении примеров, выяснилось, что версии библиотек, что входят в комплект Intel IoT Developer Kit (iotdk) несколько устарели и требуют обновления. Обновимся:
Обновление делается следующим образом:
Могу порекомендовать делать это регулярно, поскольку проект развивается.
Скачиваем свежие версии библиотек (с максимальными номерами) mraa и upm и просто разархивируем их в ту папку, где у вас установлена IDE. Естественно, нужно скачивать версию под свою платформу. Теперь у нас актуальные версии библиотек и среда разработки готова «в бой»!
Преднастроенный Eclipse с примерами просто великолепен, но ничего не сказано о том, как создать новый проект таким образом, чтобы он работал так же, как и примеры. Исправляю эту ситуацию.
Тут я немного лукавлю: я воспользуюсь одним из проектов, который подготовили ребята в Intel, поскольку создание проекта с нуля, вся его настройка для сборки и подготовка всех переменных окружений – очень хлопотное занятие.
За основу я возьму проект 3_c_onboard_LED_blink.
Первое, что необходимо сделать для успешного копирования проекта – надо закрыть все остальные проекты. Для этого правой клавишей мыши щелкаем на нужном проекте и в выпадающем меню выбираем «Close Unrelated Projects» (при этом папки в дереве проектов – «закроются»). После этого можно исходный проект подвергнуть процедуре Copy/Paste (можно через то же контекстное меню проекта) – появится диалоговое окно для ввода названия нового проекта:
Свой проект я назвал myTest. Исходный проект можно закрыть (чтобы не занимал место в дереве проектов). Если развернуть дерево нового проекта, то видно, что там остались все исходники и бинарники. Их можно удалить в любое время – они больше не нужны, а вот содержимое папки includes рекомендую оставить – оно является частью «магии», которая позволит собраться нашему проекту и заработать на Intel Galileo Gen2. Потом в эту папку можно будет добавить другие, недостающие для проекта библиотеки.
Удалил в проекте всё лишнее, и в папке src (не путайте с папкой Debug/src) создал новый файл-исходник (правой клавишей мыши на папке src и в выпадающем меню «New» –> «Source File»:
В новом файле напишем что-нибудь простое (можно взять, например, код blink, который я привёл в начале этого поста). «Билдим» проект: если всё хорошо – проект скомпилировался, в разделе «Problems» – пусто.
Остался всего один шаг до запуска готового приложения. Требуется объяснить Eclipse, что приложение надо запустить удалённо (а не локально). Для этого кликаем правой клавишей мыши на получившемся бинарнике (в дереве проекта) и в контекстном меню выбираем: «Run As» –> «Run Configurations…». Диалоговое окно выглядит примерно так:
Особое внимание обратите на разделы, отмеченные стрелочками. В верхнем необходимо выбрать наше целевое соединение (galileo). Два поля заполнить примерно так, как у меня на скриншоте. В первом поле указывается полный путь до приложения на целевом устройстве, во втором поле – команда, которая должна быть выполнена перед запуском нашего приложения (в моём случае скомпилированному файлу даются права на запуск). Дальше просто – Apply и Run. Если всё сделано правильно, светодиод на плате начнёт моргать. После этого уже можно пользоваться кнопкой Run на панели инструментов Eclipse.
Безусловно, программирование в Eclipse гораздо удобнее, чем в консоли (или в Arduino IDE), что делает платформу Intel очень привлекательной для разработчиков. Но не Eclipse-ом единым пользуется разработчик, есть ещё и Intel XDK.
Таким образом, Intel предоставляет максимальные возможности: отличная отладочная плата Intel Galileo Gen2, библиотеки, инструменты разработки и поддержку.
Но ведь и даже это ещё не всё! В следующей части «практикума»:
Пишите в комментариях, что вам в первую очередь интересно узнать про содержимое спойлера. Вы ведь заглянули? :)
P.S. В обсуждении первой части «практикума» были вопросы по поводу того, что несмотря на быстрый процессор у Intel Galileo Gen2 не слишком выдающиеся показатели при изменении состояния пина. Пока готовил этот материал наткнулся вот на эту страницу, где написано, что можно обеспечить частоту переключения аж до 2.9МГц (по сравнению с «базовыми» 385кГц), правда такие частоты доступны не для всех пинов – это связано с аппаратной реализацией.
» Первая часть «практикума»: Galileo Gen2 — Первое знакомство.
» Вторая часть «практикума»: Galileo Gen2 — Linux & Arduino.
Хардкор
Для создания программ для Intel Galileo можно вообще не пользоваться какими-либо средами разработки. В образе Yocto, который мы подготовили и установили в предыдущей части «практикума» – есть всё необходимое:
- Редактор
- Библиотеки
- Компилятор
Поэтому приступим:
1. Подключаемся к нашей целевой системе через SSH (при этом по умолчанию текущая папка – /home/root/)
2. Запускаем текстовый редактор с создаваемым файлом:
nano blink.cpp
3. Вводим следующий код:
#include "mraa.h"
int main() {
mraa_gpio_context gpio;
gpio = mraa_gpio_init(13);
mraa_gpio_dir(gpio, MRAA_GPIO_OUT);
bool ledState=true;
while(true){
mraa_gpio_write(gpio, ledState?1:0);
ledState=!ledState;
sleep(1);
}
}
Выходим (Ctrl+X) и подтверждаем сохранение.
4. Компилируем:
g++ blink.cpp -lmraa -o blink
Если всё хорошо, то никаких сообщений об ошибках не будет.
5. Запустим приложение:
./blink
После этого встроенный светодиод на плате ожидаемо заморгает.
Приведённый выше код требует пояснений: для такого простого манипулирования пинами используется библиотека libmraa.
Библиотека libmraa
Как уже писалось ранее, это «велосипед», который изобрели в Intel для того, чтобы обеспечить максимально простой доступ до пинов, присутствующих на отладочных платформах Galileo (и Edison). Библиотека является «обёрткой» для конфигурирования и управления этими пинами.
Поскольку библиотека с открытым кодом – можно просто подсмотреть, как же можно работать с соответствующими портами напрямую, без абстракций, предоставляемых libmraa.
Это максимально упрощает «вход» в разработку для «бывших ардуинщиков» или новичков. Библиотека libmraa позволяет сконфигурировать пины как GPIO, ADC, PWM, I2C, SPI и RS232. Очень помогает то, что библиотека хорошо документирована.
Это хорошо (для платформы Intel), но платформа Arduino ещё очень привлекательна для простых пользователей (особенно, новичков) тем, что существует огромное количество различных библиотек, реализующих максимально простое взаимодействие с различными датчиками/дисплеями/«исполнителями» и т.п. Intel решили предложить своё решение и в данном вопросе:
Библиотека UPM
UPM работает поверх libmraa и ничего не знает о «железячной» составляющей платформы. Эта библиотека реализует логику работы с подключенными устройствами. К сожалению, список совместимых устройств, с которыми можно работать через UPM пока довольно скромен, но, уверен, что это временное явление.
Библиотека UPM тоже с открытым кодом – при желании можно разобраться и дописать поддержку недостающего устройства.
Но вернёмся непосредственно к процессу программирования. Писать код в консольном редакторе – удовольствие не самое большое и подходит только для «настоящих джедаев», большинство же разработчиков предпочитают использовать удобные инструменты разработки с подсвечиванием кода, автодополнением и прочими плюшками, и один из таких инструментов – Eclipse. Ребята из Intel позаботились и подготовили эту среду для работы с отладочными платами Galileo (и Edison).
Установка и первый запуск
Установка максимально упрощена для всех платформ – достаточно загрузить соответствующий файл с архивом преднастроенной среды разработки (включает в себя непосредственно Eclipse, библиотеки и примеры) и распаковать его в любое удобное место на диске.
Внешний вид среды разработки при первом запуске
Поскольку мы планируем вести разработку для Intel Galileo Gen2 – необходимо среде указать на это. Для этого нужно перейти на вкладку Remote System Explorer (в правом верхнем углу интерфейса Eclipse). Поскольку в Intel уже почти всё подготовили, в открывшемся дереве удалённых систем уже есть узел «galileo» – остаётся только указать IP-адрес целевой системы (как узнать IP-адрес Intel Galileo Gen2 описывал в предыдущей части «практикума»). После этого можно к узлу подключиться (контекстное меню на узле «galileo» –> «Connect»). Если всё сделано правильно, будет запрос пароля:
После успешного соединения с Intel Galileo Gen2 у каждого элемента узла «galileo» появятся зелёные «плюсики», показывающие, что всё в порядке и можно работать.
Дальше привычно делаем Build. Поскольку всё уже настроено – проект из примера «соберётся» без ошибок (смотрим сообщения в консоли снизу и там же – поглядываем в раздел «Problems»). Готово, запускаем проект (Run) – в нижней части видим данные с отладочной платы (как если бы приложение запускали непосредственно через консоль SSH):
Готово. Теперь можно поэкспериментировать с уже подготовленными примерами.
Обновление libmraa и upm
При изучении примеров, выяснилось, что версии библиотек, что входят в комплект Intel IoT Developer Kit (iotdk) несколько устарели и требуют обновления. Обновимся:
На Intel Galileo Gen2
Обновление делается следующим образом:
echo "src maa-upm http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf
opkg update
opkg upgrade
Могу порекомендовать делать это регулярно, поскольку проект развивается.
На настольном ПК
Скачиваем свежие версии библиотек (с максимальными номерами) mraa и upm и просто разархивируем их в ту папку, где у вас установлена IDE. Естественно, нужно скачивать версию под свою платформу. Теперь у нас актуальные версии библиотек и среда разработки готова «в бой»!
Преднастроенный Eclipse с примерами просто великолепен, но ничего не сказано о том, как создать новый проект таким образом, чтобы он работал так же, как и примеры. Исправляю эту ситуацию.
Создание нового проекта
Тут я немного лукавлю: я воспользуюсь одним из проектов, который подготовили ребята в Intel, поскольку создание проекта с нуля, вся его настройка для сборки и подготовка всех переменных окружений – очень хлопотное занятие.
Естественно, можно создать и проект заново, предварительно «срисовав» все параметры «примерного» проекта, но это более сложный путь (хотя, возможно, и более правильный). Я же пойду по простому и быстровоспроизводимому пути с гарантированным результатом и минимальными возможностями для ошибки.
За основу я возьму проект 3_c_onboard_LED_blink.
Первое, что необходимо сделать для успешного копирования проекта – надо закрыть все остальные проекты. Для этого правой клавишей мыши щелкаем на нужном проекте и в выпадающем меню выбираем «Close Unrelated Projects» (при этом папки в дереве проектов – «закроются»). После этого можно исходный проект подвергнуть процедуре Copy/Paste (можно через то же контекстное меню проекта) – появится диалоговое окно для ввода названия нового проекта:
Свой проект я назвал myTest. Исходный проект можно закрыть (чтобы не занимал место в дереве проектов). Если развернуть дерево нового проекта, то видно, что там остались все исходники и бинарники. Их можно удалить в любое время – они больше не нужны, а вот содержимое папки includes рекомендую оставить – оно является частью «магии», которая позволит собраться нашему проекту и заработать на Intel Galileo Gen2. Потом в эту папку можно будет добавить другие, недостающие для проекта библиотеки.
Удалил в проекте всё лишнее, и в папке src (не путайте с папкой Debug/src) создал новый файл-исходник (правой клавишей мыши на папке src и в выпадающем меню «New» –> «Source File»:
В новом файле напишем что-нибудь простое (можно взять, например, код blink, который я привёл в начале этого поста). «Билдим» проект: если всё хорошо – проект скомпилировался, в разделе «Problems» – пусто.
Остался всего один шаг до запуска готового приложения. Требуется объяснить Eclipse, что приложение надо запустить удалённо (а не локально). Для этого кликаем правой клавишей мыши на получившемся бинарнике (в дереве проекта) и в контекстном меню выбираем: «Run As» –> «Run Configurations…». Диалоговое окно выглядит примерно так:
Особое внимание обратите на разделы, отмеченные стрелочками. В верхнем необходимо выбрать наше целевое соединение (galileo). Два поля заполнить примерно так, как у меня на скриншоте. В первом поле указывается полный путь до приложения на целевом устройстве, во втором поле – команда, которая должна быть выполнена перед запуском нашего приложения (в моём случае скомпилированному файлу даются права на запуск). Дальше просто – Apply и Run. Если всё сделано правильно, светодиод на плате начнёт моргать. После этого уже можно пользоваться кнопкой Run на панели инструментов Eclipse.
Безусловно, программирование в Eclipse гораздо удобнее, чем в консоли (или в Arduino IDE), что делает платформу Intel очень привлекательной для разработчиков. Но не Eclipse-ом единым пользуется разработчик, есть ещё и Intel XDK.
ИМХО
Таким образом, Intel предоставляет максимальные возможности: отличная отладочная плата Intel Galileo Gen2, библиотеки, инструменты разработки и поддержку.
Но ведь и даже это ещё не всё! В следующей части «практикума»:
Внимание, спойлер!
Пишите в комментариях, что вам в первую очередь интересно узнать про содержимое спойлера. Вы ведь заглянули? :)
P.S. В обсуждении первой части «практикума» были вопросы по поводу того, что несмотря на быстрый процессор у Intel Galileo Gen2 не слишком выдающиеся показатели при изменении состояния пина. Пока готовил этот материал наткнулся вот на эту страницу, где написано, что можно обеспечить частоту переключения аж до 2.9МГц (по сравнению с «базовыми» 385кГц), правда такие частоты доступны не для всех пинов – это связано с аппаратной реализацией.
» Первая часть «практикума»: Galileo Gen2 — Первое знакомство.
» Вторая часть «практикума»: Galileo Gen2 — Linux & Arduino.