разработка и программирование электронных устройств

Программирование Raspberry Pi 3 : Кросс-компиляция C/C++ программ в Eclipse под Windows

Вычислительных возможностей платы Raspberry Pi 3(далее по тексту Rpi3) более чем достаточно для разработки программ сразу в целевой системе. Однако процесс разработки можно ускорить и сделать более комфортным, если разрабатывать программное обеспечение для Rpi3 на своем персональном компьютере.

В данной статье я собираюсь описать процесс настройки кросс-компиляции в Eclipse под Windows. Также будет описана настройка Eclipse для работы с удаленной системой Raspbian на Rpi3.

Если вы впервые сталкиваетесь с Eclipse, то установить последнюю версию можно по ссылке Eclipse CDT.
Виртуальную машину Java, необходимую для работы Eclipse, можно загрузить по ссылке JRE.

После установки указанных выше компонентов интегрированная среда разработки Eclipse CDT сможет быть запущена на вашем компьютере. В качестве вспомогательных утилит будем использовать msys из пакета MinGW, поэтому необходимо также загрузить MinGW.

Осталось установить инструментальные средства для кросс-компиляции программ.
Для этого необходимо их загрузить по следующей ссылке toolchain .
На указанном сайте также имеется инструкция на английском языке по установке инструментария tutorial.

После установки инструментария в указанном вами каталоге будут находится также дополнительные утилиты в подкаталоге TOOLS :

  • WinFlashTool – утилита для записи образа операционной системы Rpi3 на карту памяти.
  • SmarTTY – консольный SSH – клиент , позволяющий установить соединение с платой по протоколу SSH. Помимо стандартных функций имеет возможность загрузки файлов на плату из меню утилиты.
  • UpdateSysroot – командный файл Windows , запускающий процесс синхронизации файловой системы sysroot платы и инструментария.

Если вы только что приобрели плату Rpi3 и еще не успели установить операционную систему на карту памяти, то утилита WinFlashTool поможет вам это сделать.
Необходимо загрузить с официального источника образ операционной системы Raspbian.
Дальше распакуйте загруженный образ, установите карту памяти в кард-ридер и запишите на нее с помощью WinFlashTool образ операционной системы.

Настройка беспроводной сети WLAN на плате RPi3 описана в моей предыдущей статье.

С помощью утилиты SmarTTY установите соединение с платой. Это необходимо для исключения проблем во время настройки удаленного соединения в Eclipse.
Создайте новое соединение, указав IP -адрес платы, логин и пароль для входа (значения по-умолчанию для логина и пароля pi и raspberry соответственно).


Теперь нужно провести синхронизацию файловой системы sysroot. Для чего это нужно?
Представьте ситуацию, когда вы установили самую последнюю версию образа Raspbian и не выполнили синхронизацию.
В новой версии были добавлены или изменены заголовочные файлы и файлы библиотек. Работая с кросс-компилятором вы используете старые, не идентичные с последней версией системы, заголовочные и библиотечные файлы из каталога sysroot. Поэтому нет никакой гарантии, что успешно собранная на компьютере программа будет работать внутри платы RPi3.
Запускаем скрипт UpdateSysroot на выполнение и наблюдаем за обновлением файлов на компьютере (это может занять несколько десятков минут).

Настало время настроить удаленное соединение с платой Rpi3 в Eclipse . Запускаем Eclipse CDT , выбираем в главном меню пункт Window->Show View->Other… В открывшемся окне выбираем «remote systems».

После этого в нижней части экрана появиться новая вкладка «Remote Systems». В этой вкладке необходимо определить новое соединение, нажав на первую кнопку справа.

В открывшемся окне выбираем тип соединения «Linux».

После проделанных манипуляций в закладке «Remote Systems» появится новое соединение, которое имеет подразделы:

  • Sftp Files – в этом разделе можно просматривать содержимое удаленной файловой системы. Также возможно выполнять копирование файлов с помощью перетаскивания (Drag and Drop) из локального проекта на удаленную машину и обратно.
  • Shell Processes – раздел позволяет просмотреть запущенные на удаленной машине процессы.
  • Ssh Shells – в этом разделе можно открыть новый SSH -терминал и вводить команды прямо из Eclipse. Надобность в отдельной утилите при этом отпадает.




Таким образом с помощью закладки «Remote Systems» мы сможем копировать собранные на компьютере программы в файловую систему Rpi3 , запускать их на выполнение через Ssh Shells и удалять ненужный процесс в разделе Shell Processes .
Настало время создать новый проект в Eclipse и написать простую демонстрационную программу.
Создаем новый проект из главного меню File->New->C Project.

Для сборки я использую собственный Makefile, поэтому тип проекта нужно выбрать Makefile project->Empty Project

Далее вы можете просто скопировать мой Makefile в буфер клавиатуры (Ctrl+C) и вставить его в пустой проект Rpi3_Project (Ctrl+V).

Открыв Makefile в первой его строке после комментария вы увидите список используемых целей :

.PHONY: test project all clean

  • test – проверяет установлен ли в системе кросс-компилятор arm-linux-gnueabi-gcc и утилита make.
  • project — создает структуру каталогов внутри проекта.
  • all — производит сборку проекта.
  • clean — производит очистку проекта от временных файлов(в том числе исполняемого).

Теперь нужно убедиться в наличии инструментальных средств. Для этого необходимо выполнить команду make test.
Но сначала нужно добавить все четыре цели в закладку Make Target в правой части экрана.

Двойным щелчком мыши по цели test запускаем ее на исполнение и видим в окне Console примерно следующее :

Если сообщение не было выведено в консоль не смотря на то, что инструментарии arm-linux-gnueabihf и MinGW были ранее установлены, то это может означать только то, что не прописаны пути к инструментам в системной переменной Path . Необходимо добавить в Path путь к каталогу MinGW/msys/1.0/bin и каталогу bin пакета arm-linux-gnueabihf.

Теперь создадим структуру каталогов внутри проекта двойным щелчком на цели project (make project).

Makefile организован таким образом, что для компиляции исходных файлов их названия должны быть добавлены в переменную SRC, все остальные исходники не будут компилироваться даже если они расположены внутри каталога /src.

Структура каталогов проекта такова :

  • bin – каталог , содержащий исполняемый файл после сборки.
  • Debug – каталог с отладочной версией программы, которая не содержит оптимизации кода и содержит отладочную информацию.
  • Release – каталог с финальной версией программы, которая содержит оптимизированный код и не содержит отладочной информации.
  • inc – каталог для заголовочных файлов.
  • obj – содержит временные файлы сборки проекта, имеет подкаталоги Debug и Release.
  • src – исходные файлы проекта.

С помощью данного Makefile можно компилировать исходные файлы, написанные на таких языках программирования как C , C++, Assembler. При этом можно использовать все доступные языки программирования для создания одной программы.

В каталоге /src создадим новый исходный файл main.c, добавим в него следующие строки :

Проверим, чтобы переменная SRC содержала название исходного файла main.c .
Дальше выполним сборку проекта, запустив цель all .
Теперь можно скопировать полученный исполняемый файл в домашний каталог на целевой плате используя перетаскивание файла мышью.

Сделаем правый клик мышью на разделе Ssh Shells для открытия контекстного меню, в котором необходимо выбрать Launch Shell . Откроется новая вкладка Remote Shell , в поле Command которой можно вводить команды оболочки.

Установим права доступа для скопированного файла Rpi3_Project с помощью команды :

Далее запустим созданную нами программу на выполнение :

Эту же простейшую программу можно написать на языке C++ , текст программы сохранить в файле prog.cpp.

В Makefile не забудьте закомментировать запись SRC := main.c и добавить вместо нее SRC := prog.cpp .

Такая простая программа, как у нас, не нуждается в отладке. Для нахождения проблем в реальных программах можно воспользоваться удаленной отладкой.
Работает отладка просто : на целевой плате запускается GDB -сервер , а на стороне среды разработки в работу вступает GDB -клиент.
Настроим отладку в Eclipse, для этого в настройках отладчика выбираем пункт «Debug Configuration».

Далее создаем новую конфигурацию отладки в разделе «C/C++ Remote Application» окна «Debug Configuration» и настраиваем все так, как показано на следующем рисунке.

В графе “Connection” установите IP -адрес своей платы Rpi3 .
Во вкладке “Debugger” установите все согласно следующим рисункам :



Нажимаем на кнопку “Debug” и запускаем процесс отладки :

На этом пока все, всем спасибо за внимание !

Viewed 40794 times by 4365 viewers

21 Comments to Программирование Raspberry Pi 3 : Кросс-компиляция C/C++ программ в Eclipse под Windows

  1. NerZul's Gravatar NerZul
    9 мая 2017 at 18:18 | Permalink

    Здравствуйте!
    Не могу разобраться:
    «Теперь нужно убедиться в наличии инструментальных средств. Для этого необходимо выполнить команду make test.
    Но сначала нужно добавить все четыре цели в закладку Make Target в правой части экрана.»

    О каких четырех целях идет речь? Я создал только одну как на скриншоте.

  2. Alexandr's Gravatar Alexandr
    20 июля 2017 at 12:37 | Permalink

    Подскажите пожалуйста, при запуске цели all получаю ошибку: «make: *** No rule to make target obj/Debug/main.o', needed by bin/Debug/RPi3_Project’. Stop.»

    Никак не могу победить. Подскажите плиз хот в какую сторону смотреть?

  3. MAXX's Gravatar MAXX
    12 октября 2018 at 2:17 | Permalink

    Здравствуйте!
    При запуске «make all» получил ошибку описанную выше: «make: *** No rule to make target obj/Debug/main.o', needed by bin/Debug/rpi_test’. Stop.»
    Попытка сборки в командной строке выдает точно такое же сообщение.
    Все остальные цели выполняются без ошибок.
    Прошу помочь в поиске ошибки.

  4. MAXX's Gravatar MAXX
    13 октября 2018 at 23:00 | Permalink

    Проект отправил

  5. MAXX's Gravatar MAXX
    14 октября 2018 at 17:04 | Permalink

    Вот «выхлоп» make test
    «——————— BEGIN ————————»
    arm-linux-gnueabihf-gcc —version
    arm-linux-gnueabihf-gcc (Raspbian 6.3.0-18+rpi1) 6.3.0 20170516
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    make —version
    GNU Make 3.82
    Built for i686-pc-mingw32
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    «——————— END ————————-«

  6. MAXX's Gravatar MAXX
    14 октября 2018 at 20:54 | Permalink

    проверил ваши рекомендации, вот выхлоп pwd
    C:\rpi\project\rpi_test>pwd
    /c/rpi/project/rpi_test
    структура каталогов bin inc obj src находится по этому пути

    После этого я вынес файл main.c из папки src на уровень выше,
    то есть в корень проекта C:\rpi\project\rpi_test>
    И вот теперь проект у меня собрался!!!!
    А ведь в makefile явно указано
    SRC_DIR := src
    как оказалось эта переменная при сборке нигде не участвует

    Может ошибка в makefile?

  7. MAXX's Gravatar MAXX
    14 октября 2018 at 22:27 | Permalink

    VPATH я увидел, но поскольку VPATH нигде не используется посмел предположить что SRC_DIR нигде не используется.
    Получается make считывает эту переменную и по путям указанным там ищет файлы?
    Что в таком случае не так с папкой src? Почему там не находится файл?
    для проверки вывел в консоль VPATH командой @echo $(VPATH)
    inc obj src
    Если VPATH = SRC_DIR то файл находится в папке src, в комбинации с obj и inc не находится.
    потихоньку грызу makefile, вопросов пока больше чем ответов

  8. MAXX's Gravatar MAXX
    15 октября 2018 at 21:42 | Permalink

    действительно дело оказалось в make 3.82 из mingw 5.30.
    этот файл в результате моих экспериментов оказался в папке с кросс-компилятором, и находился раньше чем в папке по умолчанию, то есть в mingw/….
    ну да пес с ним.
    как только я его убрал из папки с скросс-компилятором, в дело сразу пошел make 3.81 из msys, и у меня все сразу собралось!!!!
    справедливость восторжествовала.
    выхлоп у make 3.81 все равно другой
    C:\rpi\project\rpi_test>make -v
    GNU Make 3.81
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    PARTICULAR PURPOSE.
    This program built for i686-pc-msys

    также выполнил проверку :
    с VPATH := $(SRC_DIR) и make 3.81 и 3.82 поиск отрабатывает корректно и файлы находятся

    СПАСИБО за помощь

Leave a Reply

You must be logged in to post a comment.