Konfigurace OpenOCD
Vytvořili jsme spojení mezi USB portem osobního počítače a JTAG rozhraním mikrokontroléru LM3S800. Abychom mohli debugger plnohodnotně a pohodlně používat, musíme zprovoznit jeho softwarovou část. Hlavním stavebním kamenem bude software open source projektu OpenOCD.
Na obrázku 1.4 je rozkresleno blokové schéma propojení jednotlivých elementů debuggeru. Začneme konfigurovat jednotlivé bloky schématu směrem od procesoru.
Ladicí jednotka uvnitř procesoru je již hotová od výrobce. Její komunikační kanál se světem je JTAG rozhraní, které máme propojené přes obvod FT2232D na USB port počítače. Následuje USB ovladač pro komunikaci s obvodem FT2232D a program OpenOCD.
Program OpenOCD je spouštěn jako TCP/IP server. Konvertuje ladící a monitorovací příkazy na proud nul a jedniček, které jsou odesílány na vstup TDI rozhraní JTAG procesoru a zpět konveruje odpovědi z výstupu TDO. Proces OpenOCD je spuštěn jako TCP/IP server, který implementuje servery protokolů Telnet a GDB. Jakmile bude program OpenOCD zprovozněn, otestujeme obě rozhraní programy telnet a gdb.
USB FT2232 driver
Nainstalujeme ovladač pro USB zařízení FT2232, který je možné získat na webu firmy FTDIhttp://www.ftdichip.com/FTDrivers.htm.
Na stránkách výrobce jsou k dispozici dva typy ovladačů, virtuální sériový port VCP (Virtual Com Port) a ovladač D2XX umožňující přímý přístup k obvodu FT2232. Potřebujeme komunikovat protokolem JTAG, a proto budeme používat ovladač D2XX pro přímou komunikaci s FT2232. Výrobce v dokumentaci uvádí postupy instalace pro různé operační systémy. Operační systém Windows 7 například automaticky stáhne ovladače z internetu a není třeba cokoli instalovat. Při úspěšné instalaci uvidíme nainstalované ovladače virtuálního sériového portu a zároveň ovladač pro konverzi protokolů.
Na obrázku je ukázka nainstalovaných ovladačů pro konverzi protokolů na systému Windows7-64bit (obr. 1.5).
OpenOCD
První verze OpenOCD byla původně vytvořena jako část diplomové práce Dominica Ratha, ale od té doby se proměnila v aktivní otevřený projekt podporovaný vývojáři z celého světa. Hlavním cílem OpenOCD je umožnit ladění, programování a zároveň sledování vnitřních stavů procesoru přímo v aplikaci. Na stránkách OpenOCDhttp://openocd.sourceforge.net/ je ke stažení kompletní dokumentace programu.
OpenOCD podporuje řadu převodníků a velké množství procesorů a pro práci s konkrétním procesorem musí být správně nakonfigurován. Popíšeme si konfiguraci pro prototypovací desku BaseBoard s modulem LM3S800. Součástí OpenOCD je několik adresářů, ve kterých najdeme soubory s příponou cfg a tcl. Soubory s příponou cfg jsou konfigurační soubory OpenOCD a soubory s příponou tcl jsou složitější programy ve skriptovacím jazyku TCL. Budeme se zabývat pouze těmi adresáři, ve kterých budeme něco měnit.
Adresář bin obsahuje spustitelný soubor OpenOCD. Adresář interface obsahuje konfigurace pro různé variace a druhy převodníků USB-JTAG. Všechny konfigurační soubory mají příponu cfg. Pro prototypovací desku BaseBoard si v adresáři interface vytvoříme konfigurační soubor ucsimply.cfg.
interface ft2232 ft2232_vid_pid 0x0403 0x6010 ft2232_device_desc "Dual RS232" ft2232_layout "usbjtag" ft2232_latency 2
První řádek definuje typ použitého rozhraní a specifikuje jméno driveru. Hodnoty identifikátorů ft2232_vid_pid identifikují dodavatele a výrobek (vendor ID a product ID). Pokud nejsou zadány, tak OpenOCD použije identifikátory výrobce obvodu. Hodnota ft2232_device_desc slouží jako popis převodníku. Hodnota ft2232_layout specifikuje, jak jsou k pinům obvodu FT2232 přiřazeny JTAG signály. Hodnota ft2232_latency udává zpoždění při čtení dat převodníku FT2232 z USB v milisekundách. Doporučená hodnota je 2ms, ale některé systémy ji mohou mít i delší.
V adresáři target vybereme cílový procesor, se kterým budeme komunikovat. Pracujeme s mikrokontrolérem LM3S800, použijeme proto soubor lm3s800.cfg.
Program OpenOCD se po spuštění pokusí najít soubor openocd.cfg z něhož si načte konfigurační údaje. Vytvoříme si takový soubor a umístíme ho do adresáře projektu.
# include uCSimply interface config source [find interface/ucsimply.cfg] # include TARGET config source [find target/lm3s800.cfg] # jtag speed jtag_khz 500 jtag_nsrst_delay 100 #LM3S800 Evaluation Board has only trst reset_config trst_only
Komentář začíná znakem #. Nejdříve definujeme soubor s konfigurací převodníku. Následuje specifikace jména konfiguračního souboru cílového procesoru. Hodnota jtag_khz nastaví komunikační frekvenci a jtag_nsrst_delay definuje zpoždění komunikačního rozhraní JTAG po resetu. Hodnota reset_config nastavuje způsob implementace resetu. Může nabývat hodnot trst_only což znamená reset JTAG rozhraní, srst_only reset celého procesoru nebo kombinace těchto voleb. V našem případě je implementován pouze reset JTAG rozhraní.
Nyní si otestujeme OpenOCD bez grafického rozhraní, pouze z příkazové řádky. Prototypovací deska je připojená na PC, napájení je zapnuté a JTAG signály procesorového modulu LM3S800 jsou připojené na výstupy obvodu FT2232D.
Nakopírujeme soubor openocd.cfg přímo k souboru bin\openocd.exe a ten spustíme z příkazové řádky. Pokud jsme postupovali správně, měli bychom vidět následující výstup:
Open On-Chip Debugger 0.4.0 (2011-12-27-20:30) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html 500 kHz jtag_nsrst_delay: 100 trst_only separate trst_push_pull Info : device: 4 "2232C" Info : deviceID: 67330064 Info : SerialNumber: A Info : Description: Dual RS232 A Info : clock speed 500 kHz Info : JTAG tap: lm3s800.cpu tap/device found: 0x2ba00477 (mfg: 0x23b, part: 0xb a00, ver: 0x2) Info : lm3s800.cpu: hardware has 6 breakpoints, 4 watchpoints
Výpis zobrazí skutečnou konfiguraci OpenOCD a informace o počtu breakpointů a watchpointů. Breakpoint je místo v paměti programu, kde se má naše aplikace zastavit. Watchpoint zastaví program pokud čte nebo zapisuje do námi definované proměnné.
GDB a Telnet klient
Jak již bylo uvedeno v předchozím textu, OpenOCD vytvoří po spuštění dva TCP/IP servery a sice server Telnet a server GDB.
Telnet server v programu OpenOCD naslouchá na portu 4444. Program telnet má systém Windows ve svých předinstalovaných programech nebo můžeme použít třeba program Putty. V dokumentaci OpenOCD jsou popsány všechny příkazy, které lze použít při komunikaci s OpenOCD přes rozhraní Telnet. Program telnet lze spustit z příkazové řádky takto:
telnet localhost 4444
Podrobněji si vyzkoušíme příkazy debuggeru GDB, které později využijeme i v grafickém vývojovém prostředí. GDB server v OpenOCD naslouchá na portu 3333. Pro komunikaci s GDB serverem použijeme program arm-none-eabi-gdb.exe od CodeSourcery. Přesuneme se do pracovního adresáře projektu a z příkazové řádky spustíme program arm-none-eabi-gdb.exe. Po jeho spuštění se dostaneme do konzole v níž můžeme zadávat příkazy pro OpenOCD jako při komunikaci přes telnet rozhraní. Jen je před nimi nutné uvést slovo monitor. Ostatní příkazy jsou určeny pro GDB.
# připojí GDB klienta k serveru OpenOCD target remote localhost:3333 # reset a zastavení procesoru monitor reset halt # pauza 500ms monitor wait 500 # softwarový reset a zastavení cpu monitor soft_reset_halt # nahraje program do paměti programu monitor flash write_image erase ./Debug/blink-led.elf # nastaví breakpoint na funkci main thbreak main # spustí procesor continue
Nejprve připojíme gdb klienta k serveru OpenOCD příkazem target s uvedením hosta a portu, na kterém OpenOCD naslouchá. Je zřejmé, že OpenOCD a gdb klient nemusí běžet na stejném počítači.
Další příkaz resetuje a zastaví procesor. Příkaz monitor flash nejprve celou paměť smaže a následně zapíše program. Cesta k souboru s příponou elf je brána relativně k adresáři projektu.
Tyto příkazy opíšeme do konzole a jednotlivě spustíme. Dostaneme procesor do stavu, kdy bude mít nahraný program ve Flash paměti a bude zastaven na začátku funkce main. Když napíšeme příkaz continue, program se spustí.