Програмування 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
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 "____ \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
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 *0x0 = $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 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, але потреба відпала і я не став цим займатися.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»