Лабораторная работа 3. Проект ev3dev, ускорение разработки ПО.
Информация
Проект ev3dev позволяет вести разработку ПО непосредственно на контроллере ev3, однако из-за малой мощности контроллера,
такой подход обладает рядом недостатков:
- Низкая скорость первоначального открытия сессии по ssh и как следствие - низкая скорость обмена файлами.
- Низкая скорость компиляции программ.
Первую проблему можно решить несколькими способами: с помощью механизма повторного использования соединения ssh, либо ускорения
обмена файлами настройкой сервера nfs или samba на контроллере и т.п.
Вторая проблема решается средствами кросскомпиляции.
Задание 1
Используя документацию http://www.ev3dev.org/docs/tutorials/reusing-ssh-connections/, настроить механизм повторного использования
соединения ssh в виртуальной машине Linux. Выполнить первичное подключение к контроллеру, оценить скорость вторичных подключений. Определить
возникающие проблемы при закрытии первичного соединения.
Задание 2
Под целевой платформой будем в дальнейшем понимать контроллер EV3.
Под хостовой платформой будем в дальнейшем понимать машину с ОС ALt Linux 8 (реальную или виртуальную), к которой подключен контроллер EV3.
Настройка кросскомпиляции для любых систем обеспечивается:
- Наличием на хостовой платформе кросс-компилятора языка программирования, умеющего создавать бинарные/объектные файлы для целевой платформы.
- Наличием на хостовой платформе библиотек/модулей языка программирования, скомпилированных кросс-компилятором в формат целевой платформы.
- Наличием на хостовой платформе утилит кросс-сборки, в том числе - кросс-ассемблера, кросс-сборщика и т.п.
- Наличием на хостовой платформе системных библиотек целевой платформы, доступных для утилит кросс-сборки.
При выполнении указанных условий и корректной настройки всех компонентов во взаимосвязи друг с другом, появляется
возможность, находясь на хостовой платформе, создавать средствами кросс-компиляции бинарные файлы для целевой платформы.
Настройка кросскомпиляции для FreePascal "с нуля" достаточно подробно описана в документе http://wiki.lazarus.freepascal.org/Setup_Cross_Compile_For_ARM.
Дистрибутив ALt Linux 8 содержит несколько готовых решений, позволяющих сократить процесс настройки.
Для обеспечения кросскомпиляции на яп FreePascal, выполнить следующий набор действий на хостовой платформе:
- Установить пакет Lazarus, что позволит совместно со средой программирования получить компилятор и его исходные коды.
- Установить пакет binutils-arm-linux-gnu, который содержит утилиты кросс-сборки для ARM.
- Создать кросс-компилятор для целевой платформы ARM, скомпилировав freepascal из исходных кодов. Для этого под рутовой учетной записью
перейти в каталог исходного кода freepascal /usr/share/fpcsrc/ и выполнить там следующую команду:
make crossinstall CPU_TARGET=arm OS_TARGET=linux CROSSBINDIR=/usr/lib/arm-linux-gnueabi/bin/ OPT=-dFPC_ARMEL INSTALL_PREFIX=/usr
Параметр CPU_TARGET указывает на целевой микропроцессор, OS_TARGET - на целевую операционную систему, CROSSBINDIR - на местонахождение утилит
кросс-сборки (установлены пакетом binutils-arm-linux-gnu), OPT=-dFPC_ARMEL - на версию целевого микропроцессора, INSTALL_PREFIX - на место инсталляции созданного кросс-компилятора.
По окончании сборки кросс-компилятора в каталоге /usr/lib/fpc/версия_компилятора/ будет создан исполняемый файл ppcrossarm и набор модулей freepascal,
скомпилированных для целевой платформы.
- Создать набор символических ссылок на кросс-ассемблер, кросс-сборщик (кросс-линкер) и кросс-компилятор в каталоге приложений.
Кросс-ассемблер
и кросс-сборщик по требованиям freepascal должны иметь префикс "целевой_микропроцессор-целевая_ОС-", т.е. в нашем случае arm-linux-.
Кросс-компилятор должен начинаться на "ppc" и иметь суффикс "целевой_микропроцессор",т.е. в нашем случае ppcarm.
Конечный результат может выглядеть так:
~/bin/ppcarm -> /usr/lib/fpc/версия_компилятора/ppcrossarm
~/bin/arm-linux-as -> /usr/lib/arm-linux-gnueabi/bin/as
~/bin/arm-linux-ld -> /usr/lib/arm-linux-gnueabi/bin/ld
~/bin/arm-linux-ld.bfd -> /usr/lib/arm-linux-gnueabi/bin/ld.bfd
- Скопировать на хостовую платформу системные библиотеки целевой платформы. Для этого следует создать на хостовой машине отдельный
каталог, например /opt/ev3libs/, и скопировать туда содержимое каталогов /lib/arm-linux-gnueabi,
/usr/lib/arm-linux-gnueabi и /usr/lib/gcc/arm-linux-gnueabi с
сохранением структуры каталогов и правкой "битых ссылок", которые появляются в основном из-за абсолютной адресации. Например,
на целевой платформе ссылка /usr/lib/arm-linux-gnueabi/libdl.so адресует библиотеку /lib/arm-linux-gnueabi/libdl.so.
Однако на хостовой платформе в указанном местоположении той библиотеки нет, что превращает ссылку /usr/lib/arm-linux-gnueabi/libdl.so в "битую".
Следует ее исправить, перенаправив на библиотеку ../../../lib/arm-linux-gnueabi/libdl.so. Подобные действия следует выполнить со всеми "битыми" ссылками.
Скорее всего, при компиляции программы понабится очень небольшое количество библиотек целевой платформы (libc, libdl и некоторые другие), однако невозможно сказать заранее
- какие, что принуждает копировать полный набор библиотек. Для ускорения работы можно воспользоваться архивом по адресу
http://xdsl.shgpi.edu.ru/web/_/img/ev3libs.tar.gz,
который содержит требуемый набор каталогов, созданный на основе дистрибутива ev3dev, обновленного 1 декабря 2017 года. Исправление "битых" ссылок
в этом наборе следует провести самостоятельно.
- Подготовить в домашнем каталоге пользователя конфигурационный файл .fpc.cfg со следующим содержимым:
#INCLUDE /etc/fpc.cfg
#IFDEF CPUARM
# отключение загрузки системных библиотек хостовой платформы
-Xd
# кроссбиблиотеки фрипаскаля
-Fu/usr/lib/fpc/версия_компилятора/units/arm-linux/*
-Fl/usr/lib/fpc/версия_компилятора/units/arm-linux/rtl
# нужные кроссбиблиотеки целевой машины; копия, взятая с целевой машины
-Fu/opt/ev3libs/lib/arm-linux-gnueabi
-Fu/opt/ev3libs/lib/arm-linux-gnueabi/*
-Fu/opt/ev3libs/usr/lib/arm-linux-gnueabi
-Fu/opt/ev3libs/usr/lib/arm-linux-gnueabi/*
-Fu/opt/ev3libs/usr/lib/gcc/arm-linux-gnueabi/*
# корень системы для кросс-сборщика
-k--sysroot=/opt/ev3libs
# пути для поиска с передачей кросс-сборщику
-Xr/opt/ev3libs/lib/arm-linux-gnueabi:/opt/ev3libs/usr/lib/arm-linux-gnueabi:/opt/ev3libs/usr/lib/gcc/arm-linux-gnueabi
#ENDIF
Данный конфигурационный файл содержит директивы кросс-компилятору и кросс-сборщику, позволяющие корректно подготовить программу для контроллера
EV3. Благодаря подключению штатного конфигурационного файла и директиве #IFDEF CPUARM не теряется возможность создавать программы и для хостовой платформы.
- Создать программу-приветствие hello.pp на freepascal, скомпилировать ее для контроллера EV3 одной из следующих команд:
fpc -Parm hello.pp
или
ppcarm hello.pp
Убедится в невозможности запуска программы на хостовой платформе.
Скопировать полученный исполняемый файл с помощью scp на контроллер EV3 и запустить его в ssh-сессии.
Скомпилировать эту-же программу для хостовой платформы и запустить ее. Убедиться в невозможности ее запуска на контроллере EV3.
- Для автоматизации разработки ПО для EV3 с использованием кросскомпиляции следует использовать RAD Lazarus следующим образом:
- Создать скрипт ~/bin/ev3run для копирования исполняемого файла на целевую платформу и его запуска там. Содержимое скрипта доступно здесь:
http://xdsl.shgpi.edu.ru/web/_/img/ev3run.
- Запустить среду Lazarus и создать простейший консольный проект: Проект/Создать проект/Простая программа
- Указать целевую платформу: Проект/Параметры проекта/Параметры компилятора/Настройка и целевая платформа/Целевое семейство процессоров = arm
- Отключить отладчик: Сервис/Параметры/Отладчик/Тип отладчика = (none)
- Указать запуск скомпилированного приложения с помощью скрипта ev3run: Запуск/Параметры запуска/Использовать приложение для запуска = /bin/bash ev3run $(TargetCmdLine)
- Создать простейшую программу-приветствие, скомпилировать и запустить ее, убедиться в корректности функционирования программы на EV3
- Сохранить полученный проект с тем, чтобы в дальнейшем использовать его в качестве шаблона.