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.