Как да програмирате ARM контролери в Eclipse на Ubuntu
По време на работа се сблъсках с програмирането на контролера AT91SA7A3, IAR се използва за това. Но тъй като ме мързи да поддържам втора система, беше направен опит да се предостави възможност за програмиране, отстраняване на грешки и флашване под любимия ми Ubuntu. И сега, след две седмици общуване със стената чрез нецензурна лексика (тапетът вече започна да се движи), все пак успяхме да настроим цялата тази икономика. И тъй като, може би, няма да съм единственият, ще напиша как се прави. И така, имах: платка AT91SAM7A3-EK, адаптер Atmel SAM-ICE JTAG, компютър Ubuntu 11.04, половин пакет цигари и две чаши кафе. Добър комплект. Отивам!
1) Отидете на уебсайта на Eclipse (http://www.eclipse.org) и изтеглете Eclipse IDE за C/C++ разработчици за нашата система. Последната му версия е 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, за предпочитане в домашната папка, ще е малко по-лесно с пътищата. 9) Стартирайте терминал, преминете към папката източник на OpenOCD (тази, която току-що разопаковахме) и напишете следните команди:
./configure --enable-jlink sudo make sudo make install
sudo openocd -f интерфейс/jlink.cfg -c "jtag_rclk 30; активиране на gdb_flash_program; деактивиране на gdb_memory_map" -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. Посочваме му папката, в която е разопакован прясно изтегления проект, посочваме какви файлове са необходими (можете просто да изберете всичко и да не страдате) и щракнете върху Готово. 15) Отидете до Makefile на проекта, намерете реда CROSS_COMPILE=arm-elf- и го заменете с CROSS_COMPILE=arm-none-eabi-. Запазете Makefile, отидете на Project-> Създайте проект и гледайте как всичко се компилира и изгражда. Ако всичко е направено правилно, изходът ще бъде два файла *.elf и *.bin. 16) Създайте 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 /*задайте точка на прекъсване тук*/ продължете условие 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 *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 /*spe уточнете пътя до файла на фърмуера тук*/ 0 нулиране на монитора стартирайте убийте
17) Сега нека настроим дебъгера. Отиваме на Run->Debug Configuration, там създаваме 2 нови конфигурации: Zylin Embedded Debug(Native) sram (за отстраняване на грешки) и Zylin Embedded Debug(Native) flash (за фърмуер). Сега за разделите. Основно: Приложението C/C++ указва пътя и името на файла, този, който *.elf е необходим за отстраняване на грешки, *.bin - за флашване. Debugger: GDB Debuger - посочете пътя до нашия дебъгер, в нашия случай ще бъде като този home/user/arm/arm-2011.03/bin/arm-none-eabi-gdb, GDB команден файл - тук посочваме пътя до съответния gdbinit. Команди: Полето Initialze Command е празно. Раздел Общи: Поставете отметка в квадратчето Отстраняване на грешки под Показване в менюто с любими. Щракнете върху Прилагане, уверете се, че OpenOCD работи, щракнете върху Отстраняване на грешки. Трябва да се появи прозорец с информация за отстраняване на грешки, ако конфигурацията на sram работи. По желание можете да добавите прозорци с преглед на променливи, памет, разглобяване и т.н. Воала, всичко работи. Сегамалко допълнение. По-добре не изтривайте изтегления проект - има заглавен файл, който описва куп константи, за да се улесни работата с регистрите, има файлове за стартиране, има скрипт за свързване (което е важно) и най-важното, Makefile, който описва как паметта ще бъде разпределена във файлове за дебъгера и програмиста. За мен е по-добре да ги прехвърлям във всеки нов проект и малко да редактирам Makefile. И животът ще бъде страхотен.
P.S. Малко по-късно разбрах, че ако използвате малко мозъка си, същото нещо може да се направи с помощта на инструменталната верига за ARM, но необходимостта изчезна и аз не го направих.
И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".