Pull to refresh

Программирование контроллеров ARM7 в Eclipse: как это делается. v2.0

Reading time 6 min
Views 20K
Когда-то я уже писал статью о программировании контроллеров в 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. Приведите их к такому виду:

sram.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
}

SECTIONS
{
. = ALIGN(4);
.fixed:
{
_sfixed = .;
*(.vectors)
*(.ramfunc)
*(.text*)
*(.rodata*)
*(.data)
. = ALIGN(4);
_efixed = .;
} >sram

.relocate: AT (_efixed)
{
. = ALIGN(4);
_srelocate = .;
. = ALIGN(4);
_erelocate = .;
}

.bss: {
_szero = .;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ezero = .;
} >sram

_sstack = 0x220000;
}
end = .;


flash.lds
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

.bss: {
_szero = .;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ezero = .;
} >sram

_sstack = 0x220000;
}
end = .;

Скелетный проект готов.
Теперь можно писать код, добавляя новые файлы через File->New-> C/C++ Source File. У меня проект был и я его просто импортировал.

Настройка проекта

Теперь нужно настроить проект, для чего идём в меню Project->Properties или делаем правый клик по нашему проекту и выбираем там Properties.
В появившемся окне выбираем пункт “C/C++ Build->Setting”. Выбираем в поле Configuration пункт All configuration. Теперь пройдёмся по всем пунктам настроек.

Target processor

  1. Processor — arm7tdmi
  2. Architecture — armv4t
  3. Thumb — disabled
  4. Thumb interwork — enabled
  5. Endianness — Little Endian
  6. Float ABI — Library
  7. Other target flags: -marm — mlong-calls


ARM Windows GCC C Compiler — Optimization

  1. Pack structure — disabled
  2. Short enumeration — disabled
  3. Function sections — enabled
  4. Data sections — disabled


ARM Windows GCC C Compiler — Miscellaneous

  1. Language Standart — ISO C99 with GNU Extensions

Остальные пункты здесь не трогаем

ARM Windows GCC C Linker

В пункте General:
  1. Script File — пока не трогаем
  2. Do not use standart start files — enabled
  3. Do not use default libraries — enabled
  4. Remove unused section — enabled

Остальное — отключаем

В пункте Miscellaneous: ставим галочку на Cross Refereinse.

ARM Windows GNU Create Flash Image — Output

  1. Output file format — ihex


Идем обратно на вкладку 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. Настраиваем, свежесозданную конфигурацию.

Вкладка Main:
  1. Name — назовем как-нибудь, например GDB Server
  2. Location — указываем путь к установленному недавно JLink GDB Server, в моём случае это C:\Program Files (x86)\SEGGER\JLinkARM_V412\JLinkGDBServerCL.exe
  3. Working Directory — указываем путь к папке нашего проекта
  4. Arguments — никаких аргументов нам и не надо, интерфейс JTAG используется по умолчанию


Вкладка Common:
  1. Ставим галочки на Display in favorites menu и Launch in background.


Теперь создадим конфигурацию для запуска отладки. Идём в меню Run->Debug Configurations, в открывшемся окне делаем двойной клик по GDB Hardware Debugging, что создаст нам новую конфигурацию отладки. Настраиваем.
Вкладка Main:
  1. C/C++ Application — указываем наше приложение из папки Debug с расширением .elf
  2. Project — указываем наш проект.
  3. В нижней части окна, на уровне кнопок Apply и Revert притаилась ещё одна скрытая настройка, нужно её обязательно открыть до перехода на следующую вкладку и выбрать "Legacy GDB Hardware Debugging Launcher"


Вкладка Debugger:
  1. GDB Command — указываем наш отладчик arm-none-eabi-gdb.exe
  2. Command Set — Standart Windows
  3. Protocol Version — mi
  4. Use remote target — enabled
  5. JTAG Device — Generic TCP/IP
  6. Host name or IP adress — localhost
  7. Port number — 2331


Вкладка Startup:
  1. Reset and Delay — disabled
  2. Halt — disabled
  3. Далее следует окошко, в котором указываем следующий скрипт инициализации:
    # 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
  4. Load image — enabled, use project binary
  5. Load symbols — enabled, use project binary
  6. Symbol offset — не ставим
  7. Set program counter at — disabled
  8. Set breakpoint at — disabled
  9. Resume — disabled
  10. Run command — пусто


Вкладка Common:
  1. Ставим галочки на Display in favorites menu, Allocate console и Launch in background.


Всё готово. Теперь для отладки подключаем SAM-ICE к USB порту нашей машины и к плате с контроллером, собираем наш проект, запускаем сервер GDB, а потом запускаем собственно конфигурацию отладки.

В итоге мы получили бесплатную IDE для программирования и отладки приложений для ARM-контроллеров, на замену, скажем, тому же IAR. Наша Eclipse, конечно, несколько уступает по части отладки — нельзя с ходу просмотреть значения регистров периферийных устройств, таких как SPI или таймеры-счётчики.

На сайте SEGGER можно заметить, что есть версия GDB сервера и для Linux. Подозреваю, что таким же нехитрым способом с некоторыми изменениями можно организовать и отладку, например, под Ubuntu.
Всем удачи в программистских делах!
P.S. Если вы заметили неточность или знаете способ, как можно улучшить сию методику — пишите в комментарии, буду рад советам и конструктивной критике.
Tags:
Hubs:
0
Comments 1
Comments Comments 1

Articles