Forum: Mikrocontroller und Digitale Elektronik ARM Cortex M3 und ITM Interface


von Alexander S. (alexanders)


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.

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.