Вычислительных возможностей платы 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 149567 times by 20583 viewers

Last modified: 26/10/2020

Author

Comments

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

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

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

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

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

    У меня собирается, прописал свои пути в Makefile :

    TOOL_PATH := ‘d:/raspberry/arm-linux-gnueabihf’
    #’c:/rpi/gcc/arm-linux-gnueabihf’
    SHELL := ‘c:/MinGW/msys/1.0/bin/sh.exe’
    #’c:/rpi/mingw/msys/1.0/bin/sh.exe’

    Остается проверить версию arm-linux-gnueabihf-gcc ,
    что выдает команда make test ?

Вот «выхлоп» 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 ————————-«

    Причина может быть в том, что запуск make производится не из каталога проекта, тогда компилятор не может найти main.c .

    Перед выполнением make all из командной строки сначала введите команду pwd , которая покажет где вы находитесь в файловой системе, далее нужно перейти в каталог проекта cd «путь к проекту».

    Вот пример :

    Microsoft Windows [Version 6.1.7601]
    (c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

    C:\Users\Petro>cd c:/

    c:\>pwd
    /c

    c:\>make -f d:/raspberry/workspace/rpi_test/Makefile all
    make: *** No rule to make target obj/Debug/main.o', needed by bin/Debug/rpi_te
    st’. Stop.

    c:\>d:

    D:\>cd raspberry/workspace/rpi_test

    D:\raspberry\workspace\rpi_test>make -f Makefile all

    size
    ——————————————————
    arm-linux-gnueabihf-size bin/Debug/rpi_test
    text data bss dec hex filename
    1099 284 4 1387 56b bin/Debug/rpi_test
    ——————— COMPLETE ————————

    D:\raspberry\workspace\rpi_test>

проверил ваши рекомендации, вот выхлоп 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?

    А ведь в makefile явно указано
    SRC_DIR := src
    как оказалось эта переменная при сборке нигде не участвует

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

    Обратите внимание внутри Makefile на переменную

    VPATH += $(INC_DIR) $(OBJ_DIR) $(SRC_DIR)

    В переменной VPATH указываются пути поиска файлов. То есть make сначала ищет файлы в текущем каталоге проекта, если не находит, то смотрит VPATH и ищет их там.

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

Я хотел попробовать собрать проект с такими-же версиями make и gcc , как у вас, но не нашел версии make 3.82 .
Потом посмотрел ваш вывод make test, там есть для make строчка

Built for i686-pc-mingw32

Обычно он имеет название mingw32-make, вы его не переименовывали?
В ../MinGW/msys/1.0/bin есть make 3.81 , попробуйте задействовать его при сборке, для этого в системной переменной path для Windows путь к make 3.81 должен указываться раньше, чем к make 3.82.
Хотя проблема , скорее всего, не в этом, я пробовал и переименовывать mingw32-make в make , пробовал собирать разными версиями gcc, у меня всегда собирается без проблем (main.c лежит в каталоге /src проекта).
Если с make 3.81 ничего не получится, то попробуйте переустановить MinGW и arm-linux-gnueabihf заново, проcледить в системной переменной Path , чтобы использовался make из msys.

    Убрал VPATH из Makefile , теперь все пути к файлам указаны явно.
    Загрузить Makefile
    P.S: Видимо VPATH лучше совсем не использовать, раз возможны такие ситуации.
    Хотя в случаях, когда исходники разбросаны по разным каталогам очень удобно указать их расположение с помощью VPATH.
    Попрошу вас провернить еще первоначальный вариант Makefile с VPATH := $(SRC_DIR) ,
    поскольку $(INC_DIR) и $(OBJ_DIR) в VPATH совершенно не нужны были,
    может быть поэтому некорректно отработал поиск по VPATH.

действительно дело оказалось в 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 поиск отрабатывает корректно и файлы находятся

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

Спасибо и вам, что помогли обнаружить проблему с VPATH в моем Makefile. Судя по комментарию выше, эта проблема проявилась не только у вас.
Для корректного использования VPATH, как оказалось, есть свои правила :
How Not to Use VPATH

Write a Reply or Comment