Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M3 und SWD Debug


von Markus M. (mmax)


Lesenswert?

Hi,

Um Debugmeldungen (einfachen Text) via SWD auszugeben, bin ich auf das 
Tool stlink-trace [1] gestoßen.

Mein erstes Testprogramm lässt eine LED blinken und gibt mir einen Text 
aus, den ich auch in der Konsole sehe. Also passt ja alles.

Das Problem ist nur dass mein Programm am MC offensichtlich nicht mehr 
läuft/startet wenn ich stlink-trace nicht starte. Also nach einem Reset 
blinkt keine LED, erst wenn ich stlink-trace anwerfe. Scheint so als ob 
der MC (STM32F103) in einem "Debug Modus" steht und auf Meldungen via 
SWD wartet.

Im stlink-trace.c Source werden ab der Zeile 394 auch direkt einige ARM 
Register beschrieben, die laut "ARMv7-M Architecture Reference Manual" 
zum "System Control Space" gehören.

Kann es sein dass das Tool nicht mehr sauber aufräumt und deshalb nichts 
mehr geht?
Hat jemand eine Idee wie ich da wieder raus komme? (wenns überhaupt 
daran liegt)

[1] https://github.com/xor-gate/stlink-trace
[2] 
http://www.pjrc.com/teensy/beta/DDI0403D_arm_architecture_v7m_reference_manual.pdf

Herzlichen Dank,
Max

von Markus M. (mmax)


Lesenswert?

Hat niemand eine Idee?

von Felix F. (wiesel8)


Lesenswert?

Wenn du im Debug Modus bist, wird gewöhnlich an der Startadresse oder 
bei der Main ein Breakpoint gesetzt, der die Ausführung stoppt und durch 
ein Event die Debug Probe benachrichtigt. Die Debug Probe cleared 
daraufhin die Pipe und lädt den nächsten korrekten PC, damit das 
Programm weiter laufen kann.

Tl;dr:
Keine Debug Probe -> ewig im Breakpoint gefangen.

Kann im Detail bei dir natürlich abweichen, aber das ist das grobe 
Prinzip dahinter.

mfg

von Jim M. (turboj)


Lesenswert?

Felix F. schrieb:
> Wenn du im Debug Modus bist, wird gewöhnlich an der Startadresse oder
> bei der Main ein Breakpoint gesetzt,

Ja, aber  üblicherweise nicht im Flash sondern in der Debug Hardware, 
also ist der spätestens nach Power-On weg.

ARM CMSIS enthält eine analoge Funktion:
1
/** \brief  ITM Send Character
2
3
    This function transmits a character via the ITM channel 0.
4
    It just returns when no debugger is connected that has booked the output.
5
    It is blocking when a debugger is connected, but the previous character send is not transmitted.
6
7
    \param [in]     ch  Character to transmit
8
    \return             Character to transmit
9
 */
10
static __INLINE uint32_t ITM_SendChar (uint32_t ch)
11
{
12
  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk)  &&      /* Trace enabled */
13
      (ITM->TCR & ITM_TCR_ITMENA_Msk)                  &&      /* ITM enabled */
14
      (ITM->TER & (1UL << 0)        )                    )     /* ITM Port #0 enabled */
15
  {
16
    while (ITM->PORT[0].u32 == 0);
17
    ITM->PORT[0].u8 = (uint8_t) ch;
18
  }
19
  return (ch);
20
}

Im Gegensatz zu oben verlinktem Code wird da vorher geschaut ob ITM 
überhaupt AN ist. Ohne die ersten drei Zeilen (ab Trace enabled) würde 
er sich im
1
while (ITM->PORT[0].u32 == 0);
aufhängen. Was Dein Code wohl tut.

von Markus M. (mmax)


Lesenswert?

Ich will aber meinen MCU natürlich auch ohne Debug Probe (st-link v2) 
benutzen.

Ich kann mich auch via st-util und gdb auf den MC hängen und dort mit 
continue das Programm laufen lassen, das funktioniert auch.

Mit "info break" bekomm ich vom gdb die Meldung - "No breakpoints or 
watchpoints." Gibts noch andere, spezielle Breakpoints die ich via gdb 
einsehen/setzen/löschen kann?

Danke,
Max

von Markus M. (mmax)


Lesenswert?

@turboj:
Jop, das ... das Problem war dass ITM_SendChar hängt, wenn kein SWD 
device verbunden ist. Nehme ich die Ausgabe raus, läuft mein Programm 
wieder. Danke für den Tip!

Werd auch gleich deine ITM_SendChar routine versuchen.

Danke,
Max

von Felix F. (wiesel8)


Lesenswert?

Jim M. schrieb:
> Ja, aber  üblicherweise nicht im Flash sondern in der Debug Hardware,
> also ist der spätestens nach Power-On weg.

Da aber der Standarduser nur billige Hardware mit minimalen Kapazitäten 
hat, stehen solche Informationen zu 99% im Flash (Hexfile wird vor dem 
flashen manipuliert mit entsprechenden Op codes) genauso wie es auch 
beim OP ist. Sein Code wartet auf die Anwesenheit einer Probe, welche 
nicht vorhanden ist.
Ob es jetzt Breakpoints oder was anderes ist, bleibt dabei 
unerheblich...

mfg

von Jim M. (turboj)


Lesenswert?

Felix F. schrieb:
> Ob es jetzt Breakpoints oder was anderes ist, bleibt dabei
> unerheblich...

In dem Falle war es alles andere als unerheblich, denn den Source Code 
kann er korrigieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.