CooCox IDE debugging STM32F4Discovery

Gast #3495754
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
#3495826
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
}
Gast #3505932
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...
Gast #3506231
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
Gast #3506238
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren