Лабораторная работа 3. Проект ev3dev, ускорение разработки ПО.

Информация

Проект ev3dev позволяет вести разработку ПО непосредственно на контроллере ev3, однако из-за малой мощности контроллера, такой подход обладает рядом недостатков:
  1. Низкая скорость первоначального открытия сессии по ssh и как следствие - низкая скорость обмена файлами.
  2. Низкая скорость компиляции программ.

Первую проблему можно решить несколькими способами: с помощью механизма повторного использования соединения ssh, либо ускорения обмена файлами настройкой сервера nfs или samba на контроллере и т.п.

Вторая проблема решается средствами кросскомпиляции.

Задание 1

Используя документацию http://www.ev3dev.org/docs/tutorials/reusing-ssh-connections/, настроить механизм повторного использования соединения ssh в виртуальной машине Linux. Выполнить первичное подключение к контроллеру, оценить скорость вторичных подключений. Определить возникающие проблемы при закрытии первичного соединения.

Задание 2

Под целевой платформой будем в дальнейшем понимать контроллер EV3.

Под хостовой платформой будем в дальнейшем понимать машину с ОС ALt Linux 8 (реальную или виртуальную), к которой подключен контроллер EV3.

Настройка кросскомпиляции для любых систем обеспечивается:

  1. Наличием на хостовой платформе кросс-компилятора языка программирования, умеющего создавать бинарные/объектные файлы для целевой платформы.
  2. Наличием на хостовой платформе библиотек/модулей языка программирования, скомпилированных кросс-компилятором в формат целевой платформы.
  3. Наличием на хостовой платформе утилит кросс-сборки, в том числе - кросс-ассемблера, кросс-сборщика и т.п.
  4. Наличием на хостовой платформе системных библиотек целевой платформы, доступных для утилит кросс-сборки.

При выполнении указанных условий и корректной настройки всех компонентов во взаимосвязи друг с другом, появляется возможность, находясь на хостовой платформе, создавать средствами кросс-компиляции бинарные файлы для целевой платформы. Настройка кросскомпиляции для FreePascal "с нуля" достаточно подробно описана в документе http://wiki.lazarus.freepascal.org/Setup_Cross_Compile_For_ARM. Дистрибутив ALt Linux 8 содержит несколько готовых решений, позволяющих сократить процесс настройки.

Для обеспечения кросскомпиляции на яп FreePascal, выполнить следующий набор действий на хостовой платформе:

  1. Установить пакет Lazarus, что позволит совместно со средой программирования получить компилятор и его исходные коды.
  2. Установить пакет binutils-arm-linux-gnu, который содержит утилиты кросс-сборки для ARM.
  3. Создать кросс-компилятор для целевой платформы 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, скомпилированных для целевой платформы.

  4. Создать набор символических ссылок на кросс-ассемблер, кросс-сборщик (кросс-линкер) и кросс-компилятор в каталоге приложений. Кросс-ассемблер и кросс-сборщик по требованиям 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
    
  5. Скопировать на хостовую платформу системные библиотеки целевой платформы. Для этого следует создать на хостовой машине отдельный каталог, например /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 года. Исправление "битых" ссылок в этом наборе следует провести самостоятельно.
  6. Подготовить в домашнем каталоге пользователя конфигурационный файл .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 не теряется возможность создавать программы и для хостовой платформы.
  7. Создать программу-приветствие hello.pp на freepascal, скомпилировать ее для контроллера EV3 одной из следующих команд:
    fpc -Parm hello.pp
    или
    ppcarm hello.pp
    
    Убедится в невозможности запуска программы на хостовой платформе. Скопировать полученный исполняемый файл с помощью scp на контроллер EV3 и запустить его в ssh-сессии. Скомпилировать эту-же программу для хостовой платформы и запустить ее. Убедиться в невозможности ее запуска на контроллере EV3.
  8. Для автоматизации разработки ПО для EV3 с использованием кросскомпиляции следует использовать RAD Lazarus следующим образом: