Программирование ARM-контроллеров в Eclipse на Ubuntu: как это делается

По работе столкнулся с программированием контроллера AT91SA7A3, для этого используется IAR. Но поскольку держать вторую систему мне лень, была принята попытка обеспечить возможность программирования, отладки и прошивки под любимой Ubuntu. И вот, после двух недель общения со стенкой посредством обсценной лексики(аж обои начинали шевелиться), таки удалось всё это хозяйство настроить. А поскольку, возможно, я не один такой буду, напишу как это делается.

Итак, у меня имелось: плата AT91SAM7A3-EK, JTAG-адаптер Atmel SAM-ICE, компьютер с Ubuntu 11.04, полпачки сигарет и пара кружек кофе. Хороший комплект. Поехали!

1) Идём на сайт Eclipse (http://www.eclipse.org) и скачиваем под нашу систему Eclipse IDE for C/C++ Developers. Последняя версия оной это Eclipse 3.7 Indigo.
2) Идём на сайт проекта OpenOCD (http://developer.berlios.de/projects/openocd/) и выкачиваем исходники OpenOCD 0.5.0.
3) Идём за компилятором. Я выбрал Sourcery G++, так как он обновляется, в отличии от ARMGCC. Скачиваем IA32 GNU/Linux TAR.
4) Опционально: пока всё это выкачивается, можно сходить покурить.
5) Распаковываем архив Eclipse в нужную нам директорию(у меня это /home/user/arm, появится папка eclipse).
6) Распаковываем архив компилятора в нужную директорию (у меня это /home/user/arm, появится папка arm-2011.03 или нечто подобное, могут отличаться цифры).
7) Идём в Synaptic, устанавливаем пакет usb-dev, он нам понадобится далее.
8) Распаковываем архив с OpenOCD, лучше в папку home, будет немного проще с путями.
9) Запускаем терминал, прыгаем в папку с исходниками OpenOCD(ту, что только что распаковали) и пишем следующие команды:

./configure --enable-jlink
sudo make
sudo make install

Ключ --enable-jlink нужен для включения поддержки нашего SAM-ICE, для этого же мы ставили пакетик usb-dev.
10) Опционально: пока всё это собирается можно пойти выпить кофе.
11)Теперь так же в консоли пишем следующее: sudo gedit /etc/environment.
В открывшемся файлике дописываем путь к нашему компилятору, должно получиться приблизительно следующее:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/user/arm/arm-2011.03/bin"
Перезагружаем машину и (опционально) идём курить.
12) Машина перезагрузилась, запускаем Eclipse из папки, выбираем рабочее пространство и ставим галочку, чтоб больше не лез. Идём в Help->Install New Software, там тыкаем в кнопочку Add, пишем имя Zylincdt, адрес opensource.zylin.com/zylincdt, жамкаем ОК, ставим галочку на единственном пакете в окне Zylin Embedded CDT, и следуем указаниям установщика.После установки Eclipse перезапустится. Теперь создаём новый проект: идём в File->New->C Project, там выбираем Makefile project-> Empty project, Toolchain-Other Toolchain, даём проекту имя и жамкаем Finish. Теперь на время сворачиваем Eclipse.
13) Идём в папку /usr/local/share/openocd/scripts/target и ищем там конфигурационный файл с нашим контроллером в имени. Моего(AT91SAM7A3) не оказалось, но он был быстро найден в гугле и немного подправлен ручками. Если есть-прекрасно. Подключаем SAM-ICE к компу и плате, подаём на плату питание. Запускаем терминал и пишем следующее:

sudo openocd -f interface/jlink.cfg -c «jtag_rclk 30;gdb_flash_program enable;gdb_memory_map disable» -f target/at91sam7a3.cfg

Внимание! Если у вас другой адаптер или другая плата-замените jlink.cfg и at91sam7a3.cfg на нужные вам файлы.
Должен запуститься OpenOCD и показать нам кучу информации, среди которой будет модель чипа. Сворачиваем окошка терминала.
14) Идём на сайт Atmel и ищем пробный проект. Там несколько кривая система, поэтому я сразу дам прямую ссылку на проект под нашу плату AT91SAM7A3-EK: www.atmel.com/dyn/resources/...ing_started.zip. Скачиваем, распаковываем, запоминаем куда распаковали. Возвращаемся в Eclipse, щёлкаем правой кнопкой на наш проект, выбираем Import, там General-File System. Указываем ему папку, куда распаковали свежескаченный проект, указываем какие нужны файлы(можно просто всё выделить и не мучиться) и жамкаем Finish.
15) Идём в Makefile проекта, находим строку CROSS_COMPILE=arm-elf- и заменяем её на CROSS_COMPILE=arm-none-eabi-.Сохраняем Makefile, идем в Project-> Build Project и наблюдаем как всё компилируется и собирается. Если всё сделано правильно на выходе будут по два файла *.elf и *.bin.
16) Создаём в папке home(или где-нибудь ещё файлы gdbinit_sram и gdbinit_flash, в которых пишем следующее.
gdbinit_sram:

target remote localhost:3333
monitor reset init
monitor halt
printf "____Target halted____\n"
set $mem_a = *0x00000000
set $mem_c = $mem_a
set $mem_a = $mem_a + 1
set *0x00000000 = $mem_a
set $mem_b = *0x00000000
if ($mem_a == $mem_b)
set *0x00000000 = $mem_c
printf "____Remap_is_Done____\n"
else
printf "____Remap_is_Not____\n"
set *0xFFFFFF00 = 1
printf "____Remap_is_Done____\n"
end
monitor reg pc 0x00000000
monitor arm7_9 dbgrq enable
monitor gdb_breakpoint_override hard
load
hbreak /*здесь указываем точку брейкпоинта*/
continue
condition 1

gdbinit_flash:

target remote localhost:3333
monitor reset init
monitor halt
printf "____Target halted____\n"
set $mem_a = *0x00000000
set $mem_c = $mem_a
set $mem_a = $mem_a + 1
set *0x00000000 = $mem_a
set $mem_b = *0x00000000
if ($mem_a == $mem_b)
printf "____Remap_is_Not____\n"
set *0x00000000 = $mem_c
set *0xFFFFFF00 = 1
printf "____Remap_is_Done____\n"
else
printf "____Remap_is_Done____\n"
end
monitor arm7_9 dcc_downloads enable
monitor arm7_9 fast_memory_access enable
monitor flash erase_sector 0 0 15
monitor flash probe 0
monitor flash write_bank 0 /*здесь указываем путь к файлу прошивки*/ 0
monitor reset run
kill

17) Теперь настроим отладчик. Идём в Run->Debug Configuration, там создаём 2 новые конфигурации: Zylin Embedded Debug(Native) sram(для отладки) и Zylin Embedded Debug(Native) flash(для прошивки). Теперь по вкладкам.
Main: C/C++ Application указываем путь и имя файла, тот что *.elf нужен для отладки, *.bin- для прошивки.
Debugger: GDB Debuger-указываем путь к нашему дебагеру, в нашем случае это будет так home/user/arm/arm-2011.03/bin/arm-none-eabi-gdb,
GDB Command File-здесь указываем путь к соответствующему файлу gdbinit.
Commands: в поле Initialze Command пусто.
Вкладка Common: ставим галочку Debug под надписью Display in favorites menu.
Жмём Apply, убеждаемся что у нас запущен OpenOCD, нажимаем Debug. Должно появиться окошко с отладочной информацией, если запущена конфигурация sram. По желанию можно добавить окошки с обзором переменных, памяти, дизассемблированием и так далее.
Вуаля, всё работает.
Теперь небольшое дополнение. Лучше не удаляйте скаченный проект-там есть заголовочный файл, описывающий кучу констант для облегчения работы с регистрами, там есть Startup-файлы, там есть скрипт линкеровщика(что немаловажно) и самое главное-Makefile, описывающий, как будет распределяться память в файлах для отладчика и программатора. По мне-лучше переносить их в каждый новый проект и немного править Makefile. И жизнь будет прекрасна.

P.S. Чуть позже я понял, что если немного пошевелить мозгами, то же самое можно провернуть используя тулчейн для ARM, но надобность отпала и я не стал этим заниматься.
Поделиться публикацией

Комментарии 4

    0
    На мой взгляд для таких целей есть VirtualBox. Правда, отлаживать я лично не пробовал через нее, но JTAG должен работать.
    И да, у Вас очень нечитаемая статья.
    p.s. У вообще меня есть отдельная винда для VirtualBox, чтобы не забивать рабочую систему всякими кадами и ide. Плюс она находится на внешнем диске и нет проблем после переустановки системы или для запуска на другом компьютере.
      0
      Здесь шутка юмора в том, что нужна была свободная IDE взамен IAR ARM, которая платна, поэтому мне дали задание найти бесплатную IDE, не уступающую по возможности. Да и плюс у меня и у старшего программиста второй системой стоит Убунту, поэтому решение искали под неё. Но затем этот вопрос завернули, поэтому я и прекратил поиски относительно тулчейна.
      Это моя первая статья на хабре, поэтому напишите, из-за чего моя статья является нечитаемой. Буду благодарен за конструктивную критику и приму её к сведению
        0
        Ах вот в чем дело. Да бесплатная IAR ограничена небольшим размером кода, а лицензия очень недешевая…
        По поводу читаемости статьи. Попробуйте выделять код специальным тегом (как отдельным блоком, так и в тексте), а также по необходимости использовать списки, подзаголовки и выделять ключевые слова жирным.
          0
          Хорошо, спасибо за совет.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.