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

Программирование 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, добавим в него следующие строки :

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(int argc, char **argv);
 
int main(int argc, char **argv)
{
	printf("Welcome to the Raspberry Pi 3 programming\n");
 
	return 0;
}/* main */

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

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

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

sudo chmod 777 Rpi3_Project

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

./Rpi3_Project

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

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
int  main(int argc, char **argv);
 
int main(int argc, char **argv)
{
	cout << “Welcome to the Raspberry Pi 3 programming in C++\n”;
	return 0;
}//main

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

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

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

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



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

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

4 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.»

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

Leave a Reply

You must be logged in to post a comment.