Forum: PC Hard- und Software CooCox IDE debugging STM32F4Discovery


von Paul (Gast)


Lesenswert?

Hi,
ich habe mal ne Frage zu der debug Funktion in der CooCox IDE im 
Zusammenhang mit dem STM32F4Discovery board.
Ich würde gerne irgendwie sehen können wie viel Zeit die Ausführung 
einer Codezeile z.B. bei einem breakpoint benötigt.
Also ich setzt z.B. vor einer for Schleife einen breakpoint und danach 
und möchte dann feststellen wie viel Zeit die Ausführung der for 
Schleife benötigt.
Wie kann man das dort feststellen?

thx
Paul

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

Das kannst du machen indem du einen Timer einstellst und die Werte am 
Ende ausliest. Der Debugger kann das jedoch meines Wissens nach nicht. 
Also du musst das schon selber bauen.

von X2 (Gast)


Lesenswert?

Oder Pin togglen und mit dem Oszi messen

von Uwe B. (derexponent)


Lesenswert?

du kannst dir auch am Anfang und am Ende der For-Schleife jeweils
den aktuellen CPU-TIC-Wert "merken" die Differenz der beiden Werte
entspricht "ungefähr" der Anzahl der CPU-Takte

hier ein Beispiel :
1
//---------------------------------------------------
2
// DEBUG (fuer Zeitmessungen)
3
//---------------------------------------------------
4
volatile unsigned int *DWT_CYCCNT     = (volatile unsigned int *)0xE0001004;
5
volatile unsigned int *DWT_CONTROL    = (volatile unsigned int *)0xE0001000;
6
volatile unsigned int *SCB_DEMCR      = (volatile unsigned int *)0xE000EDFC;
7
uint32_t dbg_tstart;
8
uint32_t dbg_tstop;
9
uint32_t dbg_time;
10
//---------------------------------------------------
11
12
13
void main(void)
14
{
15
16
  //---------------------------------------------------
17
  // DEBUG (fuer Zeitmessungen)
18
  //---------------------------------------------------
19
  *SCB_DEMCR = *SCB_DEMCR | 0x01000000;
20
  *DWT_CYCCNT = 0; // reset the counter
21
  *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter 
22
  
23
24
25
  // hier soll die Zeit gemessen werden
26
  dbg_tstart=*DWT_CYCCNT; // START
27
  for(n=0;n<100;n++) {
28
    // hier deine Funktion
29
  }
30
  dbg_tstop=*DWT_CYCCNT; // STOP
31
32
  // hier das Ergebnis der Messung
33
  dbg_time=(dbg_tstop-dbg_tstart); // Differenz
34
35
  // 1TIC bei 168MHz = 5,9ns
36
37
38
  while(1) {
39
40
  }
41
}

von Paul (Gast)


Lesenswert?

hmm... also ich habe das so mal ausprobiert... das funktioniert leider 
gar nicht, start und stop tic sind leider immer gleich.

von Paul (Gast)


Lesenswert?

...sehr komisch, die Timer funktionieren wohl (LED blinken lassen etc.), 
ich habe das ganze jetzt einfach mit Timer1 als up counter mit prescaler 
1 und period 1 gemacht, vor dem zu beobachtendem code den timer 
gestartet und nach dem code den counter wert geholt, der ist immer 0, 
was nicht sein kann da der code :
1
uint8_t screenBuffer[4800]; //(640*480) / (8*8)
2
uint16_t tileBuffer0[16384]; //(8*8) * 256
3
uint16_t line = 0;
4
uint16_t col = 0;
5
uint16_t screenBufferIndex;
6
uint8_t tileBuffer0LineOffset;
7
uint8_t tileBuffer0Col;
8
uint16_t tileBuffer0Index;
9
10
TIM_Cmd(TIM1, ENABLE);
11
12
for (line = 0; line < 480; line++)
13
{
14
    for (col = 0; col < 640; col++)
15
    {
16
  screenBufferIndex = (line / 8) * 80 + (col /8);
17
  tileBuffer0LineOffset = line % 8;
18
  tileBuffer0Col = col % 8;
19
  tileBuffer0Index = screenBuffer[screenBufferIndex] * 64 + (tileBuffer0LineOffset * 8) + tileBuffer0Col;
20
  pixelLine[col] = tileBuffer0[tileBuffer0Index];
21
    }
22
}
23
24
int timerValue = TIM_GetCounter(TIM1);
jawohl eindeutig mehr Zeit als 5,9ns benötigt.
Als ich Timer2 ausprobiert habe, habe ich ihn auch mal auf 1 Sekunde 
eingestellt (prescaler = 42000-1; period = 2000-1;) da war timerValue 
dann 303... alles sehr komisch...

von X2 (Gast)


Lesenswert?

Ohne deine Initialisierung kann hier wohl keiner was dazu sagen, ich 
glaube du hast den Timer/ Clocks/ Prescaler falsch konfiguriert...

von MajorMoritz (Gast)


Lesenswert?

Moin,
1
#define CORE_SysTickEn()    (*((u32*)0xE0001000)) = 0x40000001
2
#define CORE_SysTickDis()   (*((u32*)0xE0001000)) = 0x40000000
3
#define CORE_GetSysTick()   (*((u32*)0xE0001004))


damit müsste es gehen.

Moritz

von Uwe B. (derexponent)


Lesenswert?

Paul schrieb:
>mit prescaler 1 und period 1


und wie hoch denkst du, zählt ein "Counter" mit diesen Einstellungen ?!?
(versuchs mal Prescale=1, Period=65000)


Gruss

: Bearbeitet durch User
von MajorMoritz (Gast)


Lesenswert?

PS: Der SysTick misst wie viele Clock Cyles vom beginn duchgelaufen 
sind. Also so:
1
CORE_SysTickEn();
2
uint32_t t1 = CORE_GetSysTick();
3
for...
4
...
5
...
6
uint32_t t2 = CORE_GetSysTick();
7
uint32_t dt = t2 - t1;

Moritz

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.