ARM Register View für Eclipse - EmbSysRegView
Transcrição
ARM Register View für Eclipse - EmbSysRegView
BACHELORARBEIT ARM Register View für Eclipse ausgeführt von Ing. Robert Haslinger Begutachter: Dipl. Ing. Michael Kramer Wien, 29.1.2009 Ausgeführt an der FH Technikum Wien Studiengang ICSS Eidesstattliche Erklärung „Ich erkläre hiermit an Eides Statt, dass ich die vorliegende Arbeit selbständig angefertigt habe. Die aus fremden Quellen direkt oder indirekt übernommenen Gedanken sind als solche kenntlich gemacht. Die Arbeit wurde bisher weder in gleicher noch in ähnlicher Form einer anderen Prüfungsbehörde vorgelegt und auch noch nicht veröffentlicht.“ ____________________ Ort, Datum _________________________ Unterschrift Kurzfassung Eclipse inklusive dem CDT Plug-In für die C/C++ Entwicklung kann in Verbindung mit einer GNU Toolchain für die Entwicklung von Embedded Systems, wie zum Beispiel einem Board mit CortexM3 Core von ARM, verwendet werden. Diese Arbeit bietet einen Einblick wie diese Teile zusammenarbeiten um eine Open Source Entwicklungsumgebung unter Windows zu erzeugen. In der Embedded Device Entwicklung verbringen Entwickler sehr viel Zeit damit Bits in Registern zu setzen um die Hardware zu konfigurieren. Noch mehr Zeit wird aufgewandt falsch gesetzte Bits durch debuggen zu finden. In dieser Arbeit wird eine Register View implementiert, die die Register in strukturierter Weise auflistet, und es erlaubt Bit Felder innerhalb eines Registers anzuzeigen und die darin enthaltenen Werte mit einer Interpretation zu versehen. Schlagwörter: ARM, Cortex-M3, Eclipse, CDT, Register View, Debug Abstract With Eclipse including CDT, a Plug-In for C/C++ development, and a GNU Toolchain it is possible to develop software for embedded systems. This thesis provides a view into how these parts work together to build an open source development environment for windows. Developers in the embedded spend lot of time manipulating bits in registers. Much more time is used finding wrongly set bits through debugging. This thesis implements a register view, which displays registers in a structured way, and allows listing of bit fields within registers. Each of the bit fields is capable of displaying an interpretation of the value. Keywords: ARM, Cortex-M3, Eclipse, CDT, Register View, Debug Inhaltsverzeichnis 1 2 Entwickeln mit freier Software für den Cortex-M3 ........................................................... 1 1.1 Eine OpenSource Entwicklungsumgebung ................................................................. 1 1.2 Die Anwender .............................................................................................................. 1 1.3 Die Aufgabe ................................................................................................................. 2 Eclipse als IDE für Embeded Devices ................................................................................ 3 2.1 Einrichten einer Entwicklungsumgebung .................................................................... 3 2.1.1 Java ....................................................................................................................... 3 2.1.2 Eclipse .................................................................................................................. 3 2.1.3 CDT Plug-In ......................................................................................................... 4 2.1.4 GNUARM Plug-In ............................................................................................... 5 2.1.5 GNU Compiler Toolchain .................................................................................... 7 2.1.6 Stellaris Virtual COM Port Driver ....................................................................... 8 2.1.7 OpenOCD ............................................................................................................. 8 2.1.8 Erstellen eines Beispielprogramms ...................................................................... 8 2.2 Speicheraufbau der CortexM3 ................................................................................... 13 2.2.1 2.3 Lösungsansatz ............................................................................................................ 14 2.3.1 Memory View erweitern / Neue View erstellen ................................................. 14 2.3.2 Wann ändert sich der Speicherinhalt .................................................................. 16 2.3.3 Zugriff auf den Speicher während des Debuggens ............................................. 16 2.3.4 Aufbereitung der Daten für die View ................................................................. 16 2.4 Umsetzung des Prototypen ........................................................................................ 16 2.4.1 Implementierung der View ................................................................................. 16 2.4.2 Aufbau des DataModel für LM3S8962 .............................................................. 17 2.4.3 DebugEvent Benachrichtigung ........................................................................... 18 2.4.4 Auslesen des Speichers ....................................................................................... 19 2.4.5 Interpretation der Werte...................................................................................... 20 2.5 3 Memory Mapped Ports ....................................................................................... 14 Ergebnis ..................................................................................................................... 21 2.5.1 Gcc CortexM3 fähig, Code Sourcery gdb nötig ................................................. 21 2.5.2 ARM RegisterView Prototyp ............................................................................. 21 Open Source immer attraktiver......................................................................................... 22 3.1 Ausblick ..................................................................................................................... 22 Literaturverzeichnis .................................................................................................................. 23 Abbildungsverzeichnis ............................................................................................................. 24 Anhang A: OpenOCD Konfigurationsfiles .............................................................................. 25 2 1 Entwickeln mit freier Software für den Cortex-M3 Die Idee zu dieser Arbeit entstand aus dem Bedarf heraus die in der FH eingesetzte Hardware und die dazugehörige Software Toolchain zu erneuern. Ein C167 wird bis heute in der Lehrveranstaltung benutzt. Er ist ein 16bit Prozessor und wurde von Siemens als Nachfolger des C166 entwickelt. Das er nicht mehr produziert wird ist Grund dafür sich auf die Suche für einen zeitgemäßen Nachfolger zu machen. Mit dem Wechsel des Mikrocontrollers geht auch der Wechsel der Entwicklertoolchain und der Entwicklungsumgebung einher. Hier liegt das Augenmerk auf einer möglichst freien und Quelloffenen Variante. Einer der möglichen Nachfolgekandidaten ist ein Cortex-M3 von ARM. Für diese Architektur gibt es eine GNU Entwicklertoolchain. In weiterer Folge dieser Arbeit wird der LM3S8962 von Luminary Micro verwendet. 1.1 Eine OpenSource Entwicklungsumgebung Als Entwicklungsumgebung ist Eclipse mit CDT, der Erweiterung zur C IDE angedacht. Eclipse mit CDT ist hervorragend geeignet um C/C++ Projekte zu entwickeln. Es bietet einen Editor mit Autovervollständigung, Compilerintegration und einen integrierten Debugger. Bei der Embedded Entwicklung können all diese Fähigkeiten genutzt werden. Ein weiteres Feature von CDT ist die Unterstützung von Debugging von entfernten Geräten, auch Remote Debugging genannt. Hierbei wird über einen GDB Proxy und JTAG eine Verbindung zum Embeded Device hergestellt. Da die Embedded Entwicklung sehr Hardware-nahe ist und die integrierte Peripherie über Register konfiguriert werden, ist es bei der Fehlersuche oft sehr mühsam nur über die Memory View von Adresse zu Adresse zu springen um den Inhalt der Peripherie Register zu überprüfen. In kommerziellen IDEs ist eine Ansicht, die für den jeweils ausgewählten Chip die zur Verfügung stehenden Peripherie Register auflistet und deren aktuellen Werte während des Debuggens anzeigt vorhanden. 1.2 Die Anwender Die Verfügbarkeit einer Peripherie Register Ansicht würde helfen eine Schwachstelle in CDT für den Embedded Bereich auszumerzen, und der quelloffenste Lösung eine Chance zu geben. Atmels AVR32 Studio basiert ebenfalls auf Eclipse besitzt so eine Ansicht, und ist frei verfügbar, allerdings nicht quelloffen. Die ersten Benutzer dürften somit die Durchführer, sein es nun Lektoren oder Studenten, dieser Evaluierung sein. Sollte die Evaluierung zum Ergebnis haben, daß der Cortex-M3 samt GNU Toolchain und Eclipse die neue Plattform für die Lehrveranstaltung wird, werden wohl noch so manche Studenten Anwender dieser Ansicht sein. Auf alle Fälle wird es ein Beitrag an die Embedded entwickelnde Open Source Gemeinde sein, deren Alltag damit hoffentlich ein wenig bequemer wird. 1 1.3 Die Aufgabe Es besteht also der Bedarf nach einer Strukturierten Anzeige der Peripherie Register während des Debuggens in Eclipse. Das Datenblatt des LM3S8962, zu finden unter [Lum08], definiert mehr als 1000 Register. Diese in einer Liste anzuzeigen würde den Zugriff auf die Register zwar erleichtern aber aufgrund des Umfangs keine Übersicht bieten. Um die Ansicht vernünftig nutzen zu können, müssen die Register zu den Ports und die Ports zu PortGruppen gruppiert werden. Ein einzelnes Register wiederum, wird unterteilt in einzelne Felder. Das GPIODATA Register ist 32Bit lang und besitzt ein einziges Feld mit dem Namen DATA das aus den Bits 7-0 besteht. GPIODATA DATA Abbildung 1: Das GPIODATA Register, nach [Lum08] Das GPTMTAMR Register, das zur Konfiguration der General-Purpose Timers dient, hat 3 Felder deren Wert jeder für sich wichtig ist um zu verstehen wie der Timer konfiguriert ist. GPTMTAMR TAAMS TACMR TAMR Abbildung 2: Das GPTMTAMR Register, nach [Lum08] Daraus ergibt sich folgender Aufbau der Ansicht, in weiterer Folge View genannt: PortGruppe, dient nur zur Gruppierung von Ports gleicher Art GPIOs PortA … Einer von mehreren möglichen Ports in einer Gruppe (enthält Basisadresse) Register für PortF PortF GPIODATA DATA (bits 7-0) Feld mit 8 Bit innerhalb von GPIODATA GPIODIR GPIOIS … PortG Abbildung 3: Aufbau der Register View Bei den BitFeldern soll es zusätzlich möglich sein, eine Interpretation der Werte auszugeben. Das lässt sich gut veranschaulichen, wenn dem GPIODATA Register ein weiteres Feld 2 hinzugefügt wird. Dieses Feld, besteht nur aus Bit0, und ist für das ein- beziehungsweise ausschalten des Leds auf dem Evaluation Board verantwortlich. Aussehen soll das angezeigte Feld bei ausgeschaltetem Led wie in Abbildung 4. DATA (bits 7-0) LED0 (bit 0) 0 Led ausgeschaltet Abbildung 4: Interpretation des Wertes 0 Beziehungsweise bei eingeschaltetem Led wie in Abbildung 5. LED0 (bit 0) 1 Led eingeschaltet Abbildung 5: Interpretation des Wertes 1 Diese Interpretierung ist vor allem bei kurzen Bitfeldern mit einer aufzählbaren Menge an definierten Werten sinnvoll, um sich einen Blick ins Datenblatt nach jedem Debug Step zu ersparen. Die Anzeige der Werte soll mit dem Start einer Debug Session beginnen, beziehungsweise mit der ersten Unterbrechung und beim Beenden des zu debuggenden Programms wieder aufhören. Bei jedem Debug Step sollen sich die sichtbaren Werte automatisch aktualisieren. 2 Eclipse als IDE für Embeded Devices 2.1 Einrichten einer Entwicklungsumgebung Die Anleitung zum Download und Installation der Tools die benötigt werden um zum einen Eclipse um eine Ansicht zu erweitern, als auch ein C Programm direkt auf dem LM3S8962 laufen zu lassen und zu debuggen wird hier anhand von Windows beschrieben. Getestet wurde es mit der 32Bit wie auch der 64Bit Variante von Windows Vista. 2.1.1 Java Java ist die grundlegende Voraussetzung um Eclipse überhaupt starten zu können. Eclipse ist in der Sprache Java geschrieben und benötigt die Java Runtime um zu laufen. Da das Ziel die Erweiterung von Eclipse um eine View ist, und dazu Java Entwicklungswerkzeuge wie der Compiler und der Debugger notwendig sind, wird statt der Java Runtime das Java Development Kit benötigt. Für diese Arbeit wurde das „Java SE Development Kit 6u11“ verwendet. Informationen zu Java finden sie zum Beispiel in [Chr09]. 2.1.2 Eclipse Eclipse begann als IDE für Java und ist mittlerweile zu einem offenen Framework zur Entwicklung von Software nahezu aller Art herangewachsen. Es besteht seit Version 3.0 aus 3 einem Kern der die Plug-In lädt um Funktionalität zur Verfügung zu stellen. Im Falle der Java IDE das Plug-In „JDE“. Weiterführende Infos zu Eclipse finden sich zum Beispiel in [Ber08]. Nach der Installation von Java kann Eclipse installiert werden. Da die neue Ansicht, in Eclipse „View“ genannt, eine neue Funktionalität darstellt, muss dafür ein neues Plug-In geschrieben werden. Es gibt ein Paket von Eclipse das speziell für dieses Aufgabengebiet zusammengestellt wurde und alle nötigen Tools, sowie den Sourcecode der Eclipse Plug-In beinhaltet. Es nennt sich „Eclipse for RCP/Plug-in Developers“. Für das View Plug-In wird hierzu die Version Ganymed-SR1 (3.4.1) verwendet die auf der Eclipse Homepage downgeloadet werden kann. Ausgeliefert wird Eclipse in Form eines Zip Files das an einen beliebigen Ort zu entpacken ist. Gestartet werden kann Eclipse über eclipse.exe im Eclipse Ordner. 2.1.3 CDT Plug-In Für Entwicklung von Embedded Systemen wird zu einem großen Teil C oder C++ verwendet. Die Funktionalität einer C/C++ IDE kann mit dem CDT Plug-In nachgerüstet werden. Da CDT in der Version „Eclipse for RCP/Plug-in Developers“ nicht enthalten ist, muss sie über die Update Funktionalität von Eclipse nachinstalliert werden. Im Menü „Help““Software Updates…“ den Reiter „Available Software“ auswählen, „C and C++ Development“ auswählen und installieren. Abbildung 6: C/C++ Entwicklungsumgebung nachinstallieren Um ein Device wie den LM3S8962 Remote zu debuggen wird ein weiteres Plug-In benötigt, das zwar ebenfalls ein Teil von CDT ist aber nicht direkt über die Ganymed Update Site bezogen werden kann. Um es installieren zu können, muss folgende Update Site zusätzlich ausgewählt sein: „http://download.eclipse.org/tools/cdt/releases/ganymede“. Danach lässt sich das Plug-In „GDB Hardware Debugging“ wie schon zuvor CDT nachinstallieren. 4 Abbildung 7: GDB Hardware Debugging nachinstallieren 2.1.4 GNUARM Plug-In Damit Eclipse mit der GNU-Arm GCC Toolchain zusammenarbeitet benötigt man noch ein weiteres Plug-In, das GNUARM Plug-In. Dieses Plug-In besteht nur aus einer XML Datei und liefert CDT die nötigen Informationen wie und mit welcher Toolchain ein C Programm für die ARM Architektur übersetzt wird. Leider hat es noch keine Definition für die CortexM3 CPU. Das bedeutet, dass das Plug-In bevor es für den CortexM3 verwendbar ist, noch erweitert werden muss. Dazu benötigt man den Source Code des Plug-In. Der ist im Subversion Repository des SourceForge Projekts [Hol08] abgelegt, und kann mittels dem Subclipse PlugIn für Eclipse oder dem GUI Subversion Client TortoiseSVN ausgecheckt werden. Alternativ dazu besteht die Möglichkeit über das WebSVN von SourceForge ein .tar File mit dem PlugIn downzuloaden. Ist das Plug-In in einem Ordner entpackt kann es über den Menüpunkt „File“ „Import“ in den Workspace geladen werden. Im Import Dialog „Plug-in Developmen“ „Plug-ins and Fragments“ wählen und dann „The target platform“ abwählen und den Pfad zum Plug-In Source Verzeichnis angeben. Abbildung 8: GNUARM Plug-In importieren 5 Anschließend das org.eclipse.cdt.gnuarm Plug-In auswählen und mit Add und Finish importieren. Da dieses Plug-In eine Abhängigkeit zu einem anderen Plug-In besitzt muss auch dieses importiert werden, diesmal aber direkt aus Eclipse heraus. Der Import Vorgang muss also noch einmal durchgeführt werden, und diesmal muss „The target platform“ ausgewählt bleiben und mit Next bestätigt werden. Abbildung 9: Plug-In Abhängigkeit importieren Auf der nächsten Seite nun das Plug-In „org.eclipse.cdt.managedbuilder.core“ auswählen, mit „Add“ zum Importieren vormerken und mit „Finish“ bestätigen. Nun muss noch die plugin.xml des Plug-In erweitert werden. Dazu muss die plugin.xml geöffnet und im XML Edit Reiter um den in Abbildung 10 markierten Text erweitert werden. Abbildung 10: plugin.xml um cortex-m3 erweitern Um zu testen ob das Plug-In funktioniert, kann man es wie in Abbildung 11 beschrieben als Eclipse Applikation starten. Ein zweites Eclipse Fenster sollte aufgehen, das das GNUARM Plug-In geladen hat. Abbildung 11: Eclipse Applikation starten 6 2.1.5 GNU Compiler Toolchain Um ein C Programm für den CortexM3 zu erstellen, benötigt man einen Compiler, Linker und noch einige andere Tools. Da die Arbeitsplattform Windows x86 ist benötigen wir eine Sammlung von Tools die unter Windows ausführbar ist, und Code generiert der auf einem ARM CortexM3 lauffähig ist. Diese Art von Codegenerierung nennt sich CrossKompilierung. So eine Sammlung an Tools, in weiterer Folge Toolchain genannt, selbst zu erstellen ist zwar möglich aber von der Komplexität her eine eigene Arbeit da es sich dabei hauptsächlich für Unix geschriebene Tools handelt, die nicht immer ohne Probleme unter Windows zum Laufen zu bringen sind. Selbst eine Toolchain zu kompilieren ist meist nur dann nötig wenn man spezielle Patches benötigt, die in den vielen verfügbaren vorgefertigten Toolchains nicht inkludiert sind. Die Toolchain mit den aktuellsten Tool Versionen ist die von Zylin [Zyl08]. Sie ist in einer Cross-kompilierten Form für Windows verfügbar und beinhaltet folgende Tools in den aufgeführten Versionen. gcc 4.3.2 gdb 6.8 binutils 2.18 newlib 1.16.0 Wie in [GCC09] ersichtlich unterstützt der aktuelle gcc-4.3.2 bereits die CortexM3 CPU und kann somit für den LM3S8962 verwendet werden. Nachdem das File „arm-elf.7z“ runtergeladen wurde, muss der Inhalt des „install“ Ordners im .7z File nach z.B. „C:\RegisterView\mingw“ kopiert werden. Im Unterordner „bin“ befinden sich die ausführbaren Programme der Toolchain. Diese Programme, zum Beispiel gcc.exe werden vom gnuarm Plug-In per default ohne Pfadangabe aufgerufen. Dies sollte aus Gründen der Portierbarkeit des Workspaces auch so belassen werden. Deshalb muss „C:\RegisterView\mingw\bin“ der Umgebungsvariable PATH hinzugefügt werden. Um beim Build Prozess die Source Code Files in der richtigen Reihenfolge zu übersetzen benötigt man noch das Make Tool. Auch hier wird eine unter Windows lauffähige Version benötigt. Zu finden ist es auf der Webseite von MinGW unter dem Filenamen „mingw32make-3.80.0-3.exe“. Wichtig bei der Installation ist dass es ebenfalls unter „C:\RegisterView\mingw“ installiert wird damit das .exe File vom System über die PATH Variable gefunden werden kann. Das installierte .exe File im Ordner „C:\RegisterView\mingw\bin“ muss nun noch von „mingw32-make.exe“ nach „make.exe“ umbenannt werden. Weiters wird in den automatisch generierten Makefiles zum Löschen von Dateien der Unix Befehl „rm“ verwendet, den es unter Windows nicht gibt. Auch hier gibt es eine Version für Windows, zu finden unter [Syr04], die in einer Sammlung von für Windows kompilierte Unix Tools enthalten ist. Es wird nur rm.exe benötigt, das sich im Verzeichnis “\usr\local\wbin“ innerhalb des Zip Files findet und nach „C:\RegisterView\mingw\bin“ kopiert werden muss. Der GNU Debugger in der Version 6.8 von Zylin ist leider nicht in der Lage mit dem CortexM3 zu kommunizieren. Deshalb muss zum debuggen der gdb aus der CodeSourcery 7 Toolchain [Cod08] verwendet werden. Dazu muss aus dem Archiv arm-2008q3-66-arm-noneeabi-i686-mingw32.tar.bz von der Homepage von CodeSourcery das File arm-none-eabigdb.exe nach „C:\RegisterView\mingw\bin“ kopiert werden. 2.1.6 Stellaris Virtual COM Port Driver Das LM3S8962 Board wird über ein USB Kabel mit Strom versorgt, und gleichzeitig mit dem PC verbunden. Über die USB Verbindung wird mittels eines Chips von FTDI eine usb-toserial Umwandlung vorgenommen. Am PC wird ein Driver benötigt. Dieser Driver erzeugt einen Serial Port über den der UART0 des Boards angesprochen werden kann. Zu bekommen ist der Driver entweder von der mit dem Evaluierungs-Board mitgelieferten CD oder von der Webseite von Luminary Micro. Ab Version 2.04.06 ist der Luminary FTDI Driver auch unter Vista 64bit lauffähig. 2.1.7 OpenOCD OpenOCD bildet die Schnittstelle zwischen dem gdb und dem Evaluierungs-Board. Über das ft2232 Interface von OpenOCD wird über die USB Verbindung, wie in Abbildung 12 gezeigt, Kontakt zum LM3S8962 aufgenommen. PC Eclipse GDB OpenOCD USB LM3S8962 Abbildung 12: OpenOCD Debug Eine OpenOCD Version die mit dem CortexM3 funktioniert gibt es für Windows kompiliert von Martin Thomas in der Version 20080409 auf seiner Webseite [Mar08]. Enthalten ist OpenOCD in der SVN Version 555 und die benötigten Konfigurations-Files. OpenOCD kann zum Flashen eines Programms auf das Board, sowie auch als DebugServer, verwendet werden. Beide Tätigkeiten benötigen eine speziell angepasste Konfiguration und zum Flashen zusätzlich noch ein Script, die beide im Anhang A zu finden sind. Der Inhalt des Zipfiles und die eben erwähnten Konfigurationsdateien müssen in den Ordner „C:\RegisterView\openocd-20080409“ kopiert werden. 2.1.8 Erstellen eines Beispielprogramms Zum Testen der View eignet sich das klassische Embedded Äquivalent zu Hello World. Das „Blinky“, es macht nichts anderes als ein Led periodisch ein und wieder auszuschalten. Beim LM3S8962 bedeutet das, dass bit0 im Register GPIODATA des Port F der GPIO Ports auf 1 beziehungsweise 0 gesetzt wird. Hierfür muss zuerst ein C Projekt, wie in Abbildung 13 beschrieben, angelegt werden. 8 Abbildung 13: Neues C Projekt anlegen Anschließend muss ein Ordner „src“ im Projekt angelegt werden. Als Nächstes müssen vom EK-LM3S8962 Firmware Development Kit [Mic08] (SW-EKLM3S8962-3740.exe) aus dem Ordner "boards\ek-lm3s8962\blinky" die Files blinky.c, blinky.ld und startup_gcc.c in das „src“ Verzeichnis kopiert werden. Außerdem ist noch das File lm3s8962.h aus dem Verzeichnis „inc\“ notwendig, das ebenfalls ins src Verzeichnis kopiert werden muss. Im File Blinky.c muss nun noch die Include Anweisung auf #include "lm3s8962.h" angepasst werden. Damit das Projekt kompiliert werden kann, sind einige Änderungen an Build Optionen des Projekts zu tätigen. Dabei ist zu beachten, dass für die Konfiguration „Release“ als auch für „Debug“ jeweils getrennt jedes Setting eingestellt werden muss. Zuerst muss auf der Seite der Tool Chain als Current builder „CDT-Internal Builder“ ausgewählt werden. (Siehe Abbildung 14) 9 Abbildung 14: Tool Chain – Current builder einstellen Anschließend müssen in den C/C++ Build Settings die Einstellungen zu Assember, Compiler, Linker und ObjCopyFlash angepasst werden. Für den Assembler muss als Target der cortex-m3 eingestellt werden. Abbildung 15: Assembler Target Einstellungen Beim Compiler Target muss ebenfalls cortex-m3, sowie auch „Generate 16-bit thumb code“ gewählt werden. Abbildung 16: Compiler Target Einstellungen Mit –mfpu=vfp wird dem Compiler gesagt welches Floating Point Format er verwenden soll. Ohne diese Option würde er FPA als Format verwenden und es würde beim Linken zu Fehlern kommen, da die vorkompilierten Librarys mit vfp kompiliert sind. Näheres dazu ist unter [Zyl08] zu finden. Abbildung 17: Compiler Miscellaneous Einstellungen Für den Linker muss das Linker Script aus dem Firmware Development Kit angegeben werden, das speziell für den LM3S8962 ausgelegt ist. 10 Abbildung 18: Linker General Einstellungen Damit der Linker die Objekt Files des Blinky Programms mit denen der Newlib Standardbibliothek verbinden kann, muss der Ordner „C:\RegisterView\mingw\lib\gcc\armelf\4.3.2“ im Library Suchpfad angegeben werden. Abbildung 19: Linker Libraries Suchpfad Zuguterletzt muss der Commandline Parameter von ObjCopyFlash bereinigt werden. Das Feld „${INPUTS}“ am Ende der Zeile muss entfernt werden da sonst das Input File zweimal angegeben wird und sich ObjCopyFlash mit einer Fehlermeldung darüber beschwert. Abbildung 20: ObjCopyFlash Commandline Pattern Nun ist es soweit, nach einem Klick auf „Build All“ wird Blinky kompiliert und die Console sieht, wie in Abbildung 21 gezeigt, aus. 11 Abbildung 21: Console Build Ausgabe Nach dem Übersetzen des Beispielprogramms muss es nun noch auf das Board geflasht werden und danach kann es im Eclipse debugged werden. Damit die Flash und Remote-Debug Funktionalität im Eclipse bequem zur Verfügung steht bietet es sich an die beiden Aufrufe als „Externes Tool“ zu definieren. Dazu muss zuerst wie in Abbildung 11 die Eclipse Applikation gestartet werden da dort auch das LM3S8962 Beispielprogramm laufen wird. In Abbildung 22 und Abbildung 23 wird gezeigt wie ein neues externes Programm hinzugefügt wird und die beiden OpenOCD Aufrufe angelegt werden. Abbildung 22: Externe Tools einbinden Abbildung 23: OpenOCD Flash / Debug 12 Zum Flashen reicht es das Board angesteckt zu haben und über Run External Tools „OpenOCD Flash“ auszuwählen. Um zu debuggen muss stattdessen der „OpenOCD Debug Server“ gestartet werden, und dann über Run „Debug Configurations…“ einmalig ein neuer Debug Eintrag angelegt werden, siehe Abbildung 24, der dann im späteren Gebrauch verwendet werden kann. Abbildung 24: Debug Konfiguration Nun genügt es einen Breakpoint zu setzen, und auf Run Debug History Blinky zu klicken um zu debuggen. 2.2 Speicheraufbau der CortexM3 Der Cortex-M3 besitzt eine festgelegte Speicheraufteilung. Dadurch ist es möglich auf z.B. den Interrupt Controller oder Debug Komponenten über einen einfachen Speicher-Lesebefehl zuzugreifen. Siehe auch [Yiu07]. Der 4GB adressierbare Bereich sieht wie folgt aus: 13 0xFFFFFFFF System Ebene Private Peripherie, inklusive eingebautem Interrupt Controller (NVIC), MPU Kontroll-Register, und DebugKomponenten Externe Geräte Hauptsächlich für externe Peripherie genutzt Externer RAM Hauptsächlich für externen Speicher genutzt 0xE0000000 0xDFFFFFFF 0xA0000000 0x9FFFFFFF 0x60000000 0x5FFFFFFF Peripherie Hauptsächlich als Peripherie genutzt SRAM Hauptsächlich als statischer RAM genutzt Code Hauptsächlich als statischer RAM genutzt 0x40000000 0x3FFFFFFF 0x20000000 0x1FFFFFFF 0x00000000 Abbildung 25: Speicheraufteilung CortexM3, nach [Yiu07] 2.2.1 Memory Mapped Ports Hier interessiert hauptsächlich der Bereich der Peripherie von 0x40000000-0x5FFFFFFF. Dort befinden sich die Register der Peripherie die in der View dargestellt werden sollen. Auch hier genügt ein einfacher Zugriff auf den Speicher um den Wert eines Registers auszulesen. Da die MemoryView in Eclipse diese Funktionalität bereits zur Verfügung stellt ist der erste Ansatz der, in der MemoryView die Stelle zu suchen die den Speicher während des Debuggens aus der DebugSession bzw. dem Gerät liest. // // Turn on the LED. // GPIO_PORTF_DATA_R |= 0x01; 2.3 Lösungsansatz Um zum Inhalt eines Registers zu kommen reicht es also den Speicherinhalt an einer bestimmten Adresse auszulesen. Die im Eclipse bereits enthaltene MemoryView macht genau das. Es ist also sinnvoll sich die Memory View näher anzusehen 2.3.1 Memory View erweitern / Neue View erstellen Die Memory View ist zweigeteilt. Links befindet sich eine Liste der zu beobachtenden Speicheradressen und rechts passend zur ausgewählten Speicheradresse, der Inhalt des Speichers, dargestellt über MemoryViewRenderer. 14 Abbildung 26: Memory View Über die Renderer kann der Speicher wahlweise als Hex, ASCII oder zum Beispiel Integer dargestellt werden. In Abbildung 26 sieht man die Adresse 0x400253FC die dem GPIODATA Register des PortsF entspricht. Im Speicher befindet sich an Bit0 ein 1er, das heißt, LED1 am LM3S8962 leuchtet. Erweiterbar ist die Memory View vor allem über die Renderer, die den Inhalt des Speichers interpretiert darstellen. Dazu gibt es ein einen Artikel mit einem kleinen Beispiel von Samantha Chan, der auf Eclipse.org veröffentlicht wurde, siehe [Sam07]. In diesem Beispiel wird gezeigt wie sich der Speicherinhalt als Baum darstellen lässt, siehe Abbildung 27. Es ist dabei ersichtlich, dass damit nur der Speicher an der angegebenen Speicheradresse fortlaufend ausgegeben werden kann. Abbildung 27: Tree ViewRenderer nach [Sam07] Es besteht die Möglichkeit alle Register in die Memory View einzutragen. Das wäre allerdings viel zu unübersichtlich da es keine Gruppierungen in der linken Liste gibt. Außerdem ist die Memory View dann kaum noch für den normalen Gebrauch verwendbar. Daher ist es sinnvoll eine eigene View zu entwickeln die den Vorgaben von Abbildung 3 entspricht und dadurch eine strukturierte Aufbereitung der Daten bietet. 15 2.3.2 Wann ändert sich der Speicherinhalt Informationen über den Speicherinhalt sind dann verfügbar, wenn eine laufende Debug Session vorhanden ist und diese angehalten wurde. Dies kann entweder durch manuelle Unterbrechung, wie auch durch Breakpoints und Watchpoints geschehen. Ein Zeile für Zeile durchsteppen durch ein Programm bedeutet, aus dem angehaltenen Modus das Programm weiterlaufen zu lassen bis die nächste Zeile im Source Code abgearbeitet wurde und dann erneut die Ausführung zu unterbrechen. Es ist also notwendig mitzubekommen, wenn die Ausführung unterbrochen wurde, um zu überprüfen ob sich an den Registerspeicheradressen etwas geändert hat. Das Debug Plug-In stellt eine Möglichkeit zur Verfügung um bei Statusänderungen einer Debug Session benachrichtigt zu werden. Interessant ist hier primär das SUSPEND Event. Es benachrichtigt wenn ein Programm im Debug Modus angehalten wurde. 2.3.3 Zugriff auf den Speicher während des Debuggens Jedes Mal wenn ein SUSPEND Event auftritt muss jedes Register in der View überprüft werden ob sich sein Inhalt verändert hat. Dieser Speicherzugriff ist in dem Objekt das das Register implementiert enthalten, so dass es sich auf Zuruf selbst darum kümmert seinen Inhalt aktuell zu halten. 2.3.4 Aufbereitung der Daten für die View Da die meisten Register aus Bit Feldern bestehen und es daher wichtig ist auf einen Blick zu erkennen welche Bits gesetzt sind, wird der Inhalt binär dargestellt. Sollten noch keine Daten für ein Register verfügbar sein, das kann passieren, wenn zum Beispiel keine Debug Session existiert oder sie noch nie unterbrochen wurde, wird nichts im Feld Value angezeigt. Ebenfalls leer bleibt in diesem Fall jegliches Feld, das für ein Register definiert ist. 2.4 Umsetzung des Prototypen Eclipse besteht aus einem Kern und vielen Plug-Ins die die Funktionalitäten liefern. Um mit der Register View Eclipse zu erweitern, benötigt man also ein neues Plug-In. Der Name des Plug-Ins lautet „org.eclipse.cdt.armregview“. Um eine neue View zu erzeugen muss man ViewPart extenden. public class ArmRegView extends ViewPart 2.4.1 Implementierung der View Die strukturierte Ansicht wird über eine JFace Komponente, dem TreeViewer realisiert. Dem TreeViewer können mittels TreeViewerColumn Spalten wie in einer Tabelle angefügt werden. Mit Hilfe der Baum Ansicht in der 1. Spalte und zwei weiteren Spalten ist es möglich die in Abbildung 3 beschriebene Strukturierung zu erzeugen. viewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL); viewer.getTree().setLinesVisible(true); 16 viewer.getTree().setHeaderVisible(true); // Register column = new TreeViewerColumn(viewer, SWT.NONE); column.getColumn().setWidth(200); column.getColumn().setMoveable(true); column.getColumn().setText("Register"); 2.4.2 Aufbau des DataModel für LM3S8962 Der TreeViewer ist nur dafür zuständig wie die Daten aussehen. Um zu den Daten zu kommen benötigt er einen IStructuredContentProvider. Dem TreeViewer muss ein Objekt einer Klasse übergeben werden die das Interface IStructuredContentProvider implementiert. Diese Klasse, auch DataModel genannt beliefert den TreeViewer mit den Daten. Die Daten für die RegisterView werden durch folgende Klassen repräsentiert. TreeElement TreeField TreeParent TreeGroup TreeRegisterGroup TreeRegister Abbildung 28: Data Model Klassen Anhand von Abbildung 29, die Abbildung 3 ergänzt, wird verständlich wie die Klassen zusammenarbeiten um die Ansicht zu erzeugen. 17 GPIOs TreeGroup TreeRegisterGroup PortA … … TreeRegisterGroup PortF GPIODATA TreeRegister TreeField TreeRegister GPIODIR TreeRegister GPIOIS … … TreeRegisterGroup PortG Abbildung 29: Klassen-Baum Struktur Mehrere GPIOs werden mithilfe eines TreeGroup Objekts Gruppiert. Es leitet von TreeParent ab und verwaltet somit eine Liste an Kind Objekten. Kinder eines TreeGroup Objekts müssen TreeRegisterGroup Objekte sein. TreeRegisterGroup Objekte gruppieren Register die zu einer Peripherie Einheit gehören. Da sich TreeRegisterGroup ebenfalls von TreeParent ableitet, verwaltet es eine Liste an Kind Objekten, die aus TreeRegister Objekten bestehen müssen. Zur Verfeinerung besteht die Möglichkeit beliebig viele TreeField Objekte an ein TreeRegister Objekt anzuhängen, da TreeRegister ebenfalls von TreeParent abgeleitet ist. Diese TreeField’s bilden die Endknoten dieser Baumstruktur. Sie leiten von TreeElement ab und haben somit keine Kinder. Vater eines TreeField’s ist immer ein TreeRegister, da es seine Aufgabe ist ein TreeRegister feiner unterteilt aufzuschlüsseln. 2.4.3 DebugEvent Benachrichtigung Um wie in 2.3.2 beschrieben vom Debug Plug-In über den SUSPEND Event benachrichtigt zu werden, muss im Debug Plug-In ein EventListener registriert werden. Beim Registrieren muss eine Klasse angegeben werden die IDebugEventSetListener implementiert. Deshalb muss die Klassendeklaration aus 2.4 erweitert werden. public class ArmRegView extends ViewPart implements IDebugEventSetListener Durch das Interface IDebugEventSetListener muss die Methode handleDebugEvents implementiert werden. Der Aufruf um den EventListener zu registrieren und ihm als Callback die eigene Klasse mitzugeben sieht folgendermaßen aus: DebugPlugin.getDefault().addDebugEventListener(this); Zu beachten ist, dass der Aufruf in dieser Form nur innerhalb der Klasse die IDebugEventSetListener implementiert funktioniert. 18 2.4.4 Auslesen des Speichers Tritt eine Statusänderung einer Debug Session auf wird wie in 2.4.3 beschrieben die Methode handleDebugEvents aufgerufen. Diesem EventHandler wird ein Array von DebugEvent Objekten mitgeliefert, die Informationen darüber enthalten was sich am laufenden Debug Kontext geändert hat. Enthält es ein SUSPEND Event, wird der komplette Baum nach TreeRegister Elementen durchsucht und deren updateValue() Methode aufgerufen. Damit werden sie veranlasst ihre Werte des Registers zu erneuern. Da das TreeRegister nur den Offset zur TreeRegisterGroup kennt muss zuerst mit dessen Basis Adresse die Adresse des Registers im Speicher berechnet werden. registerAdress=((TreeRegisterGroup)parent).getBaseAdress()+off setAdress; Anschließend wird über eine Utility Klasse der MemoryView von der aktiven Debug Session ein Objekt erzeugt das den gewünschten Speicherblock repräsentiert. IAdaptable context = DebugUITools.getDebugContext(); IMemoryBlockRetrieval retrieval = MemoryViewUtil.getMemoryBlockRetrieval(context); CMemoryBlockRetrievalExtension cdtRetrieval = (CMemoryBlockRetrievalExtension) retrieval; IMemoryBlock mem = (CMemoryBlockExtension) cdtRetrieval.getMemoryBlock(registerAdress, 4); Mithilfe der getBytesFromAddress Methode wird der Inhalt des Registers in Form eines MemoryByte Arrays ausgelesen und in einen einzelnen long Wert umgerechnet und als value Variable der Klasse gespeichert. MemoryByte[] membyte = ((CMemoryBlockExtension)mem) .getBytesFromAddress(BigInteger.valueOf(registerAdress), 4); value = (long)(membyte[3].getValue()); value = ((long)value << 8) + (long)(membyte[2].getValue()); value = ((long)value << 8) + (long)(membyte[1].getValue()); value = ((long)value << 8) + (long)(membyte[0].getValue()); Nachdem alle TreeRegister Felder aktualisiert wurden, wird der TreeViewer angewiesen die Darstellung mit aktuellen Daten aus dem DataModel zu aktualisieren. Dieser Aufruf muss über asyncExec erfolgen da er nur im GUI Thread funktioniert. 19 Display.getDefault().asyncExec(new Runnable() { public void run() { viewer.refresh(); } }); 2.4.5 Interpretation der Werte Oft sind nur wenige Bits eines Registers relevant. Ein TreeField ermöglicht es Bit Felder innerhalb eines Registers zu definieren. Die relevanten Bits können somit als eigener Eintrag in der Ansicht dargestellt werden, wodurch es möglich ist auf einen Blick die wichtige Information herauszulesen. Es ist möglich überlappende Definitionen zu erstellen, um zum Beispiel ein 8 Bit breites DATA Feld von Bit 0 bis Bit 7 zu definieren, und zusätzlich das Bit 0 erneut als LED1 aufzulisten. Dies ermöglicht eine Ansicht der 8 Relevanten Bits, die im Falle eines GPIO Ports die 8 Pins dieses Ports wiederspiegeln, sowie auch die Auflistung von Bit 0 mit seiner bekannten Funktion als LED1. Für jedes Bit Feld besteht die Möglichkeit eine Interpretation zu definieren. Eine Interpretation ist vor allem bei kurzen Feldern wie zum Beispiel beim LED1 sinnvoll, bei denen alle Bit Kombinationen bekannt und definiert sind. Felder wie das 8 Bit lange DATA Feld mit seinen 256 möglichen Zuständen zu Beschreiben ist nicht sinnvoll. Realisiert wird diese Interpretation mithilfe einer HashMap, die für jedes Bit Feld definiert werden kann. Der Schlüssel der Einträge besteht aus einem String der Dezimalen Repräsentation der Bits. Für das TAMR Feld (Bit 0-1) des GPTMTAMR Registers gibt es 4 mögliche Zustände (00,01,10,11). Somit sind die Schlüssel um den jeweiligen Zustand zu beschreiben (“0“,“1“,“2“,“3“). Zugehörig zum passenden Schlüssel kann ein String zur Beschreibung des Zustandes in der HashMap abgelegt werden. Für das TAMR Feld sieht das wie folgt aus: HashMap<String, String> interpretationsGPT0TAMR = new HashMap<String, String>(); interpretationsGPT0TAMR.put("0", "Reserved"); interpretationsGPT0TAMR.put("1", "One-Shot Timer mode"); interpretationsGPT0TAMR.put("2", "Periodic Timer mode"); interpretationsGPT0TAMR.put("3", "Capture mode"); TreeField GPT0TAMR = new TreeField("TAMR","",(byte)30,(byte)2,interpretationsGPT0TAMR); Soll es für ein TreeField keine Interpretation geben, so wie zum Beispiel bei dem DATA Feld, muss eine leere HashMap beim Konstruktor angegeben werden. 20 In der Spalte Description wird für die Objekte TreeGroup, TreeRegisterGroup und TreeRegister die definierte Beschreibung durch den Aufruf getDescription() ausgegeben. Für ein TreeField wird stattdessen eine Interpretation des Feldwertes durch die Methode getInterpretation() angezeigt. Findet getInterpretation() für den angeforderten Wert keinen Eintrag in der HashMap liefert es einen leeren String zurück. Es ist also nicht notwendig alle möglichen Zustände eines Feldes zu beschreiben, oder die fehlenden mit „undefiniert“ aufzufüllen. Somit ist es möglich die im Datenblatt angegebenen Informationen zur Interpretation der Werte in der Ansicht zu nutzen. Für den Entwickler bringt das eine enorme Entlastung, da er nicht bei jeder Änderung der Daten im Register beziehungsweis im Feld einen Blick in die Dokumentation des Boards werfen muss. Felder deren Bedeutung durch ein anderen Feldes entsteht, müssen das im Beschreibungstext dem User erklären. Eine automatische Auswahl der Bedeutung bedingt durch ein anderes Feld ist nicht möglich. 2.5 Ergebnis 2.5.1 Gcc CortexM3 fähig, Code Sourcery gdb nötig Bei der Toolchain ist es derzeit leider nicht möglich mit Tools aus den offiziellen Sourcen von GDB zu arbeiten. Einziger Ausweg ist der GDB von Code Sourcery. Es wird wohl noch einige Zeit dauern bis die Änderungen in den offiziellen GDB einfließen. Im Gegensatz dazu gelingt es mit dem offiziellen GCC einwandfreien Code für den CortexM3 zu generieren. 2.5.2 ARM RegisterView Prototyp In Abbildung 30 ist der Prototyp zu sehen der im Laufe dieser Arbeit entwickelt wurde. Er setzt die beschriebene Art der Registeranzeige um und erfüllt die in ihn gesetzten Erwartungen. Abbildung 30: Prototyp 21 3 Open Source immer attraktiver Mit einer komplette Open Source Entwicklungsumgebung für den Embedded Bereich mit Hilfe einer GNU Toolchain und Eclipse mit CDT als Entwicklungsumgebung ist mittlerweile sehr gut zu arbeiten. Eclipse und CDT haben einen langen Weg hinter sich und bieten immer mehr Features und Stabilität. Fehlende Features wie das, das diese Arbeit mit einer Peripherie Register Ansicht schließt, werden immer weniger und dadurch für mehr Entwickler und Projekte interessant. 3.1 Ausblick Der Prototyp zeigt wie Register in einer übersichtlichen Form in einer View in Eclipse angezeigt werden können. Bei der Implementierung wurde ein statisches, fix codiertes DataModel verwendet, das einen kleinen Ausschnitt der Register des LM3S8962 zu Demonstrationszwecken anzeigt. Um die View praktisch nutzen zu können muss das DataModel aus einer Datenquelle, zum Beispiel einem XML File, generiert werden. Weiter sollte über einen Konfigurationsdialog eine Möglichkeit geschaffen werden zwischen unterschiedlichen Boards umzuschalten, und die unterschiedlichen Register anderer Boards aufzulisten. 22 Literaturverzeichnis [Lum08] Micro, Luminary. LM3S8962 Microcontroller DATA SHEET. Austin : Luminary Micro, 16. Nov. 2008. [Chr09] Christian, Ullenboom. Java ist auch eine Insel. 8. Auflage. s.l. : Galileo Computing, 2009. 978-3-8362-1371-4. [Ber08] Daum, Berthold. Java-Entwicklung mit Eclipse 3.3. 5. Auflage. s.l. : Dpunkt, 2008. 978-3898645041. [Hol08] Holzke, Wilfried. Eclipse CDT Manged Build Extension for GNU ARM Toolchain. [Online] 15. 10 2008. [Zitat vom: 27. 1 2009.] http://sourceforge.net/projects/gnuarmeclipse/. [Zyl08] Zylin. GCC & GDB binaries. [Online] 2008. [Zitat vom: 27. 1 2009.] http://www.zylin.com/gccbinary.html. [GCC09] GCC. ARM Options - Using the GNU Compiler Collection. [Online] 2008. [Zitat vom: 27. 1 2009.] http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/ARM-Options.html#ARMOptions. [Syr04] Syring, Karl M. GNU utilities for Win32. [Online] 30. 4 2004. [Zitat vom: 27. 1 2009.] http://unxutils.sourceforge.net/. [Cod08] CodeSourcery. Sourcery G++ Lite Edition for ARM. [Online] 2008. [Zitat vom: 27. 1 2009.] http://www.codesourcery.com/gnu_toolchains/arm/download.html. [Mar08] Thomas, Martin. Using OpenOCD and ARMv7 Cortex-M3. [Online] 9. 4 2008. [Zitat vom: 27. 1 2009.] http://www.siwawi.arubi.unikl.de/avr_projects/arm_projects/openocd_cortex/index.html. [Mic08] Micro, Luminary. Firmware Development Packages. [Online] 2008. [Zitat vom: 27. 1 2009.] http://www.luminarymicro.com/products/software_updates.html. [Yiu07] Yiu, Joseph. The Definitive Guide to the Arm Cortex-M3. s.l. : Butterworth Heinemann, 2007. 978-0750685344. [Sam07] Chan, Samantha. Inside the Memory View: A Guide for Debug Providers. [Online] 7. 9 2007. [Zitat vom: 27. 1 2009.] http://www.eclipse.org/articles/article.php?file=ArticleMemoryView/index.html. 23 Abbildungsverzeichnis Abbildung 1: Das GPIODATA Register, nach [Lum08] ........................................................... 2 Abbildung 2: Das GPTMTAMR Register, nach [Lum08] ......................................................... 2 Abbildung 3: Aufbau der Register View .................................................................................... 2 Abbildung 4: Interpretation des Wertes 0 .................................................................................. 3 Abbildung 5: Interpretation des Wertes 1 .................................................................................. 3 Abbildung 6: C/C++ Entwicklungsumgebung nachinstallieren ................................................. 4 Abbildung 7: GDB Hardware Debugging nachinstallieren ........................................................ 5 Abbildung 8: GNUARM Plug-In importieren ........................................................................... 5 Abbildung 9: Plug-In Abhängigkeit importieren ....................................................................... 6 Abbildung 10: plugin.xml um cortex-m3 erweitern ................................................................... 6 Abbildung 11: Eclipse Applikation starten ................................................................................ 6 Abbildung 12: OpenOCD Debug ............................................................................................... 8 Abbildung 13: Neues C Projekt anlegen .................................................................................... 9 Abbildung 14: Tool Chain – Current builder einstellen ........................................................... 10 Abbildung 15: Assembler Target Einstellungen ...................................................................... 10 Abbildung 16: Compiler Target Einstellungen ........................................................................ 10 Abbildung 17: Compiler Miscellaneous Einstellungen ............................................................ 10 Abbildung 18: Linker General Einstellungen ........................................................................... 11 Abbildung 19: Linker Libraries Suchpfad ................................................................................ 11 Abbildung 20: ObjCopyFlash Commandline Pattern ............................................................... 11 Abbildung 21: Console Build Ausgabe .................................................................................... 12 Abbildung 22: Externe Tools einbinden................................................................................... 12 Abbildung 23: OpenOCD Flash / Debug ................................................................................. 12 Abbildung 24: Debug Konfiguration ........................................................................................ 13 Abbildung 25: Speicheraufteilung CortexM3, nach [Yiu07] ................................................... 14 Abbildung 26: Memory View .................................................................................................. 15 Abbildung 27: Tree ViewRenderer nach [Sam07] ................................................................... 15 Abbildung 28: Data Model Klassen ......................................................................................... 17 Abbildung 29: Klassen-Baum Struktur .................................................................................... 18 Abbildung 30: Prototyp ............................................................................................................ 21 24 Anhang A: OpenOCD Konfigurationsfiles debug.cfg #daemon configuration telnet_port 4444 gdb_port 3333 #interface interface ft2232 ft2232_device_desc "Stellaris Evaluation Board A" ft2232_layout evb_lm3s811 ft2232_vid_pid 0x0403 0xbcd9 jtag_speed 10 jtag_nsrst_delay 100 jtag_ntrst_delay 100 #LM3S811 Evaluation Board has only srst #reset_config trst_and_srst reset_config srst_only #jtag scan chain #format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) jtag_device 4 0x1 0xf 0xe #target configuration target cortex_m3 little run_and_halt 0 #flash configuration flash bank stellaris 0 0 0 0 0 # working area working_area 0 0x20000000 0x2000 nobackup 25 flash.cfg #daemon configuration telnet_port 4444 gdb_port 3333 #interface interface ft2232 ft2232_device_desc "Stellaris Evaluation Board A" ft2232_layout evb_lm3s811 ft2232_vid_pid 0x0403 0xbcd9 jtag_speed 10 jtag_nsrst_delay 100 jtag_ntrst_delay 100 #LM3S811 Evaluation Board has only srst reset_config srst_only #jtag scan chain #format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) jtag_device 4 0x1 0xf 0xe #target configuration daemon_startup reset #target target cortex_m3 little run_and_init 0 #flash configuration flash bank stellaris 0 0 0 0 0 flash auto_erase on # working area working_area 0 0x20000000 0x2000 nobackup # script running on reset target_script 0 reset C:\RegisterView\openocd20080409\flash.script 26 flash.script halt sleep 200 flash flash flash flash probe 0 erase_check 0 protect_check 0 info 0 flash write_image ./Blinky.elf 0 elf sleep 200 reset run shutdown 27 28