Программирование контроллеров ARM7 в Eclipse: как это делается. v2.0
Когда-то я уже писал статью о программировании контроллеров в Eclipse, но это было сделано под Ubuntu и без помощи тулчейна. Теперь я расскажу, как сделать это с помощью тулчейна и под Windows.
Итак, у меня имелись: установленная Eclipse для Java, плата с контроллером AT91SAM7X512, модуль SAM-ICE от Atmel и злое начальство в качестве мотивации.
Устанавливаем/доустанавливаем Eclipse IDE
Первое что мы делаем — устанавливаем Eclipse и всё нужное в неё. Последняя на данный момент версия это Eclipse Kepler. Если она не установлена идём сюда и скачиваем Eclipse IDE for C/C++ Developers, затем распаковываем её в удобное место.
Если Eclipse уже установлен(в моём случае Eclipse IDE for Java Developers), то запускаем её, выбираем удобное для нас место для workspace, где будут лежать все проекты, идём в меню Help ⇒ Install New Software и в поле «Work with. » выбираем «Kepler — download.eclipse.org/releases/kepler». Нам откроется список того, что есть на этом источнике. Разворачиваем узел «Programming language«, ставим галочку на «C/C++ Development Tools«, затем разворачиваем узел “Mobile and Device Development“, ставим галочку на “C/C++ GDB Hardware Debugging”, нажимаем «Next» и «Finish«. После установки Eclipse перезапустится.
В случае, если вы скачивали Eclipse IDE for C/C++ Developers, доустановите плагин C/C++ GDB Hardware Debugging. Он нам понадобится при отладке, а пока поставим ещё один плагин, для поддержки тулчейна.
Снова идём в меню Help ⇒ Install New Software, нажимаем кнопку «Add«. В появившемся окне указываем любое имя в строке «Name«, а в строке «Location» указываем следующее:
gnuarmeclipse.sourceforge.net/updates
Нажимаем «OK«. Нам покажут огромный список того, что есть в этом источнике из целого одного компонента — «CDT GNU Cross Development Tools«. Ставим на нём галочку, жмём «Next» и «Finish«. Во время установки не обращаем внимание на Warning и смело жмём на ОК. После установки Eclipse перезапустится.
Вуаля, здесь всё. Идём дальше.
Устанавливаем компилятор
Идём сюда и скачиваем установочник Sourcery CodeBench Lite Edition. На данный момент последняя версия 2013.11-24. Установка проста, единственное на чём нужно заострить внимание — обязательно нужно поставить галочку «Изменить переменную PATH«. После установки перезагружаем машину.
Для проверки правильности установки в командной строке выполняем команду:
arm-none-eabi-gcc -v .
Она должна показать нам подробное описание всего инструментария и версию компилятора. На этом с компилятором всё.
Создаём скелетный проект
Запускаем Eclipse, идем в меню «File->New->C Project«. Появится окно создания проекта. Даём ему имя, в дереве “Project type” выбираем тип проекта “ARM Cross Target Application -> Empty Project”, а из тулчейнов выбираем Sourcery. Нажимаем Finish.
Проект есть, теперь нам нужен файл Startup и скрипты линкера для отладочной конфигурации и для прошивки в контроллер.
Идём сюда и скачиваем архив «AT91SAM7X-EK Software Package for IAR 5.2, Keil and GNU». В нём идём по пути /at91sam7x-ek/packages/ и выбираем любой проект, имя которого оканчивается на gnu. В нём идём по такому пути /имя_проекта/at91lib/boards/at91sam7x-ek, забираем отсюда файл board_cstartup.S, а из лежащей там же папки at91sam7x512 забираем файлы AT91SAM7X512.h, sram.lds, flash.lds и копируем всё это добро куда-нибудь в одну папку.
Снова идём в Eclipse. Там правой кнопкой мыши тыкаем на наш проект и выбираем «Import«, в появившемся окне выбираем General->File System, жмём Next. Выбираем папку, куда скопировали файлы board_cstartup, sram и flash, ставим галочки на этих файлах и нажимаем Finish. Вуаля, файлы появились у нас в проекте.
Теперь нужно немного поправить файлы .lds. Приведите их к такому виду:
OUTPUT_FORMAT(«elf32-littlearm», «elf32-littlearm», «elf32-littlearm»)
OUTPUT_ARCH(arm)
ENTRY(entry)
MEMORY
sram (W!RX): ORIGIN = 0x200000, LENGTH = 0x20000
flash (RX): ORIGIN = 0x000000, LENGTH = 0x80000
>
.relocate: AT (_efixed)
. = ALIGN(4);
_srelocate = .;
. = ALIGN(4);
_erelocate = .;
>
OUTPUT_FORMAT(«elf32-littlearm», «elf32-littlearm», «elf32-littlearm»)
OUTPUT_ARCH(arm)
ENTRY(entry)
MEMORY
sram (RWX): ORIGIN = 0x200000, LENGTH = 0x20000
flash (RX): ORIGIN = 0x100000, LENGTH = 0x80000
>
SECTIONS
<
.fixed:
. = ALIGN(4);
_sfixed = .;
*(.vectors)
*(.text*);
*(.rodata*)
_efixed = .;
> >flash
.relocate: AT (_efixed)
_srelocate = .;
*(.data)
*(.data*)
. = ALIGN(4);
_erelocate = .;
> >sram
Скелетный проект готов.
Теперь можно писать код, добавляя новые файлы через File->New-> C/C++ Source File. У меня проект был и я его просто импортировал.
Настройка проекта
Теперь нужно настроить проект, для чего идём в меню Project->Properties или делаем правый клик по нашему проекту и выбираем там Properties.
В появившемся окне выбираем пункт “C/C++ Build->Setting”. Выбираем в поле Configuration пункт All configuration. Теперь пройдёмся по всем пунктам настроек.
Target processor
- Processor — arm7tdmi
- Architecture — armv4t
- Thumb — disabled
- Thumb interwork — enabled
- Endianness — Little Endian
- Float ABI — Library
- Other target flags: -marm — mlong-calls
ARM Windows GCC C Compiler — Optimization
- Pack structure — disabled
- Short enumeration — disabled
- Function sections — enabled
- Data sections — disabled
ARM Windows GCC C Compiler — Miscellaneous
ARM Windows GCC C Linker
- Script File — пока не трогаем
- Do not use standart start files — enabled
- Do not use default libraries — enabled
- Remove unused section — enabled
В пункте Miscellaneous: ставим галочку на Cross Refereinse.
ARM Windows GNU Create Flash Image — Output
Идем обратно на вкладку Debugging, а в поле Configuration выбираем Debug. Выставляем Debug level — Maximum, а Debug format — gdb, жмем Apply. Теперь переключаем конфигурацию на Release, выставляем Debug level — None и жмём Apply.
Теперь возвращаемся на ARM Windows GCC C Linker — General, в поле Configuration выбираем Debug, а в качестве Script file указываем наш файл sram.lds. Нажимаем Apply. Теперь переключаем конфигурацию на Release, а в качестве Script file указываем файл flash.lds и снова жмём Apply. Всё, настройка проекта закончена. Теперь можем включить нужную конфигурацию билда и собирать прошивку.
Прикручиваем отладку
Идем сюда, вводим серийный номер нашего SAM-ICE, скачиваем и устанавливаем пакет программ для J-Link. Здесь есть очень важная штука — GDB Server, который очень пригодится нам для отладки. Ещё одна важная штука — JFlash, который позволяет без проблем прошить наш контроллер.
Создаём конфигурацию для запуска отладочного сервера, для чего в Eclipse идём в меню Run->External Tools->External Tools Configurations и делаем двойной клик на пункте Program. Настраиваем, свежесозданную конфигурацию.
- Name — назовем как-нибудь, например GDB Server
- Location — указываем путь к установленному недавно JLink GDB Server, в моём случае это C:\Program Files (x86)\SEGGER\JLinkARM_V412\JLinkGDBServerCL.exe
- Working Directory — указываем путь к папке нашего проекта
- Arguments — никаких аргументов нам и не надо, интерфейс JTAG используется по умолчанию
- C/C++ Application — указываем наше приложение из папки Debug с расширением .elf
- Project — указываем наш проект.
- В нижней части окна, на уровне кнопок Apply и Revert притаилась ещё одна скрытая настройка, нужно её обязательно открыть до перехода на следующую вкладку и выбрать «Legacy GDB Hardware Debugging Launcher«
- GDB Command — указываем наш отладчик arm-none-eabi-gdb.exe
- Command Set — Standart Windows
- Protocol Version — mi
- Use remote target — enabled
- JTAG Device — Generic TCP/IP
- Host name or IP adress — localhost
- Port number — 2331
- Reset and Delay — disabled
- Halt — disabled
- Далее следует окошко, в котором указываем следующий скрипт инициализации:
# connect to the J-Link gdb server
target remote localhost:2331
# Set JTAG speed to 30 kHz
monitor endian little
monitor speed 30
# Reset the target
monitor reset 8
monitor sleep 10
# Change mapping, putting RAM at addr. 0
monitor long 0xFFFFFF00 = 0x00000001
# Setup GDB for faster downloads
set remote memory-write-packet-size 1024
set remote memory-write-packet-size fixed
monitor speed 12000
break main
load - Load image — enabled, use project binary
- Load symbols — enabled, use project binary
- Symbol offset — не ставим
- Set program counter at — disabled
- Set breakpoint at — disabled
- Resume — disabled
- Run command — пусто
Всё готово. Теперь для отладки подключаем SAM-ICE к USB порту нашей машины и к плате с контроллером, собираем наш проект, запускаем сервер GDB, а потом запускаем собственно конфигурацию отладки.
В итоге мы получили бесплатную IDE для программирования и отладки приложений для ARM-контроллеров, на замену, скажем, тому же IAR. Наша Eclipse, конечно, несколько уступает по части отладки — нельзя с ходу просмотреть значения регистров периферийных устройств, таких как SPI или таймеры-счётчики.
На сайте SEGGER можно заметить, что есть версия GDB сервера и для Linux. Подозреваю, что таким же нехитрым способом с некоторыми изменениями можно организовать и отладку, например, под Ubuntu.
Всем удачи в программистских делах!
P.S. Если вы заметили неточность или знаете способ, как можно улучшить сию методику — пишите в комментарии, буду рад советам и конструктивной критике.