Page 3 of 6
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 (; .
|