Кросс – компиляция для Raspberry Pi

Не так давно случилось событие, которое вернуло мой интерес к малютке Raspberry Pi. Были открыты спецификации чипа GPU, в результате чего была реализована идея выполнить быстрое преобразование Фурье (FFT) на видеопроцессоре. В результате народ написал тестовый код, и быстродействие по сравнению с выполнением на ARM возросло в 10 раз. Очень даже неплохо! Для тестирования 2D FFT, что нужно для функции неопределенности, я решил заранее подготовиться и оборудовать рабочее место. Об этом данный пост.

Donwload

Для загрузки берем минимальный дистрибутив Raspibian Jessie Lite, что означает что мы добровольно отказываемся от графики на RPi. Да и зачем она нужна?

Дальше все по инструкции, распаковываем образ и копируем его на SD карту.

Я сразу сделал еще одну вещь: вызвал GParted  и раздвинул второй раздел до конца флешки. Если этого не сделать, моя 16 Гб SD карта выглядела как маленькая 2-х гигабайтная.

Поскольку я использую с RPi WiFi свисток, или донгл, пока еще SD карта в компьютере, сразу настроим беспроводную сеть в файле /etc/wpa_supplicant/wpa_supplicant.conf

Мы не будем подключать к RPi клавиатуру и монитор: работаем только удаленно. Можно было бы уже извлечь SD и воткнуть ее в RPi. Несмотря на то, что сеть поднимется, нас ждет засада: сейчас по умолчанию ssh на плате не работает, поэтому к ней не доступиться.

Поэтому не будем торопиться и выполняем workaround: создаем в разделе boot пустой файл ssh. Это сигнал загрузчику, что нужно запустить сервер ssh при загрузке.

Теперь отмонтируем карту, вставляем в RPi, включаем питание и заходим по ssh. IP адрес или имя можно найти на WiFi маршрутизаторе.

Следующие шаги

Быстро пробежимся по тому что надо сделать сразу на будущее.

1. Чтобы не вводить каждый раз пароль для ssh:
ssh-copy-id pi@raspberry.local

2. raspi-config: устанавливаем локаль, часовой пояс, включаем ssh на постоянно.

3. apt-get update, apt-get upgrade: обновляем систему, при этом подтянется firmware. Теперь уже не обязательно запускать rpi-update как раньше.

4. Ставим apt-get install vim, делаем его удобоваримым корректируя /etc/vim/vimrc:

5. Позаботимся о Питоне:

Пока все. Дальше, чтобы каждый раз не ждать сборки проекта на RPi (все будет очень медленно) и не мучить флешку, настроим кросс – компиляцию. Компилировать будем на моей машине под Ubuntu. Чтобы не гонять файлы на RPi и обратно, поднимем каталог под NFS и сделаем его доступным со стороны RPi по сети. Тогда вся работа, а именно редактирование и сборка перемещаются на хост машину. Запускать надо будет только на самой RPi.

Поднимаем NFS

Делаем на host – компьютере, т.е. на моей машине под Ubuntu:

Добавляем в /etc/exports строчку

Здесь /home/user/rpi/public это директория, которую мы открываем для внешнего доступа. В этой директории и будем дальше копаться с кросс – компиляцией.

Перезапускаем NFS подсистему /etc/init.d/nfs-kernel-server reload. Как видите, я со стартовыми скриптами по старинке. NFS сервер готов.

Делаем на target – компьютере, т.е. на Raspberry Pi:

Добавляем в /etc/fstab строчку

Здесь:

  • myhost.local: имя хост – компьютера, который у нас под Ubuntu;
  • /home/user/rpi/public: директория на хост – компьютере, которую мы будем видеть, само собой она должна быть точно такой же, как прописано на host компьютере;
  • /home/pi/cross: директория на RPi, которую надо создать.

Теперь все что мы будем творить на хост машине в директории /home/user/rpi/public, будет видно на целевой машине – RPi в директории /home/pi/cross. Сразу уточню для ясности: если отключить хост – машину, то директорая /home/pi/cross на целевой машине окажется пустой.

Перегружаем RPi, чтобы произошло автоматическое монтирование этой директории.

Кросс – компиляция

Для кросс – компиляции нужен компилятор, который будет создавать исполняемые файлы в формате архитектуры armhf (процессор ARM, реализация плавающей запятой – аппаратная). И не только компилятор: компоновщик, архиватор библиотек и прочие инструменты.

Кроме этого, нужна специальная ветка h – файлов и библиотек, также заточенная под armhf – так называемый toolchain. Вручную ворочать этими ветками с длинными названиями тяжело, поэтому пойдем простым путем. Не помню откуда, но у меня на хост – компе живет директория arm-bcm2708. Это как раз инструменты для RPi, которые я скачал в незапамятные времена. Из под этой директории отрастают ветки, в которых и будет копаться компилятор – ему виднее, где что лежит. Все инструменты и toolchain там уже есть. Надо только грамотно подключить все это к нашему проекту.

Для этого берем и делаем унифицированный makefile:

Все, что вам нужно поправить под себя в этом файле – это первая строчка. В результате делаем make – и скомпилируется программа hello, состоящая из исходников hello.c и hello.h.

После сборки hello тут же появится в директории /home/pi/cross.

Проверяем, что это такое:

Как раз то что нужно!

Еще раз, чтобы не путаться: редактируем файлы и делаем make на host машине (ради этого все и затевалось с кросс – компиляцией и доступом по NFS), запускаем – на target машине. Если вы попытаетесь запустить исполняемый файл архитектуры ARM на Intel машине, получите сообщение об ошибке:

Рабочее место мы создали, теперь будем двигаться в сторону GPU FFT …

 

 

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">