Wir haben ein kleines Embedded-System ohne Video- oder serielle Anschlüsse (d. H. Wir können keinen Text über printf ausgeben).
Wir möchten den Fortschritt unseres Codes durch die Initialisierungssequenz verfolgen.
Gibt es einige einfache Dinge, die wir tun können, um damit zu helfen.
Es läuft kein Betriebssystem, und die Hardware-Plattform ist etwas anpassbar.Welche einfache Methode kann ich verwenden, um einen eingebetteten Prozessor ohne serielle Schnittstelle oder Video zu debuggen?
Antwort
Die einfachste und am besten skalierbare Lösung sind Status-LEDs. Schalten Sie LEDs basierend auf Aktionen um, entweder in binärer Form oder wenn bestimmte Aktionen ausgeführt werden, wenn Sie Ihren Fokus eingrenzen können.
Das leistungsfähigste ist ein Hardware-JTAG-Gerät. Sie müssen nicht einmal Haltepunkte setzen - es genügt, die Anwendung zu stoppen und den Speicherstatus zu überprüfen. Beachten Sie, dass einige Hardwareplattformen keine "ausgefallenen" Optionen wie Speicherüberwachung oder Hardware-Unterbrechungspunkte unterstützen. Ersteres wird normalerweise mit ständigem Stoppen des Prozessors und Lesen des Speichers (verwandelt Ihr 10 MHz-System in ein 1 kHz-System) ausgeführt, während letzteres manchmal mit Code-Ersatz durchgeführt wird (ersetzen Sie den Zielbefehl durch einen anderen Sprung), was manchmal andere Probleme maskiert . Beachten Sie diese Probleme und welche eingebetteten Prozessoren sie anwenden.
Es gibt ein paar Strategien, die Sie einsetzen können, mit dem Debuggen helfen:
Wenn Sie Output-Pins zur Verfügung haben, können Sie sie zu LEDs anschließen (oder einem Oszilloskop) und schalten Sie die Ausgangs-Pins hoch/niedrig, um anzuzeigen, dass bestimmte Punkte im Code erreicht wurden.
zum Beispiel 1 x Blinken könnte Programm geladen, 2 Blinken wird foozbar initialisiert, 3 Blink Eingänge akzeptiert ...
Wenn Sie mehrere Ausgangsleitungen zur Verfügung haben, können Sie eine 7-Segment-LED können mehr Informationen zu vermitteln (Zahlen/Buchstaben statt blinkend).
Wenn Sie die Möglichkeit haben, Speicher zu lesen und etwas RAM zur Verfügung zu haben, können Sie die Sprint-Funktion verwenden, um printf-ähnliches Debuggen durchzuführen, aber anstatt zu einem Bildschirm/seriellen Port zu gehen, wird es in den Speicher geschrieben.
Ein JTAG Debugger ist auch eine Option, obwohl umständlich einzurichten.
Wenn Sie kein JTAG haben, sind die von den anderen vorgeschlagenen LEDs eine gute Idee - obwohl Sie dazu neigen, in einem Test/Rebuild-Zyklus zu landen, um das Problem zu finden.
Wenn Sie mehr Zeit haben und zusätzliche Hardware-Pins und Speicher zur Verfügung haben, können Sie eine serielle Schnittstelle mit niedriger Geschwindigkeit immer mit einem Bit-Bash-Gerät verbinden. Ich habe das in der Vergangenheit ziemlich nützlich gefunden.
Es hängt von der Art des Debuggens ab, das Sie versuchen zu tun - insbesondere, wenn Sie nach einer temporären Ablaufverfolgung suchen oder wenn Sie ein Tool bereitstellen möchten, das als Statusanzeige verwendet werden kann das Leben des Projekts (oder Produkts).
Zum einen kann eine detaillierte Quellenverfolgung und Debugging eines In-Circuit-Debuggers (zB Jtag) sehr hilfreich sein. Sie sind jedoch am hilfreichsten, wenn beim Debuggen Haltepunkte gesetzt und Speicher und Register untersucht werden müssen. Dies ist von geringem Nutzen, wenn es sich um zeitkritische Probleme handelt.
Wenn Sie den Programmstatus bestimmen müssen, ohne einen wesentlichen Einfluss auf die Ausführung Ihres Systems zu haben, ist die Verwendung von LEDs, die an Ersatz-E/A-Pins angeschlossen sind, hilfreich. Diese können auch als Eingang für ein digitales Speicheroszilloskop (DSO) oder Logikanalysator verwendet werden. Diese Technik kann durch Auswahl einzigartiger Impulsmuster, die auf dem DSO identifizierbar sind, leistungsfähiger gemacht werden.
Für ein vielseitigeres Debugging-Tool ist eine serielle Schnittstelle jedoch eine gute Lösung. Um Kosten und Leiterplattenplatz zu sparen, kann es nützlich sein, ein Plug-in-Modul zu verwenden, das die RS232-Konverter enthält.
Wenn Sie versuchen, eine längerfristige Statusanzeige als Teil des normalen Betriebs Ihres Produkts bereitzustellen, sind LEDs wieder eine billige und einfache Methode. In dieser Situation ist es jedoch am besten, Impulsmuster zu wählen, die langsam genug sind, um durch visuelle Inspektion leicht identifiziert zu werden. Dies wird Sie im Laufe der Zeit lernen Sie ein bestimmtes Muster, das "normales" Verhalten darstellt.
Andere haben einige ziemlich gute Ideen vorgeschlagen, die Ausgangspins verwenden, also werde ich nicht vorschlagen, dass, obwohl es eine sehr gute Lösung sein kann, und sehr kosteneffektiv ist. Wenn Ihr Budget und der Zielprozessor dies unterstützen, kann ein Hardware-Trace-System (entweder ein altmodischer Emulator oder ein schickes BDM mit Bus-Snooping-Trace-Unterstützung) für diese Art von Sache großartig sein. Es ist aber sehr teuer.
Sie können problemlos serielle Kommunikation (UARTs) emulieren, indem Sie Bit-Bang von den IO-Pins des Systems verwenden. Haken Sie ihn an einen der Pins der Karte und verbinden Sie ihn dort mit einem RS232-Konverter (TTL-zu-RS232-Konverter sind einfach zu kaufen oder zu bauen), der an die serielle Schnittstelle Ihres PCs geht.
Es war nie auf mich gekommen, ein bisschen hämmern serielle Schnittstelle zu tun. Brillant! – Benoit
Die Idee, ein Bit-knallte Software-UART zu verwenden, ist nett, aber es ist etwas Mühe erforderlich, um einen zu schreiben, und Sie brauchen auch einige freie Timer und Interrupts. Wenn Ihre Hardware eine andere ungenutzte serielle Schnittstelle (SPI, I2C, ..) hat, wäre die Verwendung einfacher. Mit einem kleinen Mikrocontroller könnte man die Schnittstelle auf RS-232 umstellen.
Wenn Sie für das Bit-Banging gehen müssen, könnte eine synchrone Serie eine einfachere Alternative sein, da dies für das Timing nicht kritisch wäre.
Großartige Idee auf dem bit hämmern seriellen i/f – Benoit