Home Articles ARM ARM toolchain - tutorial
ARM toolchain - tutorial
User Rating: / 308
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

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 (; .



Last Updated on Friday, 12 June 2009 11:31