Ubuntu + Eclipse + Code Sourcery + OpenOCD + j-link + ARM, или "Быстрый старт для сомневающихся"

Цель этой статьи — показать, что установка, наладка и «запуск в эксплуатацию» тулчейна для работы с ARM'ами довольно проста и занимает вместе с перекурами около получаса. Ключевое слово в названии — Ubuntu, или, вообще говоря, Linux. Большинство материала в сети рассчитано на аудиторию пользователей MS Windows, и перейти на Linux мешает, или пугает, отсутствие руководства, в котором был бы более-менее популярно описан процесс. Да, это немного сложнее, чем установка Keil+SEGGER, но зато потом, надеюсь, вы оцените преимущества работы в Linux.

Эта процедура проверена для Ubuntu 11.04 и Linux Mint 12.

Имеем:

с одной стороны — Linux,
с другой стороны — пациент с ARM мозгом + j-link brain surgery helper.

План действий:
1. Установка Code Sourcery G++ Lite for ARM EABI
2. Установка Eclipse и GNU ARM плагина
3. Настройка GNU ARM плагина
4. Установка OpenOCD
5. Заставить всё это работать
6. Прибраться

1. Установка Code Sourcery G++ Lite for ARM EABI
Можно браузером скачать инсталятор вот по этой ссылке, но мы выберем путь попроще. Поэтому откроем консоль…

$ cd ~
$ mkdir temp
$ cd temp
$ wget https://sourcery.mentor.com/sgpp/lite/arm/portal/package8734/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

После окончания загрузки распакуем полученный архив

$ tar xvf arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

Теперь

$ sudo mkdir /opt/codesourcery
$ sudo mv arm-2011.03 /opt/codesourcery

Добавитм путь к бинарникам Code Sorcery в переменную PATH

$ gedit ~/.profile

Добавим туда строчку

PATH=/opt/codesourcery/arm-2011.03/bin:$PATH

Чтобы изменения вступили в силу, нужно перелогиниться.

 

2. Установка Eclipse IDE for C/C++ Developers
Скачать можно браузером отсюда, но мы…

$ cd ~/temp
$ wget http://mirror.tspu.ru/eclipse/technology/epp/downloads/release/indigo/SR1/eclipse-cpp-indigo-SR1-incubation-linux-gtk.tar.gz

После окончания загрузки

$ tar xzvf eclipse-cpp-indigo-SR1-incubation-linux-gtk.tar.gz
$ sudo mv eclipse /opt

Теперь нужно в Eclipse добавить поддержку для GDB Hardware Debugging

$ /opt/eclipse/eclipse &

Меню Help->Install New Software…
В поле Work With добавляем

http://download.eclipse.org/tools/cdt/releases/indigo

жмём Enter и ставим вот эту галочку

Далее продолжаем пока не закончится установка, после чего выбираем Restart Now.

Тепер установим GNU ARM плагин.
Снова Меню Help->Install New Software…
В поле Work With добавляем

http://gnuarmeclipse.sourceforge.net/updates

и жмём Enter

Далее продолжаем пока не закончится установка, после чего выбираем Restart Now.

3. Настройка GNU ARM плагина
Cоздаём новый проект:
Меню File->New->C Project…
Выглядит это вот так

Сразу жмём Finish и получаем пустой проект для ARM'ов. Дальнейший путь зависит от того, с каким МК вы будете работать. Рассмотрим на примере горячо любимого народными массами, легендарного STM32, ибо я других не знаю. Итак, вы уже скачали последнюю версию библиотеки стандартной периферии с сайта STMicroelectronics. Нет? Тогда

$ cd ~/temp
$ wget http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip
$ unzip stm32f10x_stdperiph_lib.zip

Из всего этого нам нужны исходники для ядра и для периферии. Положим их в нужное место, например вот так:

$ mkdir ~/stm32
$ cp -R STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/* ~/stm32

Для решения минимальной задачи необходим скрипт для линкера. Его можно взять из какого-нибудь шаблона для Atollic TrueSTUDIO. Скопируем нужный файл в корень проекта:

$ cp STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210E-EVAL/stm32_flash.ld ~/workspace/Test

и сообщим об этом линкеру
Меню Project->Properties->C/C++ Build->Settings->вкладка Tool Settings->ARM Sourcery Linux GCC C Linker->General
В поле Script File укажем путь к файлу

Теперь средствами Eclipse добавим в проект файл со startup-кодом. Возьмём нужный файл из какого-то примера для TrueSTUDIO
Меню File->Import…


Комментарий по поводу файла startup-кода. Во-первых, изза глюка в CDT плагине, нужно изменить расширение файла с .s на .S. Во вторых, в самом файле закомментируйте пару строчек.

/* Call the clock system intitialization function.*/
/*  bl  SystemInit <-- */
/* Call static constructors */
/*  bl __libc_init_array <--*/
/* Call the application's entry point.*/
        bl      main
        bx      lr
.size   Reset_Handler, .-Reset_Handler

Подробнее говорить не буду, т.к. это не входит в рамки нашей задачи.

Теперь добавим main.c
Меню File->New->Source File…

и наполним его минимальным смыслом

Теперь можно собрать проект. Жмём Ctrl-B и на этом пункт №3 будем считать завершённым.

4. Установка OpenOCD
Cоберём OpenOCD из исходников, добавив поддержку j-link, с которым и будем в дальнейшем сотрудничать.

$ cd ~/temp
$ sudo apt-get install libusb-dev
$ wget http://downloads.sourceforge.net/project/openocd/openocd/0.5.0/openocd-0.5.0.tar.bz2
$ tar xvf openocd-0.5.0.tar.bz2
$ cd openocd-0.5.0
$ ./configure --enable-jlink
$ make
$ sudo make install

Теперь j-link. Подключаем его к компу, и

$ lsusb

Надо разрешить системе работать с j-link'ом. Для этого создаём файлик .rules

$ sudo gedit /etc/udev/rules.d/45-jlink.rules

с содержимым

# SEGGER JLINK USB DEVICE 1366:0101
BUS!="usb", ACTION!="add", SUBSYSTEM!=="usb_device", GOTO="kcontrol_rules_end"
SYSFS{idProduct}=="0101", SYSFS{idVendor}=="1366", MODE="664", GROUP="plugdev"
LABEL="kcontrol_rules_end"

добавляем текущего пользователя в группу plugdev, хотя он уже там должен быть

$ sudo adduser user plugdev

и перезагрузим систему

$ sudo reboot

Теперь создаём минимальный скрипт для OpenOCD

$ gedit ~/workspace/Test/openocd.cfg

с содержимым

telnet_port 4444
gdb_port 3333
source [find interface/jlink.cfg]
source [find target/stm32f1x.cfg]

Подключаем j-link к пациенту, подаем на пациента питание. Затем

$ cd ~/workspace/Test
$ openocd

Получаем такую картину

Подключаемся к OpenOCD по telnet, через порт 4444. Я использую PuTTY.

Можно что-нибудь поделать с пациентом, например, посмотреть регистры ядра. (я уже ранее зашил в пациента кое-что)

Тут мы плавно переходим к выполнению 5-го пункта нашего плана.

Откроем Eclipse. Вы уже добавили ярлычок на панель? Нет? Ну тогда…

$ /opt/eclipse/eclipse &

1) Запуск OpenOCD из Eclipse.
В сети можно найти немало рекоммендаций по этому поводу.
Я для себя сделал запуск OpenOCD через скрипт, в отдельном окне, т.к. выяснилось, что Eclipse почему-то не завершет процесс OpenOCD, который оно выполняет в своей консоли, а OpenOCD иногда нужно перезапускать.

$ gedit ~/workspace/Test/openocd.sh

Содержимое скрипта

#!/bin/bash
CFGNAME=`basename $1`
RUNCMD="openocd -f $CFGNAME"
cd `dirname $1`
xterm -fg green -bg black -geometry 100x24-0-0 -e $RUNCMD &

Права на запуск

$ sudo chmod 755 ~/workspace/Test/openocd.sh

Создадим конфигурацию для запуска OpenOCD сервера.
Меню Run->External Tools->External Tools Configurations…

2) Отладчик.
Создадим конфигурацию для запуска GDB.
Меню Run->Debug Configurations…



Теперь компилируем и запускаем…

Создадим ещё одну конфигурацию для отладчика, но без команды заливки прошивки в контроллер, чтобы не терзать флэш когда нужно ещё раз запустить и поотлаживать. Конечно, исходный код при этом меняться не должен.

6. Прибираемся

$ cd ~
$ rm -rf temp

Вот и всё. Надеюсь, статейка будет для кого-то полезной.
Спасибо организаторам этого ресурса за возможность поучиться и поучить.
Спасибо всем кто занимается разработкой замечательного ПО, которое позволяет нам нескучно жить.

Ссылочки:
http://www.ubuntu.com/
http://www.eclipse.org/
http://sourceforge.net/projects/gnuarmeclipse/
http://openocd.sourceforge.net/

 

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru