Home Articles ARM ARM toolchain - tutorial
ARM toolchain - tutorial
User Rating: / 302
PoorBest 
Written by Freddie Chopin   
Sunday, 17 May 2009 16:36
Article Index
ARM toolchain - tutorial
ARM toolchain
Debugger
Edytor (IDE)
Eclipse + OpenOCD + GDB
Epilog
All Pages

Bez zb?dnego lania wody przejd?my do rzeczy... Do wygodnego tworzenia oprogramowania dla ARMów potrzeba nam:

  • edytora (IDE),
  • toolchaina (kompilator, assembler, linker, binutils, biblioteki, ...),
  • oprogramowania do debuggowania.

Edytor (IDE)

W roli edytora lub IDE dla ARMów spotykany jest zwykle jeden z dwóch programów - Programmers Notepad albo Eclipse. Poza tymi dwoma mo?liwe jest oczywi?cie zastosowanie wielu innych aplikacji, takich jak cho?by CodeBlocks lub DevC++. Poniewa? moim zdaniem ogromne mo?liwo?ci i du?a popularno?? Eclipse rekompensuj? jego niewielkie wady (jest napisany w Javie, wi?c czasem potrafi si? przyci??), tutorial ten bazowa? b?dzie w?a?nie na Eclipse. ?rodowisko Eclipse umo?liwia nam pisanie kodu, zarz?dzanie projektem, programowanie uk?adu oraz jego debuggowanie - czego chcie? wi?cej? (;

ARM toolchain

Na chwil? obecna dost?pnych jest wiele kompletnych i gotowych toolchainów dla ARMa - jedne s? na wiele platform, inne tylko na jedn?. Warto wymieni? takie pakiety jak WinARM, GNUARM i Yagarto. Tutorial ten jednak oparty b?dzie jednak o inne rozwi?zanie, a mianowicie o Sourcery G++ Lite pochodz?ce z CodeSourcery. Dlaczego? Przede wszystkim istotne jest to, ?e rozwój toolchaina firmy CodeSourcery jest sponsorowany przez ARM Ltd., dzi?ki czemu jest on zawsze najbardziej zgodny ze standardami ARM, a usprawnienia wprowadzane s? najszybciej - dopiero po pewnym czasie trafiaj? one do oficjalnej dystrybucji GCC, a stamt?d dopiero do innych toolchainów. Poza tym warto nadmieni?, ?e toolchain ten jest dost?pny zarówno dla platformy Windows jak i Linux, obs?uguje instrukcje typu ARM, Thumb i Thumb-2 oraz najnowsze architektury ARMów - takie jak cho?by Cortex. Nowe wersje toolchaina od CodeSourcery wydawane s? w pó?rocznych odst?pach.

Oprogramowanie do debuggowania

Debugger GDB (GNU Debugger) potrzebuje tak zwanego "klienta GDB", który przyjmowa?by i wykonywa? jego rozkazy. W ?wiecie ARMów rol? t? doskonale spe?nia OpenOCD, które równie? jest aplikacj? wieloplatformow?. Obecnie OpenOCD obs?uguje praktycznie wszystkie istniej?ce JTAGi do ARMa (m.in. klony Wigglera (LPT), uk?ady oparte o FT2232 (USB), JLink, RLink i wiele innych) oraz wi?kszo?? istniej?cych rodzajów ARMów (w tym ARM7, ARM9 i Cortex-M3).

Instalacja krok po kroku...

Poni?szy tutorial oparty jest o system Windows, niemniej jednak nie ma ?adnego problemu, aby porady tu przedstawione zastosowa? dla systemu Linux (oczywi?cie nie dos?ownie).


ARM toolchain

Pierwszym krokiem mo?e by? instalacja toolchaina, który mo?na pobra? za darmo ze strony Codesourcery. Poszukiwa? nale?y pakietu o nazwie Sourcery G++ Lite Edition for ARM w wersji EABI (tak zwany bare-metal).

W chwili pisania tego artyku?u najbardziej aktualna wersja to Sourcery G++ Lite 2009q1-161 for ARM EABI, czyli wersja z pierwszego kwarta?u 2009 roku. Najnowsz? wersj? mo?na znale?? zawsze w taki sposób - Codesourcery > menu Products > Sourcery G++ > Editions > Lite > ARM > Download > wybra? wersj? EABI
CodeSourcery downloadCodeSourcery Download

EABI to skrót od ARM Binary Interface - jest to standard który pozwala ??czy? obiekty i biblioteki stworzone przez ró?ne kompilatory

Proces instalacji nie kryje w sobie ?adnych niespodzianek - pami?ta? nale?y o tym, ?eby zezwoli? na zmodyfikowanie zmiennej PATH w systemie, co jest standardowo wybran? opcj?.

Po zako?czeniu instalacji warto j? przetestowa?. W tym celu nale?y otworzy? systemowy Wiersz polecenia

Wiersz polecenia (w angielskich wersjach systemu Windows - Command Prompt) mo?na otworzy? na kilkana?cie ró?nych sposobów. Dwa najbardziej oczywiste:
1. Start > Uruchom... (Run...) > cmd
2. Start > Wszystkie Programy (All Programs) > Akcesoria (Accessories) > Wiersz polecenia (Command Prompt)

W tym miejscu warto nadmieni? po raz pierwszy, ?e GCC nie b?dzie dzia?a? poprawnie, je?li podawane mu ?cie?ki i / lub nazwy plików / katalogów zawiera? b?d? spacje

Aby przetestowa?, czy kompilator zosta? poprawnie zainstalowany wystarczy wykona? polecenie arm-none-eabi-gcc --version w dowolnym folderze. Je?li instalacja przebieg?a pomy?lnie, naszym oczom powinien ukaza? si? nast?puj?cy komunikat (dok?adna tre?? zale?na oczywi?cie od zainstalowanej wersji)

C:\>arm-none-eabi-gcc --version
arm-none-eabi-gcc (Sourcery G++ Lite 2009q1-161) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Kolejnym testem mo?e by? kompilacja najprostszej mo?liwej aplikacji. W tym celu nale?y stworzy? przy u?yciu dowolnego edytora tekstu gdzie? (pami?taj?c o spacjach w ?cie?ce dost?pu!), na przyk?ad w folderze test na dysku c:, plik main.c o zawarto?ci

int main(void)
{
return 0;
}

Kompilacja pliku wykonywana jest ponownie z Wiersza polecenia przy u?yciu komendy arm-none-eabi-gcc c:\test\main.c (?cie?k? oczywi?cie dopasowa? do swojej sytuacji). Kompilator podzieli si? z nami oczywi?cie swoimi w?tpliwo?ciami dotycz?cymi opcji kompilacji:

C:\>arm-none-eabi-gcc c:\test\main.c
c:/program files/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to 00008018

niemniej jednak po zako?czeniu jego dzia?ania w folderze z którego zosta? wywo?any powinien znajdowa? si? nowy plik o nazwie a.out i rozmiarze oko?o 35kB. Sukces!


Debugger

Kolejnym kroczkiem, ca?kowicie niezale?nym od poprzedniego, mo?e by? instalacja debuggera OpenOCD.

W chwili pisania tych s?ów OpenOCD dost?pny jest w wersji 0.1.0 i jest to pierwszy oficjalny "release". Na stronie projektu OpenOCD (oraz w sekcji Download tej strony) dost?pny jest instalator najnowszej wersji OpenOCD dla systemu Windows (nawiasem mówi?c stworzony przeze mnie [; ). Dodatkowo na stronie projektu mo?na znale?? kod ?ród?owy do samodzielnej kompilacji oraz skompilowan? paczk? dla Linuxa.

Proces instalacji OpenOCD jest w miar? oczywisty - sugeruj? pozostawienie wszystkich opcji instalacji domy?lnych - ca?o?? po zainstalowaniu zajmuje mniej ni? 5MB.

Po zako?czeniu instalacji warto sprawdzi? jej poprawno?? - w Wierszu polecenia, w dowolnym folderze mo?na wykona? komend? openocd --version, co powinno zaowocowa? nast?puj?cym komunikatem (detale zale?ne oczywi?cie od wersji):

C:\>openocd --version
Open On-Chip Debugger 0.1.0 (2009-01-21-21:15) Release

BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS

$URL: https:// This e-mail address is being protected from spambots. You need JavaScript enabled to view it /svnroot/repos/openocd/tags/openocd-0.1.0/src
/openocd.c $

Je?li OpenOCD dzia?a samo w sobie, to mo?na przetestowa? jak spisuje si? w komunikacji z rzeczywistym uk?adem za po?rednictwem interfejsu JTAG. Poniewa? kwestia konfiguracji OpenOCD wykracza poza tematyk? tego artyku?u (w przysz?o?ci planowany osobny tekst na ten temat), skupi? si? na efekcie finalnym. Mój zestaw testowy to makieta z mikrokontrolerem LPC2103 (rdze? ARM7TDMI-S) oraz JTAG-lock-pick. Aby po??czy? si? z uk?adem w Wierszu polecenia wyda? nale?y komend? openocd -f interface/jtagkey.cfg -f target/lpc2103.cfg (pliki konfiguracyjne mog? wymaga? minimalnej modyfikacji - g?ównie w kwestiach szybko?ci rdzenia, która ogranicza te? dozwolon? szybko?? JTAGa). Efektem powinno by? uruchomienie OpenOCD i nast?puj?ce komunikaty:

C:\>openocd -f interface/jtagkey.cfg -f target/lpc2103.cfg
Open On-Chip Debugger 0.1.0 (2009-01-21-21:15) Release

BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS

$URL: https:// This e-mail address is being protected from spambots. You need JavaScript enabled to view it /svnroot/repos/openocd/tags/openocd-0.1.0/src
/openocd.c $
1000 kHz
Info : JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (Manufacturer: 0x787,
Part: 0xf1f0, Version: 0x4)
Info : JTAG Tap/device matched
Warn : no telnet port specified, using default port 4444
Warn : no gdb port specified, using default port 3333
Warn : no tcl port specified, using default port 6666

Istotnym faktem jest to, ?e OpenOCD wci?? jest uruchomiony - okno Wiersza polecenia jest "zablokowane" dopóki oprogramowanie nie zako?czy dzia?ania - albo w sposób naturalny (rozkaz zako?czenia lub b??d uniemo?liwiaj?cy dalsz? prac?), albo w sposób wymuszony (kombinacja klawiszy Ctrl+C). OpenOCD wykorzystywany b?dzie g?ównie jako oprogramowanie wykonuj?ce rozkazy GDB, nic nie stoi jednak na przeszkodzie, aby sterowa? nim za pomoc? telnetu. Oby po??czy? si? z OpenOCD przez telnet konieczne jest otworzenie kolejnego Wiersza polecenia, w który wstuka? nale?y polecenie telnet localhost 4444, co zaowocuje po??czeniem z oprogramowaniem nas?uchuj?cym na naszym komputerze na porcie 4444 - po poprawnym po??czeniu tajemnicze oprogramowanie przedstawi si? jako... Open On-Chip Debugger. Prostego testu mo?na dokona? wydaj?c poni?sze komendy:

1. reset a nast?pnie halt, co powinno zaowocowa? nast?puj?c? odpowiedzi?:

> reset
JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (Manufacturer: 0x787,
Part: 0xf1f0, Version: 0x4)
JTAG Tap/device matched

invalid mode value encountered
cpsr contains invalid mode value - communication failure
> halt
target state: halted
target halted in ARM state due to debug-request, current mode: Abort
cpsr: 0x80000097 pc: 0x00000038

Oczywi?cie dla innego rdzenia lub innego uk?adu odpowied? b?dzie inna.

2. poll - komenda pozwalaj?ca zbada? aktualny stan rdzenia, warto?? rejestru statusowego (xPSR) oraz licznika programu (PC). Typowa odpowied? na t? komend? (zak?adaj?c, ?e wcze?niej rdze? zosta? zatrzymany) wygl?da? mo?e na przyk?ad tak:

> poll
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x80000093 pc: 0x00000038

3. reg - w tej formie komenda spowoduje wy?wietlenie zawarto?ci wszystkich rejestrów "ogólnych" rdzenia. Dla ARM7TDMI-S odpowied? wygl?da w sposób nast?puj?cy:

> reg
(0) r0 (/32): 0x00000000 (dirty: 1, valid: 1)
(1) r1 (/32): 0x40001a18 (dirty: 1, valid: 1)
(2) r2 (/32): 0x40001a18 (dirty: 0, valid: 1)
(3) r3 (/32): 0x40001a14 (dirty: 0, valid: 1)
(4) r4 (/32): 0xffffffff (dirty: 0, valid: 1)
(5) r5 (/32): 0xffffffff (dirty: 0, valid: 1)
(6) r6 (/32): 0xffffffff (dirty: 0, valid: 1)
(7) r7 (/32): 0xffffffff (dirty: 0, valid: 1)
(8) r8 (/32): 0xffffffff (dirty: 0, valid: 1)
(9) r9 (/32): 0xffffffff (dirty: 0, valid: 1)
(10) r10 (/32): 0xffffffff (dirty: 0, valid: 1)
(11) r11 (/32): 0xffffffff (dirty: 0, valid: 1)
(12) r12 (/32): 0xffffffff (dirty: 0, valid: 1)
(13) r13_usr (/32): 0x40001af8 (dirty: 0, valid: 1)
(14) lr_usr (/32): 0xa07d0000 (dirty: 0, valid: 1)
(15) pc (/32): 0x400000d8 (dirty: 1, valid: 1)
(16) r8_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(17) r9_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(18) r10_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(19) r11_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(20) r12_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(21) r13_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(22) lr_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(23) r13_irq (/32): 0x00000000 (dirty: 0, valid: 0)
(24) lr_irq (/32): 0x00000000 (dirty: 0, valid: 0)
(25) r13_svc (/32): 0xffffffff (dirty: 0, valid: 0)
(26) lr_svc (/32): 0xffffffff (dirty: 0, valid: 0)
(27) r13_abt (/32): 0x00000000 (dirty: 0, valid: 0)
(28) lr_abt (/32): 0x00000000 (dirty: 0, valid: 0)
(29) r13_und (/32): 0x00000000 (dirty: 0, valid: 0)
(30) lr_und (/32): 0x00000000 (dirty: 0, valid: 0)
(31) cpsr (/32): 0x60000010 (dirty: 0, valid: 1)
(32) spsr_fiq (/32): 0x00000000 (dirty: 0, valid: 0)
(33) spsr_irq (/32): 0x00000000 (dirty: 0, valid: 0)
(34) spsr_svc (/32): 0x80000097 (dirty: 0, valid: 0)
(35) spsr_abt (/32): 0x00000000 (dirty: 0, valid: 0)
(36) spsr_und (/32): 0x00000000 (dirty: 0, valid: 0)
(37) debug_ctrl (/6): 0x05 (dirty: 0, valid: 1)
(38) debug_status (/5): 0x09 (dirty: 0, valid: 0)
(39) comms_ctrl (/32): 0x40000000 (dirty: 0, valid: 0)
(40) comms_data (/32): 0x00000000 (dirty: 0, valid: 0)
(41) watch 0 addr value (/32): 0x00000000 (dirty: 0, valid: 0)
(42) watch 0 addr mask (/32): 0xffffffff (dirty: 0, valid: 1)
(43) watch 0 data value (/32): 0xdeeedeee (dirty: 0, valid: 1)
(44) watch 0 data mask (/32): 0x00000000 (dirty: 0, valid: 1)
(45) watch 0 control value (/32): 0x00000100 (dirty: 0, valid: 1)
(46) watch 0 control mask (/32): 0x000000f7 (dirty: 0, valid: 1)
(47) watch 1 addr value (/32): 0x00000000 (dirty: 0, valid: 0)
(48) watch 1 addr mask (/32): 0x00000000 (dirty: 0, valid: 0)
(49) watch 1 data value (/32): 0x00000000 (dirty: 0, valid: 0)
(50) watch 1 data mask (/32): 0x00000000 (dirty: 0, valid: 0)
(51) watch 1 control value (/32): 0x00000000 (dirty: 0, valid: 0)
(52) watch 1 control mask (/32): 0x00000000 (dirty: 0, valid: 0)

4. step (kilkukrotnie), aby sprawdzi? mo?liwo?? kontrolowania rdzenia. Próba u?ycia tej komendy wymaga oczywi?cie obecno?ci jakiego? programu w pami?ci uk?adu. Przy kolejnych wywo?aniach tej komendy zauwa?y? mo?na zmiany rejestru PC. Przyk?adowo mo?e to wygl?da? tak:

> step
target state: halted
target halted in ARM state due to single-step, current mode: User
cpsr: 0x60000010 pc: 0x400000dc

> step
target state: halted
target halted in ARM state due to single-step, current mode: User
cpsr: 0x60000010 pc: 0x400000e0

> step
target state: halted
target halted in ARM state due to single-step, current mode: User
cpsr: 0x60000010 pc: 0x400000e4

> step
target state: halted
target halted in ARM state due to single-step, current mode: User
cpsr: 0x60000010 pc: 0x400000e8

5. ... w manualu do OpenOCD mo?na znale?? dok?adny opis wielu komend, którymi mo?emy kontrolowa? rdze? lub odczytywa? / zapisywa? pami?? - celem tego artyku?u nie jest jednak wymienienie ich wszystkich (; .


Edytor (IDE)

Finalny krok pozwoli sterowa? prac? wszystkich aplikacji za pomoc? jednego programu. Eclipse umo?liwia wykorzystanie plików makefile do kontrolowania procesu kompilacji. Mo?liwo?? obs?ugi dodatkowych - zewn?trznych - aplikacji umo?liwi uruchamianie w tle OpenOCD, za pomoc? którego mo?na wgrywa? do mikrokontrolera kod wynikowy. Mo?liwo?? debuggowania przy u?yciu GDB u?atwi proces tworzenia oprogramowania i eliminacji b??dów.

Przed rozpocz?ciem u?ywania Eclipse warto zainstalowa? najnowsz? wersj? Java Runtime Environment.

Najnowsz? wersj? Eclipse (w chwili pisania tego artyku?u - 3.4.2 czyli Ganymede SR2) mo?na znale?? zawsze na stronie domowej projektu w sekcji Download. Do tworzenia oprogramowania na procesory ARM potrzebna b?dzie wersja Eclipse IDE for C/C++ Developers.
Eclipse download

Po ?ci?gni?ciu paczki przeznaczonej dla stosownego systemu operacyjnego wystarczy j? rozpakowa? do dowolnego folderu na dysku - Eclipse nie wymaga instalacji. Folderem tym mo?e by? C:\Program Files\Eclipse (; .

Po uruchomieniu Eclipse pojawi si? pytanie o domy?ln? lokalizacj? projektów (Workspace) - wybieraj?c ?cie?k? nale?y zwróci? baczn? uwag?, aby nie zawiera?a ona ?adnych spacji, poniewa? to mo?e przyczyni? si? do myl?cych b??dów kompilacji, na pozór nie maj?cych nic wspólnego z ?cie?kami dost?pu. Z tego wzgl?du proponowana domy?lnie w systemie Windows ?cie?ka typu C:\Documents and Settings\[profil]\workspace nie jest dobrym rozwi?zaniem. Dla celów przyk?adu niech b?dzie to c:\ARM . Po wybraniu ?cie?ki warto zaznaczy? opcj? Use this as the default and do not ask again, dzi?ki czemu pytanie to nie b?dzie pojawia? si? przy ka?dym uruchomieniu edytora. Je?li w przysz?o?ci zajdzie potrzeba zmiany domy?lnego folderu, mo?na tego dokona? za pomoc? File > Switch Workspace > Other... .

Po pierwszym uruchomieniu Eclipse pojawia si? okno powitalne, które pomin?? mo?na przy u?yciu ikony skrajnie prawej ikony - Workbench. Warto w tym momencie przestawi? od razu 2 rzeczy: odznaczy? opcj? Build Automatically w menu Project, oraz odznaczy? opcj? Start a build immediately w Project > Clean.

Poniewa? GCC dla ARMów nie jest w jakikolwiek sposób zintegrowane z Eclipse, przy okazji ka?dego nowego projektu konieczne jest ustawianie kilku opcji od nowa. Niestety nie wszystkie ustawienia przenosz? si? przy okazji kopiowania projektu, wi?c bezpieczniej klikn?? par? razy przy okazji ka?dego nowego projektu.

Aby stworzy? nowy projekt, zgodnie z logik? nale?y wykorzysta? opcj? File > New > C Project. Po nazwaniu projektu - na przyk?ad test - i wybraniu jego typu (Makefile project > Empty Project > -- Other Toolchain --) mo?na od razu klikn?? na Finish. Opcje projektu mo?na ustawia? w menu Project > Properties (albo po klikni?ciu prawym klawiszem myszki na stworzony projekt w Project Explorer po lewej i wybraniu opcji Properties). Zestaw opcji które nale?y zmieni? jest nast?puj?cy:

  1. C/C++ Build - w zak?adce Builder Settings nale?y odznaczy? opcj? Use default build command i do nowo odblokowanego pola tekstowego w zamian make wpisa? cs-make, gdy? tak w?a?nie zwie si? make.exe pochodz?cy z pakietu CodeSourcery.
  2. C/C++ Build > Settings w zak?adce Binary Parsers zaznaczy? nale?y GNU Elf Parser, a nast?pnie - po klikni?ciu tej opcji - w polach tekstowych poni?ej nale?y poda? ?cie?k? do odpowiednich plików pochodz?cych z pakietu CodeSourcery - w przypadku standardowej instalacji pliki te znajduj? si? w folderze C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin\ ( C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin\arm-none-eabi-addr2line.exe , C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin\arm-none-eabi-c++filt.exe ).
Eclipse settings
Eclipse settings
Eclipse settings
Eclipse settings

Poniewa? ka?dy projekt zawiera zawsze pewne typowe i rzadko modyfikowane pliki (makefile, skrypt linkera, startup, ...), proces ich do??czania mo?na przyspieszy?. Zasadniczo poza opcj? klasyczn? - punkt 1 - mo?liwe s? dwa sposoby szybkiego dodawania plików do projektu. Tak wi?c dodawa? pliki do projektu mo?na nast?puj?cymi sposobami:

  1. Klasycznie - tworzy? plik, a zawarto?? wpisa? r?cznie lub skopiowa? z innego ?ród?a. Do takowych dzia?a? wykorzysta? mo?na (standardowe) opcje File > New > ... lub za pomoc? opcji New > ... dost?pnej po klikni?ciu prawym przyciskiem myszy w dowolny folder otwartego projektu.
  2. Masowo - wykorzystuj?c mechanizm importowania plików w Eclipse - File > Import (lub prawym klawiszem w projekt i Import). Aby zaimportowa? pliki / foldery z dowolnego miejsca systemu plików wykorzysta? nale?y opcj? General > File System. Po wybraniu folderu z którego chcemy importowa?, mo?liwe jest wybranie plików i folderów jakie maj? zosta? zaimportowane oraz kilku dodatkowych opcji.
  3. Zewn?trznie - po modyfikacji zawarto?ci folderu projektu i wybraniu opcji File > Refresh (lub prawym klawiszem w projekt i Refresh) wprowadzone zmiany zostan? wykryte i zapisane w projekcie.

Zak?adaj?c, ?e do projektu dodane s? wszystkie potrzebne pliki, ca?o?? mo?na skompilowa? za pomoc? opcji Project > Build All lub w menu kontekstowym projektu Build Project lub - najwygodniej - skrótem klawiszowym Ctrl+B.

Warto pami?ta? o tym, ?e kompilacja - jako proces zewn?trzny wzgl?dem Eclipse - bazuje na zapisanych wersjach plików, a nie na tym co widoczne jest w edytorze. Eclipse przed kompilacj? nie zapisuje i nie ostrzega przed zmodyfikowanymi plikami.

Przebieg procesu kompilacji mo?na ?ledzi? w zak?adce Console, natomiast po zako?czonym dzia?aniu make'a w zak?adce Problems mo?na przejrze? (ewentualne) wykryte b??dy oraz ostrze?enia.


Eclipse + OpenOCD + GDB

Do sprz?gni?cia wszystkich elementów w jedn? ca?o?? brakuje jeszcze dwóch pluginów do Eclipse. Pluginy owe - jak i wszelkie uaktualnienia samego pakietu - mo?na pobra? poprzez menu Help > Software updates.

Pierwsza wtyczka - Eclipse C/C++ GDB Hardware Debugging - nale?y do palety dodatków "firmowych", wi?c jedyne co nale?y zrobi?, to w zak?adce Available Software z dost?pnego drzewa wybra? http://download.eclipse.org/tools/cdt/releases/ganymede > CDT Optional Features > Eclipse C/C++ GDB Hardware Debugging i klikn?? Install. Proces instalacji wtyczki mo?e troch? potrwa? - zale?nie od aktualnego obci??enia serwerów i ??cza.

Drugi z potrzebnych komponentów - Zylin Embedded CDT - wymaga kilku klikni?? wi?cej. Poniewa? wtyczka ta nie jest cz??ci? standardowo dost?pnej palety, nale?y doda? stron? macierzyst? wtyczki do dost?pnych ?róde? aktualizacji. Aby tego dokona?, w zak?adce Available Software nale?y wybra? opcj? Add Site... i wprowadzi? adres http://opensource.zylin.com/zylincdt . Po klikni?ciu OK z drzewa b?dzie mo?na wybra? http://opensource.zylin.com/zylincdt > Uncategorized > Zylin Embedded CDT. Po klikni?ci w Install wtyczka zostania pobrana i zainstalowana.

W tym momencie warto dla pewno?ci zresetowa? Eclipse, aby by? pewnym, ?e zainstalowane w?a?nie wtyczki zostan? poprawnie uruchomione.

Do celów debuggowania aplikacji w Eclipse przewidziany jest inny uk?ad okien. Predefiniowane uk?ady okien w Eclipse zwane s? Perspectives. Kod tworzony jest w C/C++ Perspective, natomiast debuggowanie mo?liwe jest w Debug Perspective. Otworzenie nowego uk?adu mo?liwe jest przez menu Window > Open Perspective > Other... . Uk?ady które ju? zosta?y otwarte mo?na zmienia? w prawym górnym rogu okna Eclipse oraz w menu Window > Open Perspective.

Do Debug Perspective warto doda? zak?adk? deassemblacji - menu Window > Show View > Disassembly. Zak?adk? t? mo?na umie?ci? wed?ug uznania w dowolnej z ramek Debug Perspective.

Pierwszym krokiem w sprz?gni?ciu Eclipse ze sprz?tem jest uruchomienie za jego po?rednictwem OpenOCD. Opcje umo?liwiaj?ce uruchamianie dowolnych zewn?trznych aplikacji poprzez Eclipse znale?? mo?na w menu Run > External Tools. Ikonka tej grupy dost?pna jest równie? standardowo na pasku narz?dziowym. W celu uruchomienia OpenOCD wybieramy wi?c Run > External Tools > External Tools Configurations... i ikonk? New launch configuration (po lewej na pasku narz?dzi nad pust? obecnie list?) (lub opcja New z menu kontekstowego listy) tworzymy nowy element. W zak?adce Main wprowadzi? nale?y ?cie?k? dost?pu do OpenOCD - dla wersji 0.1.0 b?dzie to C:\Program Files\OpenOCD\0.1.0\bin\openocd.exe - oraz argumenty z którymi wywo?any zostanie program, które zale?ne s? od konfiguracji sprz?towej. W moim przypadku (JTAG-lock-pick + makieta z LPC2103) argumenty maj? posta? -f interface/jtagkey.cfg -f target/lpc2103.cfg . Wprowadzon? konfiguracj? warto nazwa? w sposób jednoznaczny w polu Name na górze okna - niech b?dzie to na przyk?ad "OpenOCD + jtagkey + lpc2103". Tak przygotowan? konfiguracj? mo?na zatwierdzi? przyciskiem Apply, a nast?pnie uruchomi? przyciskiem Run. Raz uruchomiona konfiguracja b?dzie pó?niej dost?pna w sposób szybszy, a mianowicie bezpo?rednio poprzez menu Run > External Tools (lub pod ikon? na pasku narz?dzi).

Uruchomione OpenOCD pojawi si? w zak?adce Debug, a komunikaty OpenOCD pow?druj? do zak?adki Console zwi?zanej z tym elementem.

Finalny krok na drodze do ujarzmienia debuggowania w Eclipse to wprowadzenie parametrów dla GDB. Opcje powi?zane z debuggerem dost?pne s? w menu Run > Debug Configurations... . Dost?p do tej grupy opcji mo?liwy jest te? poprzez przycisk Debug, który standardowo znajduje si? na pasku narz?dzi.

W oknie Debug Configurations w?ród dost?pnych na li?cie elementów powinna si? znale?? opcja GDB Hardware Debugging - po jej dwukrotnym klikni?ciu stworzona zostanie nowa konfiguracja powi?zana z tym typem debuggowania.

Konfiguracje powi?zane s? z projektami, wi?c pierwsz? czynno?ci? musi by? przypisanie jednego z otwartych projektów do tej konfiguracji - mo?na to zrobi? bezpo?rednio - wpisuj?c nazw? projektu do pola Project - lub wybieraj?c projekt z listy aktualnie otwartych przyciskiem Browse... . Po wybraniu projektu konieczne jest wybranie pliku wykonywalnego, który b?dzie debuggowany. Ponownie - wzgl?dn? ?cie?k? do pliku mo?na poda? bezpo?rednio w polu C/C++ Aplication, lub wybra? jeden z dost?pnych dla danego projektu plików poprzez przycisk Search Project... .

W nast?pnej zak?adce - Debugger - znajduj? si? ustawienia samego GDB. W zak?adce tej nale?y przede wszystkim wprowadzi? ?cie?k? do samego pliku wykonywalnego GDB - w przypadku standardowej instalacji pakietu CodeSourcery b?dzie to C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin\arm-none-eabi-gdb.exe . Drugim parametrem który nale?y zmieni? w tej zak?adce jest numer portu za pomoc? którego GDB b?dzie komunikowa? si? ze sprz?tem - w przypadku OpenOCD standardowo jest to port o numerze 3333.

Ostatni? porcj? zmian nale?y wprowadzi? w zak?adce Startup, która odpowiada za - zgodnie z nazw? zreszt? - zachowanie GDB po pod??czeniu do sprz?tu. Pierwsz? ramk? która powinna budzi? szczególne zainteresowanie jest ramka Initialization Commands. Opcje Reset and Delay oraz Halt najlepiej zostawi? w spokoju - nie dzia?aj? one prawid?owo z toolchainami dla ARMów. W du?ym oknie tekstowym mo?emy wprowadza? ró?ne komendy które zostan? wykonane po uruchomieniu GDB. Najciekawsz? opcj? jest mo?liwo?? wydawania komend bezpo?rednio dla OpenOCD - uzyska? to mo?na poprzez poprzedzenie komendy s?ówkiem monitor (lub w skrócie mon). Zestaw komend jaki nale?y wyda? jest ?ci?le zale?ny od u?ywanego uk?adu docelowego oraz od efektu jaki chce si? osi?gn??. Zasadniczo po uruchomieniu GDB resetuje si? uk?ad docelowy (a wi?c monitor reset) i zatrzymuje rdze? (poprzez - na przyk?ad - monitor halt lub monitor soft_reset_halt w przypadku np. LPC2000). Je?li w kodzie zasz?y jakie? zmiany konieczne jest za?adowanie do pami?ci uk?adu nowego obrazu. Kusi aby u?y? do tego celu opcji z ramki Load Image and Symbols, niemniej jednak i te opcje niezbyt dobrze wspó?pracuj? z ARMami. Do za?adowania obrazu mo?na wi?c wykorzysta? bezpo?rednio komend? GDB - load - któr? wpisa? nale?y do pola w ramce Initialization Commands. Przedostatnia ramka - Runtime Options - pozwala na ustawienie "jednorazowego" breakpointa w dowolnym miejscu i odpalenie programu po tych wszystkich operacjach. Warto wi?c podej?? do sprawy standardowo - zatrzyma? program na pocz?tku funkcji main, gdy? zwykle nie ma potrzeby debuggowania assemblerowych startupów. W tym celu wystarczy zaznaczy? opcj? Set breakpoint at i w pole tekstowe wpisa? main oraz zaznaczy? opcj? Resume.

W tym momencie warto mo?e napisa? par? s?ów na temat Initialization Commands. Poniewa? toolchain dla ARMów nie obs?uguje opcji resetowania przez GDB, warto stworzy? sobie dwa "zestawy" konfiguracji debuggowania - jedna konfiguracja umo?liwia? b?dzie za?adowanie do procesora nowego obrazu programu, a druga wykorzystywa? b?dzie obraz znajduj?cy si? ju? w pami?ci uk?adu. Ró?ni? b?d? si? tylko obecno?ci? komendy load.

Przyk?adowe komendy inicjalizuj?ce dla LPC2103 i ?aduj?ce program do pami?ci RAM:

monitor reset
monitor soft_reset_halt
monitor mww 0xE01FC040 0x0002
load

Zauwa?y? mo?na dodatkow? komend? mww 0xE01FC040 0x0002, która powoduje zapis (Memory Write Word) warto?ci 0x0002 pod adres 0xE01FC040, który - w ARM7 - odpowiada rejestrowi MEMMAP - warto?? ta w tym rejestrze oznacza zmapowanie pocz?tku pami?ci RAM w obszar wektorów przerwa?, co odpowiada sytuacji gdy ca?y za?adowany program znajduje si? w pami?ci RAM.

W tym momencie gotow? konfiguracj? warto jako? ?adnie nazwa? (na przyk?ad LPC2103 + load) przy pomocy pola na górze okna i zatwierdzi? ca?o?? przyciskiem Apply. Je?li w tle wci?? uruchomione jest OpenOCD mo?na od razu nacisn?? przycisk Debug i przej?? do debuggowania programu! Po pierwszym uruchomieniu danej konfiguracji b?dzie ona dost?pna w wygodniejszy sposób, a mianowicie bezpo?rednio w menu Run > Debug History lub pod przyciskiem Debug na pasku narz?dzi.

Je?li wszystko si? uda?o, po krótkiej chwili w zak?adce Debug poni?ej uruchomionego OpenOCD powinien pojawi? si? proces o ustalonej przez nas nazwie odpowiedzialny za GDB Hardware Debugging, a w nim zatrzymany pojedynczy w?tek Thread [0]. Sukces!

Warto w tym momencie wspomnie? o kwestii konsol dla uruchomionych aplikacji. Wprawne oko podczas uruchamiania GDB zauwa?y kilkana?cie linijek przewijaj?cych si? przez zak?adk? Console i znikaj?cych po pe?nym uruchomieniu. Otó? ka?da z uruchomionych w tle aplikacji ma swój w?asny zestaw zak?adek i danych, a wi?c i konsol. Je?li w zak?adce Debug klikniemy na proces OpenOCD (dok?adniej - na element C:\Program Files\OpenOCD\0.1.0\bin\openocd.exe) to w zak?adce Console pojawi si? aktualna zawarto?? konsoli przyporz?dkowanej dla tego w?a?nie procesu. Konsola ta zaraz po odpaleniu GDB powinna zawiera? mniej wi?cej taki tekst:

Open On-Chip Debugger 0.1.0 (2009-01-21-21:15) Release

BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS

$URL: https:// This e-mail address is being protected from spambots. You need JavaScript enabled to view it /svnroot/repos/openocd/tags/openocd-0.1.0/src
/openocd.c $
1000 kHz
Info : JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (Manufacturer: 0x787,
Part: 0xf1f0, Version: 0x4)
Info : JTAG Tap/device matched
Warn : no telnet port specified, using default port 4444
Warn : no gdb port specified, using default port 3333
Warn : no tcl port specified, using default port 6666
Info : accepting 'gdb' connection from 0
Error: timed out while waiting for target halted
Warn : acknowledgment received, but no packet pending
Warn : target not halted
Info : JTAG tap: lpc2103.cpu tap/device found: 0x4f1f0f0f (Manufacturer: 0x787,
Part: 0xf1f0, Version: 0x4)
Info : JTAG Tap/device matched
requesting target halt and executing a soft reset
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x000000d3 pc: 0x00000000
Warn : memory write caused data abort (address: 0xe01fc040, size: 0x4, count: 0x1)
Runtime error, file "command.c", line 456:

Natomiast je?li w zak?adce Debug wybrany zostanie element odpowiadaj?cy procesowi GDB (czyli C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin\arm-none-eabi-gdb.exe) naszym oczom uka?e si? konsola samego GDB, której zawarto?? powinna wygl?da? mniej wi?cej tak:

target remote localhost:3333
0x00000000 in ?? ()
monitor soft_reset_halt
load

Loading section .text, size 0x1adc lma 0x40000000
Start address 0x40000000, load size 6876
Transfer rate: 13 KB/sec, 6876 bytes/write.
tbreak main
Temporary breakpoint 1 at 0x400001a0: file src/main.c, line 258.
continue

Temporary breakpoint 1, main () at src/main.c:258
258 volatile unsigned int x,max=100000;

Warto zauwa?y?, ?e w zak?adce Disassembly wida? aktualn? instrukcj? C a pod ni? odpowiadaj?cy jej zestaw instrukcji assemblerowych. W zak?adce Variables zauwa?y? mo?na wszystkie zmienne lokalne danej funkcji. Aby doda? zmienne globalne wystarczy klikn?? w obszar tej zak?adki prawym przyciskiem myszy i skorzysta? z opcji Add Global Variables... . W zak?adce Registers po rozwini?ciu elementu Main mo?na natomiast podziwia? rejestry rdzenia.


Epilog

Na tym etapie temat niniejszego artyku?u zosta? wyczerpany - je?li wszystkie kroki przebieg?y poprawnie, mo?liwe jest szybkie tworzenie projektów w Eclipse, kompilowanie ich przy pomocy pakietu CodeSourcery i debuggowanie z pomoc? OpenOCD - czyli w zasadzie wszystko co do szcz??cia potrzebne. No... brakuje faktycznie jeszcze 6 numerów z kolejnego losowania Lotto (;

Artyku? ten na pewno nie jest idealny... O wszelkich zauwa?onych b??dach, nie?cis?o?ciach, brakach, itp. napisz do mnie w komentarzu do artyku?u albo poprzez formularz kontaktowy na stronie - chcia?bym aby ten artyku? odpowiada? potrzebom typowego usera, który dopiero wchodzi w ?wiat 32-bitowych rdzeni ARM, a taki cel mo?e zosta? osi?gni?ty jedynie przy wspó?pracy z odbiorcami tego tekstu! Czekam wi?c na feedback (;

Last Updated on Friday, 12 June 2009 11:31