2017-02-14 2 views
2

Versuchen, einen Haltepunkt an einer bestimmten Position zu setzen und eine Triggerbedingung zu setzen, die auf dem Wert eines der Register basiert, z. R1 (Cortex-R-Familie CPU).Verwenden von Registern in Knickpunktbedingungen mit Trace32

Gibt es eine Möglichkeit, dies in trace32 zu tun? Wie lautet die Syntax für die Bedingung?

+0

Entschuldigung, können Sie klarstellen, was mit einer "Trigger-Bedingung" gemeint ist, meinen Sie, dass "dieser Breakpoint die Ausführung nur stoppen soll, wenn R1 == bestimmter Wert?" Wenn dies der Fall ist, ist die einzige Möglichkeit, die ich sehe, das Setzen eines Haltepunkts, der ein Practice-Skript startet, und dieses Übungsskript kann die Triggerbedingungen überprüfen und somit die Ausführung auf dem Prozessor fortsetzen (using a " gehe "command" oder stoppe die Skriptausführung und gebe die Kontrolle an den Benutzer frei. Bitte beachten Sie, dass dies einen gewissen Einfluss auf die Ausführungszeit hat. – juansolsona

+0

Ich meine regulären Programm Haltepunkt mit einer Bedingung. Es ist einfach mit Bedingungen, die statische oder nicht optimierte Stack-Variablen beinhalten. Es sieht nicht so offensichtlich aus, warum die Register in einem Zustand anders sein sollten - vielleicht fehlt mir einfach die richtige Syntax, um auf ein Register zu verweisen. T32 verwendet 'register.xxx', um sie zu manipulieren..habe kein Konstrukt mit einem Register gesehen, das jedoch in ein "Beobachtungs" -Fenster gesetzt werden kann –

Antwort

3

Sie können Registerwerte auch im Zustand eines Breakpoints überprüfen.

Bitte beachten Sie jedoch, dass bedingte Breakpoints immer das Laufzeitverhalten Ihres Chips stören. Das bedeutet, dass Ihre Ziel-CPU immer an der Haltepunktposition stoppt, dann wertet der Debugger die Bedingung aus und startet die CPU neu, wenn die Bedingung nicht erfüllt wurde. (Beachten Sie, dass "bedingte Breakpoints" nicht die gleichen sind wie "data-breakpoints" (bestimmter Wert, der an einen bestimmten Ort geschrieben wird). Data-Breakpoints sind nicht aufdringlich für viele Chips (wie Ihr Cortex-R)).

Der grundlegende Trick besteht darin, die PRACTICE-Funktion Register() zu verwenden, um auf ein Kernregister zuzugreifen.

einen Programmhaltepunkt festzulegen, an einer bestimmten Programmstelle anzuhalten und gestoppt bleiben, wenn ein Kern-Register einen bestimmten Wert enthält, einer der folgenden Befehle:

  • Break.Set <prog.addr|symbol> /Program /CONDition Register(<reg.>)==<reg.value>
  • Break.Set <prog.addr|symbol> /Program /VarCONDition \Register(<reg.>)==<value>

ZB:

  • Break.Set P:0x1000 /Program /CONDition Register(R0)==0x42
  • Break.Set P:0x1000 /Program /VarCONDition \Register(R0)==0x42

Der Unterschied zwischen den beiden Befehle? Die erste verwendet TRACE32-Ausdrücke, wobei Symbole für ihre Adresse stehen (wie der Linker Symbole sieht). Die zweite verwendet sogenannte HLL-Ausdrücke, wobei Symbole für Variablen wie in der C/C++ - Sprache stehen. (HLL expr. == C-style expr.)

Normalerweise ist es einfacher, Bedingungen in HLL-Ausdrücken zu schreiben (besonders wenn sie mit Variablen arbeiten), während die Verwendung von PRACTICE-Funktionen in TRACE32-Ausdrücken normalerweise einfacher ist.

Sie können die Bedingung auch im Dialog Break.Set einstellen: Klicken Sie auf den Button "advanced" und dann auf Ihre Bedingung im Feld "CONDition". Das HLL-Kontrollkästchen auf der rechten Seite des Feldes "CONDition" definiert, ob Sie einen HLL-Ausdruck verwenden oder nicht.

Verwandte Themen