ARM Cortex M3 und ITM Interface

OP #4450859
Lesenswert?
• ▲
▼
Hallo,

ich probiere gerade mit der ITM Schnittstelle des ARM Cores Daten 
schnell auf einen PC übertragen.

Es geht hierbei darum die Caller / Callee Adresse an den PC zu 
übermitteln. Hierzu wurde die Funktion __gnu__mcount_nc überschrieben. 
Der unten stehende Code wird also immer kurz nach dem Aufruf einer 
Funktion ausgeführt.

Das hat jetzt schon längere Zeit ohne Unterbrechungen funktioniert. Nach 
einer nicht nachvollziehbaren Änderung am Code ist eine Datenübertragung 
nur noch eine sehr kurze Zeit am Anfang möglich.

Danach blockiert der folgende Aufruf (auch zu finden in der ARM 
Dokumentation):
1
//Code mit LibopenCM3
2
while (!(ITM_STIM32(0) & ITM_STIM_FIFOREADY));// Diese Zeile blockiert
3
ITM_STIM32(0) = data;
1
//Code in ASM
2
__asm__("Retry: MOV r1, #0xE0000000 ");
3
/* r1 = Stimulus port base */
4
__asm__("LDREX r2, [r1] "); // Diese Zeile liefert immer 0
5
/* Load FIFO full status (Nr. 0) */
6
__asm__("CMP r2, #0 ");
7
/* Compare with full */
8
__asm__("ITT NE ");
9
/*If (not full) */
10
__asm__("STREXNE r2, r0, [r1]");
11
/* Try sending value to port */
12
__asm__("CMPNE r2, #1 ");
13
/* and check for failure */
14
__asm__("BEQ Retry ");

Durch Kontrolle konnte festgestellt werden, dass das Lesen von ITM 
Stimulus Port 0 im Falle des Fehlers immer 0 zurückgibt.

Es wird sichergestellt, das die oberen Zeilen nur nach dem 
Initialisieren der ITM Interfaces ausgeführt werden.

Es wurde versuchsweise ein Mutex (ldrex/strex) implementiert um den Code 
gegen Spinlocks abzusichern, das brachte aber keine Besserung.

Leider fehlt mir nun so ein bisschen die Herangehensweise zum weiteren 
Debuggen und bin auf Eure Meinungen / Anregungen gespannt.

EDITH:

Das Auskommentieren folgender Zeile behebt das Problem:
1
DBGMCU_CR = DBGMCU_CR_IWDG_STOP | DBGMCU_CR_TIM1_STOP | DBGMCU_CR_TIM2_STOP | DBGMCU_CR_TIM3_STOP | DBGMCU_CR_TIM4_STOP | DBGMCU_CR_TIM5_STOP | DBGMCU_CR_TIM6_STOP | DBGMCU_CR_TIM7_STOP | DBGMCU_CR_TIM8_STOP;

Ich verstehe den Zusammenhang zwischen den gestoppten Timern bei einer 
CPU in "Halt"-Modus und der Nichtfunktion der ITM Stimulus 
Schnittstelle.

Gruß

Alexander S.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.